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

Why does numpy.linalg.solve() offer more precise matrix inversions than numpy.linalg.inv()?

我不太明白为什么 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) 给出了更精确的结果。为什么是这样?

到底发生了什么,一个 "works better" 比另一个?

np.linalg.solve(A, b) 而不是 计算 A 的倒数。相反,它调用 gesv LAPACK routines, which first factorizes A using LU decomposition, then solves for x using forward and backward substitution (see here).

之一

np.linalg.inv 使用相同的方法通过求解 A-1[=48= 来计算 A 的倒数] in A·A-1 = I 其中 I 是恒等式* .因式分解步骤与上面完全相同,但需要更多的浮点运算来解决A-1(一个 n×n 矩阵)比 xn 长向量)。此外,如果您随后想通过身份 A-1·b = x 获得 x 那么额外的矩阵乘法会导致更多的浮点运算,因此会降低性能并增加数值错误。

不需要计算A-1的中间步骤-得到[=25=更快更准确]x 直接.


* inv 的相关源位是 here。不幸的是,它有点难以理解,因为它是模板化的 C。需要注意的重要一点是单位矩阵作为参数 B.

传递给 LAPACK 求解器