Estou tentando usar o Scipy para cálculo de vetores ortogonais:
import numpy as np
from scipy import linalg
e1 = np.float16([-0.913, -0.4072]).reshape(2,1)
e2 = linalg.orth(e1)
print(f'e_1 {e1} ,'
f' ortogonal e2 is {e2}')
Eu esperava que a saída fosse:
e2 is [[-0.4072] [0.913]]
Eu verifiquei, por: 0,913 * -0,4072 + (-0,4072)*0,913 = 0
Mas receba:
e2 is [[-0.913] [-0.4072 ]]
O que estou fazendo errado?
Leia a documentação . A função que você está chamando não calcula um vetor ortogonal para um dado vetor, mas uma base ortonormal de um dado conjunto de vetores. Você está dando a ele um vetor normalizado, então você está apenas recebendo o mesmo vetor de volta.
Se estiver apenas em um plano de um único vetor não nulo, você não precisa de scipy, pois (b, -a) é sempre ortogonal a (a, b). Caso contrário, pode haver uma solução, nenhuma solução ou múltiplas soluções. A função
linalg.null_space(e1.T)
fornece a base ortonormal de todos os possíveis "vetores ortogonais" aqui, ou seja, espaço nulo. Observe a transposição.