Как решать однородные линейные уравнения с помощью NumPy?

StackOverflow https://stackoverflow.com/questions/1835246

  •  11-09-2019
  •  | 
  •  

Вопрос

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

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

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

РЕДАКТИРОВАТЬ

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

Это было полезно?

Решение

Вы можете использовать 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]])

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

Другие советы

В этом отношении лучшим решением однородной линейной системы с ограничениями является собственный вектор, связанный с наименьшим собственным значением.Итак, учитывая 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)] 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top