Pythonで逆行列、行列式、rankの計算
今日はNumpyの機能を最大限に活かして行列の基本的な計算をいくつか解いてみたいと思います。
逆行列計算
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とはなにかを分かりやすく説明するのは避けますが、簡単に言えば、正則な小行列で大きさが最大なものの列数です。
今日はここまで。