numpy.linalg.inv#

linalg.inv(a)[原始碼]#

計算矩陣的反矩陣。

給定一個方陣 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

計算矩陣的奇異值分解。

註解

廣播規則適用,詳細資訊請參閱 numpy.linalg 文件。

如果偵測到 a 為奇異矩陣,則會引發 LinAlgError。如果 a 的條件不良,則可能會或可能不會引發 LinAlgError,且結果可能因浮點錯誤而不準確。

參考文獻

[1]

Wikipedia, “條件數”, 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