Publicado em março/2020
Para executar as operações matemáticas e plotar os vetores apresentadas a seguir foram utilizadas as bibliotecas NumPy (Numerical Python) e Matplotlib (geração de gráficos).
Definidas por um únicos valor númerico, usualmente associado a uma unidade de medida, como massa, comprrimento ou tempo.
Além da magnitude (módulo, tamanho ou norma), necessitam de direção e sentido para serem definidos. Com três dimensões podemos definir um ponto no espaço, por exemplo, mas vetores podem ter N dimensões, sendo de forma geral um conjunto de escalares.
=(x1,x2, ... , xn)
=(y1,y2, ... , yn)
+
=(x1+y1,x2+y2, ... , xn+yn)
-
=(x1-y1,x2-y2, ... , xn+yn)
=(x1,x2, ... , xn)
=(y1,y2, ... , yn)
=(x1⋅y1+x2⋅y2+ ... +xn⋅yn)
A figura a seguir disponível em https://pt.wikipedia.org/wiki/Produto_vetorial ilustra de forma bem clara o conceito de produto vetorial.
Interessante observar que o comprimento do vetor resultante do produto vetorial entre dois vetores é a área do paralelogramo definido por estes vetores ( no caso de produto misto resulta no volume do paralelepípedo formado pelos três vetores).
Para calcular o produto vetorial de forma computacional basta obter o determinante da matriz composta pelos 2 vetores juntamente com os respectivos vetores unitários em cada direção:
É um número real que representa o comprimento do vetor.
A seguir a função Python criada para efetuar os cálculo e retornar os valores para o template Django:
def algebraLinearVetores(request):
if request.method == 'POST':
matplotlib.use('Agg')
x1 = float(request.POST.get('a'))
y1 = float(request.POST.get('b'))
x2 = float(request.POST.get('c'))
y2 = float(request.POST.get('d'))
cols = (['#00FFFF'], ['#87CEFA'], ['#90EE90'], ['#FF7F50'])
nomes = ('a', 'b', 'a+b', 'a-b')
# VETORES A E B
vetor_a = np.array([x1,y1])
vetor_b = np.array([x2,y2])
# SOMA E SUBTRAÇÃO
soma = vetor_a + vetor_b
sub = vetor_a - vetor_b
# PRODUTO ESCALAR
produto_escalar = vetor_a.dot(vetor_b)
# MÓDULO
modulo_a = np.linalg.norm(vetor_a)
modulo_b = np.linalg.norm(vetor_b)
# VETOR UNITÁRIO
ua = vetor_a/np.linalg.norm(vetor_a)
ub = vetor_b / np.linalg.norm(vetor_b)
# ANGULO ENTRE OS VETORES
angulo=(180/np.pi)*(np.arccos(produto_escalar/(modulo_a*modulo_b)))
# ANGULO PARA O EIXO X PARA A NOTAÇÃO POLAR
angulo_a = (180 / np.pi) * (np.arccos(vetor_a.dot([1,0]) / (modulo_a * np.linalg.norm([1,0]))))
if -1*vetor_a[1]>0: angulo_a = 360-angulo_a
angulo_b = (180 / np.pi) * (np.arccos(vetor_b.dot([1, 0]) / (modulo_b * np.linalg.norm([1, 0]))))
if -1 * vetor_b[1] > 0: angulo_b = 360 - angulo_b
vetores = (vetor_a, vetor_b, soma, sub)
# MAXIMO E MINIMO DOS EIXOS
max_x = max(np.concatenate([vetor_a[0], vetor_b[0], soma[0], sub[0]], axis=None))
max_y = max(np.concatenate([vetor_a[1], vetor_b[1], soma[1], sub[1]], axis=None))
min_x = min(np.concatenate([vetor_a[0], vetor_b[0], soma[0], sub[0]], axis=None))
min_y = min(np.concatenate([vetor_a[1], vetor_b[1], soma[1], sub[1]], axis=None))
if max_x > 0 and min_x > 0: min_x = 0
if max_x < 0 and min_x < 0: max_x = 0
if max_y > 0 and min_y > 0: min_y = 0
if max_y < 0 and min_y < 0: max_y = 0
plt.title("SOMA E SUBTRAÇÃO DE VETORES")
plt.xlim(min_x - 0.2, max_x + 0.2)
plt.ylim(min_y - 0.2, max_y + 0.2)
plt.grid(b=True, which='major', axis='both', color='808080', ls=':', lw=0.2)
plt.axvline(x=0, color='#808080', zorder=0, lw=0.3)
plt.axhline(y=0, color='#808080', zorder=0, lw=0.3)
for i in range(len(vetores)):
x = np.concatenate([[0, 0], vetores[i]])
plt.quiver([x[0]], [x[1]], [x[2]], [x[3]], angles='xy', scale_units='xy', scale=1, color=cols[i],
label=nomes[i], alpha=None)
plt.legend(loc=0, framealpha=0.01)
imagem_buffer = io.BytesIO()
plt.savefig(imagem_buffer, format="png")
plt.cla() # Clear axis
plt.clf() # Clear figure
plt.close() # Close a figure window
image = base64.b64encode(imagem_buffer.getvalue()).decode('ascii')
return render(request, 'algebraLinearVetores.html', {'image': image,
'a': str(round(vetor_a[0],2)),
'b': str(round(vetor_a[1],2)),
'c': str(round(vetor_b[0],2)),
'd': str(round(vetor_b[1],2)),
'e': str(round(soma[0],2)),
'f': str(round(soma[1],2)),
'g': str(round(sub[0],2)),
'h': str(round(sub[1],2)),
'i': str(round(produto_escalar, 2)),
'j': str(round(modulo_a, 2)),
'k': str(round(modulo_b, 2)),
'l': str(round(angulo, 2)),
'm': str(round(angulo_a, 2)),
'n': str(round(angulo_b, 2)),
'o': str(round(ua[0], 2)),
'p': str(round(ua[1], 2)),
'q': str(round(ub[0], 2)),
'r': str(round(ub[1], 2)),
})
else:
return render(request, 'algebraLinearVetores.html')
<img style="max-width : 450px" src="data:image/png;base64,{{ image }}"/>