我有一个方形奇异系统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的范围空间中。任何建议都非常感谢。非常感谢。
答案 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.]
AtAx = Atb
通常我会推荐linalg.lstsq,但它可能是您不想要的基于SVD的解决方案之一,尽管这个解决方案针对密集案例进行了高度优化。