为什么numpy.linalg.solve()比numpy.linalg.inv()提供更精确的矩阵求逆?

我不太明白为什么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的逆。相反,它调用一个gesvLAPACK例程,该例程首先使用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解算器

发表评论