如何用NumPy求解齐次线性方程?

时间:2009-12-02 19:28:39

标签: math 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。

2 个答案:

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