逆行列とは
$$
A X = I
$$
上式を満たす、Xがあれば、Xは逆行列と呼ぶ。
Aの逆行列は、\(A-{−1}\)と表す。
$$
A A ^ { – 1 } = A ^ { – 1 } A = I
$$
逆行列は、全てに存在するとは限りません。
逆行列が存在する正方行列(n行n列行列)を、正則行列と呼びます。
存在しない正方行列を、非正則行列または、特異行列と呼びます。
逆行列をPythonで求める
逆行列をPythonで求めるには、numpyのnp.linalg.inv()を使用します。
import numpy as np np.linalg.inv()
プログラム
import numpy as np arr = np.array([[1, 2], [3, 4]]) print("行列A = \n", arr) arr_inv = np.linalg.inv(arr) print("逆行列A = \n", arr_inv)
出力値
特異値分解で逆行列を求める
$$
\Large
M = U \Sigma V ^ { * }
$$
$$
A = U \Sigma V ^ { T } \Longrightarrow A ^ { + } = V \Sigma ^ { + } U ^ { T }
$$
import numpy as np arr = np.array([[1, 2], [3, 4]]) print("行列A = \n", arr) U, s, V = np.linalg.svd(arr, full_matrices=True) sp = 1/s sp = np.diag(sp) sp U = np.conj(U).T V = np.conj(V).T arr_invs = np.dot(np.dot(V,sp), U) print("逆行列A = \n", arr_invs) np.dot(arr, arr_invs)
擬似逆行列をPythonで求める
import numpy as np arr = np.array([[1, 1], [1, 1]]) print("行列A = \n", arr) arr_pinv = np.linalg.pinv(arr) print("逆行列A = \n", arr_pinv)
C++で掃き出し法
# C++ //単位行列を作る for(i=0;i<n;i++){ for(j=0;j<n;j++){ inv_a[i][j]=(i==j)?1.0:0.0; } } //掃き出し法 for(i=0;i<n;i++){ buf=1/a[i][i]; for(j=0;j<n;j++){ a[i][j]*=buf; inv_a[i][j]*=buf; } for(j=0;j<n;j++){ if(i!=j){ buf=a[j][i]; for(k=0;k<n;k++){ a[j][k]-=a[i][k]*buf; inv_a[j][k]-=inv_a[i][k]*buf; } } } }