numpy.linalg.inv#

linalg.inv(a)[source]#

计算矩阵的逆矩阵。

给定一个方阵 a,返回满足 a @ ainv = ainv @ a = eye(a.shape[0]) 的矩阵 ainv

参数:
a(…, M, M) array_like

要反转的矩阵。

返回:
ainv(…, M, M) ndarray 或 matrix

矩阵 a 的逆矩阵。

引发:
LinAlgError

如果 a 不是方阵或反转失败。

另请参阅

scipy.linalg.inv

SciPy 中的类似函数。

numpy.linalg.cond

计算矩阵的条件数。

numpy.linalg.svd

计算矩阵的奇异值分解。

注释

版本 1.8.0 中的新功能。

广播规则适用,有关详细信息,请参阅 numpy.linalg 文档。

如果检测到 a 为奇异矩阵,则会引发 LinAlgError。如果 a 条件很差,则可能会或可能不会引发 LinAlgError,并且由于浮点错误,结果可能不准确。

参考文献

[1]

维基百科,“条件数”,https://en.wikipedia.org/wiki/Condition_number

示例

>>> import numpy as np
>>> from numpy.linalg import inv
>>> a = np.array([[1., 2.], [3., 4.]])
>>> ainv = inv(a)
>>> np.allclose(a @ ainv, np.eye(2))
True
>>> np.allclose(ainv @ a, np.eye(2))
True

如果 a 是一个矩阵对象,则返回值也是一个矩阵

>>> ainv = inv(np.matrix(a))
>>> ainv
matrix([[-2. ,  1. ],
        [ 1.5, -0.5]])

可以一次计算多个矩阵的逆矩阵

>>> a = np.array([[[1., 2.], [3., 4.]], [[1, 3], [3, 5]]])
>>> inv(a)
array([[[-2.  ,  1.  ],
        [ 1.5 , -0.5 ]],
       [[-1.25,  0.75],
        [ 0.75, -0.25]]])

如果矩阵接近奇异矩阵,即使没有引发 LinAlgError,计算出的逆矩阵也可能不满足 a @ ainv = ainv @ a = eye(a.shape[0])

>>> a = np.array([[2,4,6],[2,0,2],[6,8,14]])
>>> inv(a)  # No errors raised
array([[-1.12589991e+15, -5.62949953e+14,  5.62949953e+14],
   [-1.12589991e+15, -5.62949953e+14,  5.62949953e+14],
   [ 1.12589991e+15,  5.62949953e+14, -5.62949953e+14]])
>>> a @ inv(a)
array([[ 0.   , -0.5  ,  0.   ],  # may vary
       [-0.5  ,  0.625,  0.25 ],
       [ 0.   ,  0.   ,  1.   ]])

要检测条件很差的矩阵,可以使用 numpy.linalg.cond 计算其条件数 [1]。条件数越大,矩阵的条件越差。根据经验,如果条件数 cond(a) = 10**k,则除了由于算术方法导致的精度损失而导致的数值方法损失之外,您最多可能会损失 k 位精度。

>>> from numpy.linalg import cond
>>> cond(a)
np.float64(8.659885634118668e+17)  # may vary

也可以通过直接检查矩阵的奇异值来检测条件很差的情况。最大奇异值与最小奇异值之间的比率是条件数

>>> from numpy.linalg import svd
>>> sigma = svd(a, compute_uv=False)  # Do not compute singular vectors
>>> sigma.max()/sigma.min()
8.659885634118668e+17  # may vary