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

标签 python arrays numpy matrix linear-algebra

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

相关文章:

php - 如何将 SQL 查询结果更改为 superfish 下拉菜单?

python - 如何根据列中的所有或最后几个值检查数据框中的值是否满足条件并替换它?

python - Pandas 数据框对重复行执行计算

python - 如何使用 python 查找二元组的对数概率?

javascript - 从 JavaScript 数组打印值

python - Numpy(稀疏)重复索引增量

python - 对象成员的 Cython 缓冲区声明

python - 列表的平均值

python - 为什么输入数组在递归函数内部发生变化?

javascript - 在javascript中访问对象数组的值