为什么numpy.linalg.solve()提供比numpy.linalg.inv()更精确的矩阵反转?

Sha*_*ang 23 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)求解A*x=bx 的等式,即x = A^{-1} * b.因此,我可以通过求解这个等式

(1)

inverse = numpy.linalg.inv(C)
result = inverse * d
Run Code Online (Sandbox Code Playgroud)

或(2)

numpy.linalg.solve(C, d)
Run Code Online (Sandbox Code Playgroud)

方法(2)给出了更精确的结果.为什么是这样?

究竟发生了什么,使一个"比另一个更好"?

ali*_*i_m 35

np.linalg.solve(A, b)没有计算的逆一个.相反,它调用一个gesvLAPACK例程,它首先使用LU分解来分解A,然后使用向前和向后替换来解决x(参见此处).

np.linalg.inv使用相同的方法来计算的逆通过求解-1A·甲-1 = I,其中是单位*.因子分解步骤与上面完全相同,但是需要更多的浮点运算来求解A -1(n×n矩阵)而不是x(n- long向量).此外,如果您希望通过标识A -1 ·b = x获得x,那么额外的矩阵乘法将导致更多浮点运算,因此性能降低,数值误差更大.

不需要计算A -1的中间步骤- 直接获得x更快更准确.


*源的相关位inv在这里.不幸的是,理解起来有点棘手,因为它是模板化的C.需要注意的重要一点是,身份矩阵作为参数传递给LAPACK求解器B.