我有一个平方单数系统A和向量B,该系统位于A的范围空间中。因为B在A的范围空间,并且A是单数的,因此有很多解决方案。现在我想要的是AX = B的一些解决方案,不一定是最小规范。由于我的系统A很大,我想避免基于SVD的解决方案(查找伪逆)。我正在考虑简单地进行lu分解并将自由变量设置为0,但是当我奇异时,我尝试的所有方法都无法给我解决方案。
我尝试过scipy.linalg.solve,但这需要系统是非单一的。我还尝试了scipy lu_factor和lu_solve,但是在做lu_factor时,它给了我运行时警告,说" 对角数%d完全零。使用b的lu分解为b,在A的范围内,一种方法(使用scipy)在A的范围内找到了对单数系统的解决方案。非常感谢。
尝试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]])
您可以为您的任务尝试所有这些迭代垫圈。由于我不是这些奇异系统的专家,所以我只是提到了一些链接,并显示了一个小例子:
使用LSQR代码(虽然调整为稀疏应用程序):
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.]
- 关于该主题的整个论文:
- 奇特的迭代方法线性方程和最小二乘问题(Sou-cheng(Terrya)choi)
- 解决不良条件和奇异线性系统:正规化教程
- 在Math.stackexchange上进行了一些讨论,建议解决:
AtAx = Atb
通常我会推荐linalg.lstsq,但它可能是您不想要的基于SVD的解决方案之一,尽管该解决方案已对密集情况进行了高度优化。