np.linalgを使わず逆行列を求めたい。
Pythonを用いて正則行列Aの逆行列を求めるには、numpyを用いてnp.linalg.inv(A)と入力すれば
あっという間に出てきます。
しかしここではあえてその方法を用いず、基本変形を用いて逆行列を求めてみたいと思います。
まずは正則行列Aをひとつ定める。
例えば今回はAとして以下の様な行列をとることにします。
import numpy as np
A = np.array([[2.,1.,1.,1.],[3.,0.,-2.,1.],[0.,-1.,0.,-2.],[3.,1.,1.,1.]])
※行列の成分の数字を書くとき、3 などと書かずに3. のように書かないとその後の計算がうまくいきません。
因みに、以下の様に書くと軸の数が分かります。
A.ndim
次に単位行列を定義。
通常単位行列はEやIという記号を使って表しますが、ここではこの後この行列に色々操作を加えていくため、Xを使うことにします。
X = np.array([[1.,0.,0.,0.],[0.,1.,0.,0.],[0.,0.,1.,0.],[0.,0.,0.,1.]])
関数(写像)を定義。
では、正則行列Aをインプットするとその逆行列がアウトプットされる関数Inv(A)を実際に作っていきます。
import numpy as np
def Inv(A:list) -> list:
X = np.array([[1.,0.,0.,0.],[0.,1.,0.,0.],[0.,0.,1.,0.],[0.,0.,0.,1.]])
#まずAを上三角行列にする。
for p in range(len(A)):
pivot = A[p][p]
for j in range(p+1, len(A)):
coef = A[j][p] / pivot
A[j] -= A[p] * coef
X[j] -= X[p] * coef
#途中経過確認。
#print(A)
#print(X)
#対角成分を1にする。
for i in range(len(A)):
X[i] /= A[i][i]
A[i] /= A[i][i]
#途中経過確認。
#print(A)
#print(X)
#答えを出す。
for i in range(len(A)-1,0,-1):
for j in range(i):
X[j] -= X[i] * A[j][i]
A[j][i] = 0
return X
あとはこの関数にAを代入すれば完了です。
#逆行列を基本変形により求める。
A = np.array([[2.,1.,1.,1.],[3.,0.,-2.,1.],[0.,-1.,0.,-2.],[3.,1.,1.,1.]])
print(Inv(A))