Как решить однородные линейные уравнения с NumPy? - PullRequest
5 голосов
/ 02 декабря 2009

Если у меня есть подобные однородные линейные уравнения

array([[-0.75,  0.25,  0.25,  0.25],
       [ 1.  , -1.  ,  0.  ,  0.  ],
       [ 1.  ,  0.  , -1.  ,  0.  ],
       [ 1.  ,  0.  ,  0.  , -1.  ]])

И я хочу получить ненулевое решение для этого. Как это можно сделать с NumPy ?

EDIT

linalg.solve работает только на A * x = b, где b не содержит только 0.

Ответы [ 2 ]

8 голосов
/ 03 декабря 2009

Вы можете использовать SVD или QR-разложение для вычисления нулевого пространства линейной системы, например, что-то вроде:

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

Это дает для вашего примера:

>>> 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]])

См. Также раздел Численное вычисление нулевого пространства в Википедии.

3 голосов
/ 04 февраля 2016

В этом отношении лучшим решением чрезмерно ограниченной однородной линейной системы является собственный вектор, связанный с наименьшим собственным значением. Таким образом, учитывая U в качестве матрицы коэффициентов системы, решение:

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)] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...