如果我有像这样的均匀线性方程
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。
答案 0 :(得分:8)
您可以使用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]])
另见维基百科上的Numerical computation of null space部分。
答案 1 :(得分:3)
就此而言,过约束齐次线性系统的最佳解是与最小特征值相关联的特征向量。因此,将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)]