逆行列#

\(n\)次正方行列\(A\)に対し

\[ A^{-1}A = AA^{-1} = I \]

を満たす正方行列\(A^{-1}\)が存在するとき、\(A\)正則行列(regular matrix)可逆行列(invertible matrix) とよばれる。

また、\(A^{-1}\)\(A\)逆行列という。(\(I\)\(A\)と同じサイズの単位行列)

正則でない行列は 特異行列(singular matrix) という。

正則行列の条件#

正方行列\(A\)が正則行列であるための必要十分条件は\(\det(A) \neq 0\)である。

\(A\)の逆行列\(A^{-1}\)の計算方法の一つに

\[ A^{-1} = \frac{1}{ \det(A) } \tilde{A} \]

があり、分母が\(\det(A) \neq 0\)である必要がある。ここで\(\tilde{A}\)\(A\)の余因子行列である。

import numpy as np

A = np.array([
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 0],
])

def cofactor(A, i, j):
    """余因子を計算する関数"""
    A_minor = np.delete(A, i, axis=0)
    A_minor = np.delete(A_minor, j, axis=1)
    return (-1)**(i + j) * np.linalg.det(A_minor)

def cofactor_matrix(A):
    """余因子行列"""
    C = np.zeros_like(A, dtype=np.float32)
    for i in range(A.shape[0]):
        for j in range(A.shape[1]):
            C[i, j] = cofactor(A, i=i, j=j)
    return C.T

# det(A) != 0 かどうかを確認
print(f"det(A) = {np.linalg.det(A)}")

# 余因子行列の計算
A_adj = cofactor_matrix(A)
print(f"\n余因子行列 A_adj:\n{A_adj}")

# 逆行列
A_inv = (1 / np.linalg.det(A)) * A_adj
print(f"\n逆行列 A^-1:\n{A_inv.round(3)}")
det(A) = 27.0

余因子行列 A_adj:
[[-48.  24.  -3.]
 [ 42. -21.   6.]
 [ -3.   6.  -3.]]

逆行列 A^-1:
[[-1.778  0.889 -0.111]
 [ 1.556 -0.778  0.222]
 [-0.111  0.222 -0.111]]
# ちゃんと逆行列になっているか確認
(A_inv @ A).round(1)
array([[ 1.,  0.,  0.],
       [-0.,  1.,  0.],
       [ 0.,  0.,  1.]])

余因子行列と逆行列#

\(A\)\(n\)次正方行列、\(\tilde{A}\)\(A\)の余因子行列、\(I\)\(n\)次単位行列とすると

\[ A \tilde{A} = \tilde{A} A = \det(A) I \]

という関係がある。

なので、\(A\)が正則であれば

\[ \underbrace{ \frac{1}{\det(A)} \tilde{A} }_{A^{-1}} A = I \]

となる。

print(f"det(A) = {np.linalg.det(A):.0f}")
print(f"A_adj @ A: \n{A_adj @ A}")
det(A) = 27
A_adj @ A: 
[[27.  0.  0.]
 [ 0. 27.  0.]
 [ 0.  0. 27.]]

逆行列の計算規則#

\[ (A^{-1})^{-1} = A \]
\[ (AB)^{-1} = B^{-1} A^{-1} \]
\[ (A^k)^{-1} = (A^{-1})^k \]
import numpy as np

A = np.array([
    [1, 2],
    [3, 4],
])
B = A + 3
A_inv = np.linalg.inv(A)

A_inv @ B @ A
array([[-11., -16.],
       [ 15.,  22.]])