我正在尝试使用QR分解和linalg.solve解决一个超定系统,但是我得到的错误是
LinAlgError:数组的最后2个尺寸必须为正方形。
当R数组不是正方形时会发生这种情况,对吗?代码看起来像这样
import numpy as np
import math as ma
A = np.random.rand(2,3)
b = np.random.rand(2,1)
Q, R = np.linalg.qr(A)
Qb = np.matmul(Q.T,b)
x_qr = np.linalg.solve(R,Qb)
有没有一种方法可以针对任意A维以更有效的方式编写此代码?如果没有,如何使此代码段正常工作?
答案 0 :(得分:1)
原因确实是矩阵R
不是正方形,可能是因为系统超定的缘故。您可以尝试使用np.linalg.lstsq
代替,找到使平方误差最小的解决方案(如果存在,则应产生确切的解决方案)。
import numpy as np
import math as ma
A = np.random.rand(2,3)
b = np.random.rand(2,1)
Q, R = np.linalg.qr(A)
Qb = np.matmul(Q.T,b)
x_qr = np.linalg.lstsq(R,Qb)
答案 1 :(得分:1)
您需要使用标志mode ='reduced'呼叫QR。默认的Q R矩阵返回为M x M和M x N,因此,如果M大于N,则矩阵R将为非平方。如果选择简化(经济)模式,则矩阵将为M x N和N x N,在这种情况下,求解例程将正常工作。
但是,对于超定系统,您还会向后方程式/未知数。您的代码段应为
import numpy as np
A = np.random.rand(3,2)
b = np.random.rand(3,1)
Q, R = np.linalg.qr(A, mode='reduced')
#print(Q.shape, R.shape)
Qb = np.matmul(Q.T,b)
x_qr = np.linalg.solve(R,Qb)
如其他贡献者所述,您也可以直接调用lstsq,但有时直接使用Q和R更为方便(例如,如果您还计划计算投影矩阵)。
答案 2 :(得分:0)
如numpy.linalg.solve
的文档中所示:
计算确定的(即满秩的线性矩阵方程ax = b)的“精确”解x。
您的方程组underdetermined并未被确定。请注意,其中包含3个变量和2个方程式,因此方程式比未知数少。
还要注意它还提到在numpy.linalg.solve(a,b)
中,a
必须是一个MxM
矩阵。其背后的原因是求解方程Ax=b
的系统涉及计算A
的逆,并且只有平方矩阵是可逆的。
numpy.linalg.lstsq
:
x_qr = np.linalg.lstsq(R,Qb)