Pythonで逆行列、行列式、rankの計算

今日はNumpyの機能を最大限に活かして行列の基本的な計算をいくつか解いてみたいと思います。

逆行列計算

まずPython逆行列計算をしてみよう。

import numpy as np
list_a = (0,4)
list_b = (1,5)
mat_a = np.matrix([list_a,list_b])
mat_b = np.linalg.inv(mat_a)
print(mat_b)
mat_c = mat_a * mat_b
print(mat_c)
[[-1.25  1.  ]
 [ 0.25  0.  ]]
[[1. 0.]
 [0. 1.]]

簡単に逆行列計算ができました。np.linalg.inv関数で逆関数をたちどころに計算することができます。
しかしながら逆計算をプログラムで解くのは注意が必要です。例えば以下のような場合

import numpy as np
list_a = (3.1415,9.2653)
list_b = (5.8979,3.2384)
mat_a = np.matrix([list_a,list_b])
mat_b = np.linalg.inv(mat_a)
print(mat_b)
mat_c = mat_a * mat_b
print(mat_c)
[[-0.07281823  0.2083383 ]
 [ 0.13261939 -0.07063935]]
[[ 1.00000000e+00 -1.11022302e-16]
 [ 0.00000000e+00  1.00000000e+00]]

逆行列との積が単位行列になりません。これは計算途中で丸め込みの誤差が生じるためだと思われます。逆行列計算には過信しないようにしましょう。

行列式の計算

import numpy as np
list_a = (-1,4,1)
list_b = (1,1,2)
list_c = (0,9,1)
mat_a = np.matrix([list_a,list_b,list_c])
det_a = np.linalg.det(mat_a)
print(det_a)
22.000000000000004

np.linalg.det行列式を求める関数です。
実際の答えは22なのですが、変な端数が出てきています。原因がよく分からないのですが、どうもアルゴリズムがLU分解をしているせいではないかと思っているのですが詳しい方教えてください。とりあえず概算は求めることができます。

rankの計算

import numpy as np
list_a = (-1,4,1)
list_b = (1,1,2)
list_c = (0,9,1)
mat_a = np.matrix([list_a,list_b,list_c])
rank_a = np.linalg.matrix_rank(mat_a)
print(rank_a)
3

階級(rank)も求められます。rankとはなにかを分かりやすく説明するのは避けますが、簡単に言えば、正則な小行列で大きさが最大なものの列数です。

今日はここまで。