Como resolver equações lineares homogêneas com NumPy?
Pergunta
Se eu tiver equações lineares homogêneas como este
array([[-0.75, 0.25, 0.25, 0.25],
[ 1. , -1. , 0. , 0. ],
[ 1. , 0. , -1. , 0. ],
[ 1. , 0. , 0. , -1. ]])
E eu quero para obter uma solução diferente de zero para ele. Como isso pode ser feito com NumPy ?
Editar
linalg.solve só funciona em A * x = b, onde b não contém apenas 0.
Solução
Você pode usar um SVD ou uma decomposição QR para calcular o espaço nulo do sistema linear, por exemplo, algo como:
import numpy
def null(A, eps=1e-15):
u, s, vh = numpy.linalg.svd(A)
null_space = numpy.compress(s <= eps, vh, axis=0)
return null_space.T
Isto dá para o seu exemplo:
>>> A
matrix([[-0.75, 0.25, 0.25, 0.25],
[ 1. , -1. , 0. , 0. ],
[ 1. , 0. , -1. , 0. ],
[ 1. , 0. , 0. , -1. ]])
>>> null(A).T
array([[-0.5, -0.5, -0.5, -0.5]])
>>> (A*null(A)).T
matrix([[ 1.66533454e-16, -1.66533454e-16, -2.22044605e-16, -2.22044605e-16]])
Veja também a seção computação numérica de espaço nulo na Wikipedia.
Outras dicas
Para essa matéria, a melhor solução de um sistema linear homogêneo ao longo restrito é o autovetor associado com o menor valor próprio. Assim, dado U como a matriz de coeficientes do sistema, a solução é a seguinte:
import numpy as np
def solution(U):
# find the eigenvalues and eigenvector of U(transpose).U
e_vals, e_vecs = np.linalg.eig(np.dot(U.T, U))
# extract the eigenvector (column) associated with the minimum eigenvalue
return e_vecs[:, np.argmin(e_vals)]
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow