逆行列#
を満たす正方行列
また、
正則でない行列は 特異行列(singular matrix) という。
正則行列の条件#
正方行列
があり、分母が
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.]])
余因子行列と逆行列#
という関係がある。
なので、
となる。
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.]]
逆行列の計算規則#
定理
証明
逆行列の定義より
が成り立つことになる。これを満たすのは
定理
証明
左から掛けると
となる。よって
となるため、逆行列の定義より
である。
定理
定理
証明
の両辺の転置行列を考えると
転置の性質
となる。よって
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.]])