見出し画像

Pythonで再帰関数を使い、余因子行列から行列式を計算する

線形代数の行列式を計算するうえで、3次元の配列であればそんなに難しくありませんが、4次元以上になると偶置換か奇置換かを判断するなど、かなり複雑な処理が必要になります。

詳しくは、Pythonで行列式の値を計算する

いっぽう、行列式はある行の各要素にその要素の余因子を掛けて、正負を考慮しながら合計していくと行列式を計算することができます。

まず、余因子を計算するために、4次元の行列のi行j列を削除した行列を求める関数を作成します。このような行列はminor_submatrixというそうで、関数名もこれにします。

m_x =[[ 2, 2,-1, 1],
     [-1, 1, 2, 1],
     [ 1, 2, 0, 1],
     [ 2, 0, 1, 1]]
     
def minor_submatrix(m, i, j):
   mtrx = []
   for row in range(len(m)):
       if row != i:
           mtrx_rows = []
           for col in range(len(m[0])):
               if col != j:
                   mtrx_rows.append(m[row][col])
           mtrx.append(mtrx_rows)
   return mtrx

minor_submatrix(m_x,1,1)
#[[2, -1, 1], [1, 0, 1], [2, 1, 1]]

次に、この関数を使い、ある要素×その要素の余因子を再帰関数を使って計算する関数を作成します。行列式はdeterminantといい、再帰関数recursiveというので、det_rという関数名にします。

def det_r(m):
   dim=len(m)
   det=0
   if dim==1:
       return m[0][0]
   else:
       for i in range(dim):
           det+=(-1)**i*m[0][i]* det_r(minor_submatrix(m,0,i))
   return det

det_r(m_x)

# 2

ちなみに、行列式はSymPyモジュールを使えば簡単に計算できます。

import sympy
sm_x=sympy.Matrix(m_x)
sm_x.det()

# 2

答えは一致します。再帰関数は、処理効率は良くないことがありますが、簡単なプログラムで複雑な処理ができてしまうことがたくさんあります。手前味噌になりますがこれはかなり傑作の部類に入ると思います。



いいなと思ったら応援しよう!