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.

Foi útil?

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
scroll top