Как решать однородные линейные уравнения с помощью NumPy?
Вопрос
Если у меня есть однородные линейные уравнения, подобные этому
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)]
Не связан с StackOverflow