我不太清楚为什么numpy.linalg.solve()
会给出更精确的答案,而numpy.linalg.inv()
会有所分解,给出(我相信的)估计值。
对于具体示例,我正在求解等式C^{-1} * d
,其中C
表示矩阵,d
是向量数组。为了便于讨论,C
的维度为(1000,1000)
形状,d
为形状(1,1000)
。
numpy.linalg.solve(A, b)
解决了x的等式A*x=b
,即x = A^{-1} * b.
因此,我可以通过
(1)
inverse = numpy.linalg.inv(C)
result = inverse * d
或(2)
numpy.linalg.solve(C, d)
方法(2)给出了更精确的结果。为什么是这样?
究竟发生了什么,以便一个人能够更好地工作"比另一个?
答案 0 :(得分:32)
np.linalg.solve(A, b)
不计算 A 的倒数。相反,它会调用其中一个gesv
LAPACK routines,它首先使用LU分解来解析 A ,然后使用前向和后向替换来解析 x (请参阅here )。
np.linalg.inv
使用相同的方法通过求解 A中的 A -1 来计算 A 的逆矩阵·A -1 = I 其中 I 是身份*。因子分解步骤与上述完全相同,但需要更多的浮点运算来解决 A -1 ( n×n 矩阵)而不是 x (一个 n - 长矢量)。另外,如果你想通过标识 A -1 ·b = x 获得 x ,那么额外的矩阵乘法会产生更多浮动点操作,因此性能降低,数值误差更大。
不需要计算 A -1 的中间步骤 - 直接获取 x 更快,更准确。
* inv
的相关位源为here。不幸的是,理解它有点棘手,因为它是模板化的C.需要注意的重要一点是,身份矩阵作为参数B
传递给LAPACK求解器。