# 例
import numpy as np
A = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 0],
])
# 第1行、第1列を除いたA_11行列
A11 = A[1:, 1:]
# 余因子
(-1)**(1 + 1) * np.linalg.det(A11)-47.999999999999986余因子展開(ラプラス展開)¶
次正方行列の行列式は、任意の行や列についての要素と余因子の重み付き和として展開できる。
第行に関する余因子展開:
第列に関する余因子展開:
これを余因子展開(cofactor expansion)やラプラス展開(Laplace expansion)という。
# 例
import numpy as np
A = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
])
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_expansion_along_i(A, i):
"""第i行に関する余因子展開による行列式の計算"""
result = 0
for j in range(A.shape[1]):
result += A[i, j] * cofactor(A, i=i, j=j)
return result
(cofactor_expansion_along_i(A, i=0) - np.linalg.det(A)) < 1e-3Truedef 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
A_tilde = cofactor_matrix(A)
A_tildearray([[-48., 24., -3.],
[ 42., -21., 6.],
[ -3., 6., -3.]], dtype=float32)# i != k
def cofactor_expansion_not_along_i(A, i, k):
result = 0
for j in range(A.shape[1]):
print(f"A[{i}, {j}] = {A[i, j]}")
print(f"cofactor(A, i={k}, j={j}) = {cofactor(A, i=k, j=j)}")
result += A[i, j] * cofactor(A, i=k, j=j)
return result
round(cofactor_expansion_not_along_i(A, i=0, k=1), 3)A[0, 0] = 1
cofactor(A, i=1, j=0) = 23.999999999999993
A[0, 1] = 2
cofactor(A, i=1, j=1) = -21.0
A[0, 2] = 3
cofactor(A, i=1, j=2) = 6.0
-0.0print(f"det(A) = {np.linalg.det(A):.0f}")
print(f"A @ A_tilde: \n{A @ A_tilde}")det(A) = 27
A @ A_tilde:
[[27. 0. 0.]
[ 0. 27. 0.]
[ 0. 0. 27.]]
より