为什么 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 矩阵)比 x(n 长向量)。此外,如果您随后想通过身份 A-1·b = x 获得 x 那么额外的矩阵乘法会导致更多的浮点运算,因此会降低性能并增加数值错误。
不需要计算A-1的中间步骤-得到[=25=更快更准确]x 直接.
* inv
的相关源位是 here。不幸的是,它有点难以理解,因为它是模板化的 C。需要注意的重要一点是单位矩阵作为参数 B
.
传递给 LAPACK 求解器
我不太明白为什么 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 矩阵)比 x(n 长向量)。此外,如果您随后想通过身份 A-1·b = x 获得 x 那么额外的矩阵乘法会导致更多的浮点运算,因此会降低性能并增加数值错误。
不需要计算A-1的中间步骤-得到[=25=更快更准确]x 直接.
* inv
的相关源位是 here。不幸的是,它有点难以理解,因为它是模板化的 C。需要注意的重要一点是单位矩阵作为参数 B
.