LoginSignup
0
3

Pythonを使って基本変形で逆行列を求める。

Last updated at Posted at 2019-04-03

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))
0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3