求解方形奇异系统?

时间:2017-09-26 08:19:34

标签: python scipy linear-algebra

我有一个方形奇异系统A和向量b,它在A的范围空间中。因为b在A的范围空间中,A是奇异的,所以有无穷多个解。现在我想要的是Ax = b的一些解决方案,不一定是最小规范。由于我的系统A很大,我想避免基于svd的解决方案(找到伪逆)。我在考虑简单地进行LU分解并将自由变量设置为0,但是当A是单数时,我尝试的所有方法都没有给出解决方案。
我尝试过scipy.linalg.solve,但这要求系统是非单数的。我也尝试了scipy lu_factor和lu_solve但是在执行lu_factor时它给了我运行时警告说" 对角线数字%d正好为零。奇异矩阵。"
所以我的问题是这个 - 有没有办法(使用scipy)找到一个使用LU分解的奇异系统的解决方案,因为b在A的范围空间中。任何建议都非常感谢。非常感谢。

2 个答案:

答案 0 :(得分:0)

尝试scipy.linalg.lu()。它计算矩阵的旋转LU分解。

    import pprint
    import scipy
    import scipy.linalg   # SciPy Linear Algebra Library

    A = scipy.array([ [7, 3, -1, 2], [3, 8, 1, -4], [-1, 1, 4, -1], [2, -4, -1, 6] ])
    P, L, U = scipy.linalg.lu(A)

    print "A:"
    pprint.pprint(A)

    print "P:"
    pprint.pprint(P)

    print "L:"
    pprint.pprint(L)

    print "U:"
    pprint.pprint(U)

代码的输出如下:

   A:
   array([[ 7,  3, -1,  2],
          [ 3,  8,  1, -4],
          [-1,  1,  4, -1],
          [ 2, -4, -1,  6]])
   P:
   array([[ 1.,  0.,  0.,  0.],
          [ 0.,  1.,  0.,  0.],
          [ 0.,  0.,  1.,  0.],
          [ 0.,  0.,  0.,  1.]])
   L:
   array([[ 1.        ,  0.        ,  0.        ,  0.        ],
          [ 0.42857143,  1.        ,  0.        ,  0.        ],
          [-0.14285714,  0.21276596,  1.        ,  0.        ],
          [ 0.28571429, -0.72340426,  0.08982036,  1.        ]])
   U:
   array([[ 7.        ,  3.        , -1.        ,  2.        ],
          [ 0.        ,  6.71428571,  1.42857143, -4.85714286],
          [ 0.        ,  0.        ,  3.55319149,  0.31914894],
          [ 0.        ,  0.        ,  0.        ,  1.88622754]])

答案 1 :(得分:0)

您可以尝试所有这些迭代求解器来完成您的任务。由于我不是这些奇异系统的专家,我只提一些链接并展示一个小例子:

使用lsqr (tuned for sparse applications though)的代码:

import numpy as np
from scipy.sparse.linalg import lsqr

A = np.array([[0,0],[0,1]])
b = [1, 2]
x = lsqr(A, b)[0]
print(x)
# [ 0.  2.]

通常我会推荐linalg.lstsq,但它可能是您不想要的基于SVD的解决方案之一,尽管这个解决方案针对密集案例进行了高度优化。