我不太明白为什么 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) 给出了更精确的结果。为什么是这样?
究竟发生了什么使得一个“工作得更好”比另一个?
最佳答案
np.linalg.solve(A, b)
不计算A的逆。相反,它调用 gesv
LAPACK routines 之一,它首先使用 LU 分解分解 A,然后使用前向和后向替换求解 x(参见 here)。
np.linalg.inv
使用相同的方法通过求解A-1来计算A的逆em> in A·A-1 = I 其中I 是身份*。分解步骤与上面完全相同,但需要更多的浮点运算来求解A-1(一个n×n矩阵) 而不是 x (一个 n-long 向量)。此外,如果您想通过身份 A-1·b = x 获得 x,那么额外的矩阵乘法将导致更多的 float 点操作,因此性能更慢,数值错误更多。
不需要计算A-1的中间步骤——直接得到x更快更准确。 p>
* inv
的相关源位是here .不幸的是,由于它是模板化的 C,因此有点难以理解。需要注意的重要一点是,单位矩阵作为参数 B
传递给 LAPACK 求解器。
关于python - 为什么 numpy.linalg.solve() 提供比 numpy.linalg.inv() 更精确的矩阵求逆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31256252/