代码之家  ›  专栏  ›  技术社区  ›  faceclean

如何用numpy解齐次线性方程组?

  •  4
  • faceclean  · 技术社区  · 16 年前

    如果我有这样的齐次线性方程

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

    我想得到一个非零解。怎么做呢 NumPy ?

    编辑

    solve只适用于a*x=b,其中b不包含0。

    2 回复  |  直到 10 年前
        1
  •  6
  •   Rufflewind    10 年前

    您可以使用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 在维基百科上。

        2
  •  3
  •   Sasha Nicolas    10 年前

    因此,过约束齐次线性系统的最佳解是与最小特征值相关的特征向量。因此,给定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)]