我不太明白为什么numpy.linalg.solve()
给出了更精确的答案,而numpy.linalg.inv()
给出了(我相信是)估计值
作为一个具体的例子,我正在求解方程C^{-1}*d
,其中C
表示矩阵,d
表示向量数组。为了便于讨论,C
的尺寸是形状(10001000)
,d
是形状(11000)
numpy.linalg.solve(A,b)
为x解方程A*x=b
,即x=A^{-1}*b。
因此,我可以通过
(一)
inverse=numpy.linalg.inv(C)
结果=逆*d
或(2)
numpy.linalg.solve(C,d)
方法(2)给出了更精确的结果。为什么会这样
到底发生了什么事情使得一个比另一个“工作得更好”
np.linalg.solve(A,b)
不计算A的逆。相反,它调用一个gesv
LAPACK例程,该例程首先使用LU分解分解A,然后使用向前和向后替换求解x(参见此处)
np.linalg.inv
使用相同的方法通过求解A-1中的A-1-1=I来计算A的逆,其中I是恒等式*。分解步骤与上面的步骤完全相同,但是对于A-1(一个n×n矩阵)要比x(一个n-长向量)需要更多的浮点运算。此外,如果您随后希望通过标识A-1·b=x获得x,则额外的矩阵乘法将产生更多的浮点运算,从而降低性能并产生更多的数值错误
无需计算A-1的中间步骤-直接获得x更快更准确
*inv
的相关源位在这里。不幸的是,理解起来有点棘手,因为它是模板化的C。需要注意的重要一点是,一个单位矩阵正在作为参数B
传递给LAPACK解算器