gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:27:37 104 4
gpt4 key购买 nike

我不太明白为什么 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/

104 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com