【发布时间】:2015-09-24 05:08:13
【问题描述】:
我不太明白为什么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) 给出了更精确的结果。为什么是这样?
究竟发生了什么使得一个“工作得更好”比另一个?
【问题讨论】:
-
最好拿起一本教科书。 Golub 和 van Loan 将是一个不错的选择。
-
只是一个猜测(可能来自 Gilbert Strang Books 的某处):我认为在调用底层 LAPACK 例程期间从未真正计算过逆。如果您尝试 pinv() 而不是 inv() 怎么办?看pinv()的引用
-
在大多数情况下,线性方程解法比反演和乘法更快,产生的舍入误差更小。从根本上说,这些是对“浮动”数字表示的操作,而不是实数本身。
-
知道pinv与solve的比较会很有趣
-
你几乎从不想计算一个矩阵的逆......它效率低下,而且误差通常高于其他方法。
标签: python arrays numpy matrix linear-algebra