Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用lu分解法求解奇异方阵的几点体会?_Python_Scipy_Linear Algebra_Matrix Factorization - Fatal编程技术网

Python 用lu分解法求解奇异方阵的几点体会?

Python 用lu分解法求解奇异方阵的几点体会?,python,scipy,linear-algebra,matrix-factorization,Python,Scipy,Linear Algebra,Matrix Factorization,我有秩亏(秩=9)的奇异矩阵A(10*10)和A的范围空间中的向量b。现在我对Ax=b的一些解感兴趣。对于具体性,这里是我的A array([[ 0. , 0. , 0. , 0.86826141, 0. , 0. , 0.88788426, 0. , 0.4089203 , 0.88134901], [ 0. , 0.

我有秩亏(秩=9)的奇异矩阵A(10*10)和A的范围空间中的向量b。现在我对Ax=b的一些解感兴趣。对于具体性,这里是我的A

array([[ 0.        ,  0.        ,  0.        ,  0.86826141,  0.        ,
             0.        ,  0.88788426,  0.        ,  0.4089203 ,  0.88134901],
           [ 0.        ,  0.        ,  0.46416372,  0.        ,  0.        ,
             0.        ,  0.        ,  0.        ,  0.        ,  0.        ],
           [ 0.        ,  0.        ,  0.        ,  0.        ,  0.31303966,
             0.        ,  0.        ,  0.        ,  0.        ,  0.        ],
           [ 0.        ,  0.        ,  0.        ,  0.        ,  0.        ,
             0.        ,  0.3155742 ,  0.        ,  0.64059294,  0.        ],
           [ 0.        ,  0.        ,  0.        ,  0.        ,  0.51349938,
             0.        ,  0.        ,  0.        ,  0.53593509,  0.        ],
           [ 0.        ,  0.01252787,  0.        ,  0.6870415 ,  0.        ,
             0.        ,  0.        ,  0.        ,  0.        ,  0.        ],
           [ 0.        ,  0.        ,  0.        ,  0.        ,  0.        ,
             0.        ,  0.        ,  0.        ,  0.        ,  0.        ],
           [ 0.        ,  0.        ,  0.        ,  0.16643105,  0.        ,
             0.        ,  0.        ,  0.        ,  0.        ,  0.        ],
           [ 0.08626592,  0.        ,  0.        ,  0.        ,  0.        ,
             0.        ,  0.        ,  0.        ,  0.        ,  0.66939531],
           [ 0.43694586,  0.        ,  0.        ,  0.        ,  0.        ,
             0.95941661,  0.        ,  0.52936733,  0.79687149,  0.81463887]])
b是使用
A.dot(np.ones(10))
生成的。现在我想用lu分解来解决这个问题,为此我做了如下工作

lu_fac=scipy.linalg.lu_factor(X)
scipy.linalg.lu_solve(lu_fac,b)

array([ nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan])
此外,lu_因子在这种情况下似乎工作正常(有时它会发出运行时警告,说“对角线数%d正好为零。奇异矩阵”)。为完整起见,这里是验证lu_系数的PLU与A相同的代码:

L=np.tril(lu_fac[0])
np.fill_diagonal(L,1)
U=np.triu(lu_fac[0])
perm=np.arange(10)
ipiv=lu_factor[1]
for i in range(10):
  temp=perm[i]
  perm[i]=perm[ipiv[i]]
  perm[ipiv[i]]=temp
np.allclose(X[perm,:],L.dot(U))
现在我知道我的矩阵是奇异的,我的问题有无穷多个解。但我对任何解决方案都感兴趣,我只是搞不明白为什么lu分解失败,它不能将变量设置为0,并按照我们所教的那样找到一些解决方案吗?另外,运行时警告“对角线数%d正好为零。奇异矩阵”的处理方法是什么。注:我对解决这个问题的svd/qr方法不感兴趣,我只是想知道为什么lu对奇异矩阵不起作用。如有任何建议,我们将不胜感激。谢谢。

如前所述,矩阵具有LU分解当且仅当
秩(A11)+k>=秩([A11 A12])+秩([A11 A21])
。在您的情况下,
rank(A11)=3
k=5
, 和
rank([A11 A12])+rank([A11 A21])=9
。所以你的矩阵不满足条件,也没有LU分解

0 / lu_fac[0][9, 9]
返回
nan
,因为该条目(U的最后一个对角线条目)为零。因此,这个
nan
成为第9个变量的值。然后在上面的方程式中进行替换,剩下的自然也会变成
nan
。SciPy的LU代码,或者说它包装的Fortran代码,不是为秩亏矩阵设计的,因此它不会为无法确定的变量补值

另外,运行时警告“对角线数%d正好为零。奇异矩阵”的处理方法是什么

警告很明显:算法检测到奇异矩阵,这不是预期的。它还告诉您,该实现不适用于奇异矩阵

有向量b,它在A的范围空间中

这是理论上的。在实践中,由于浮点算法固有的错误,人们无法确定秩亏矩阵的范围空间中是否有任何内容。您可以计算
b=A.dot(…)
,然后尝试求解Ax=b,因为在处理浮点数时引入了错误,所以不会有解决方案

顺便说一句:您提到每个平方矩阵都存在PLU分解,但SciPy不一定是用来计算它的。比如说,

scipy.linalg.lu_factor(np.array([[0, 1], [0, 0]]))

返回带有NaN的矩阵。在您的情况下,NaN将在稍后出现,当您试图找到解决方案时,遇到因子U的零对角元素。

谢谢您的回答。但是lu_因子做PLU分解,这是一直存在的。我还验证了我从lu_因子得到的PLU和A是一样的,所以不是这样。做lu_解决问题时,事情失败了。再次感谢。这是否意味着对于奇异矩阵不建议使用LU?如果我理解正确,问题是不知道什么是0或接近零?非常感谢。LU用于精确求解一个系统,而用奇异矩阵来求解是错误的。这与涉及正交分解的方法相反,正交分解提供了一种基于平方和最小化的稳健方法。