freedom-_-qの勉強履歴

メモ書きが主になるかと思います。勉強強制のために一日一記事目指してます。頭良くないので間違いが多々あるかと思います。

scipy.linalg.solveを使ってみる

使用例

方程式 行列形式で表された連立方程式arr_a * arr_x = arr_barr_xについて解く。

import numpy as np
from scipy import linalg

arr_a = np.random.randint(1, 10, size=(5, 5))
#array([[7, 5, 2, 5, 9],
#       [7, 3, 7, 6, 1],
#       [9, 1, 9, 9, 1],
#       [1, 9, 8, 3, 8],
#       [9, 4, 8, 9, 9]])

arr_x = np.random.randint(1, 10, size=(5, 5))
#array([[2, 4, 1, 3, 4],
#       [5, 4, 3, 7, 7],
#       [8, 3, 2, 1, 9],
#       [3, 2, 8, 6, 2],
#       [2, 6, 7, 9, 5]])

arr_b = arr_a @ arr_x
#array([[ 88, 118, 129, 169, 136],
#       [105,  79,  85,  94, 129],
#       [124,  91, 109, 106, 147],
#       [136, 118, 124, 164, 185],
#       [147, 148, 172, 198, 199]])

linalg.solve(arr_a, arr_b)
#array([[2., 4., 1., 3., 4.],
#       [5., 4., 3., 7., 7.],
#       [8., 3., 2., 1., 9.],
#       [3., 2., 8., 6., 2.],
#       [2., 6., 7., 9., 5.]])

もちろん、linalg.invを使っても同様の解が得られる。

linalg.inv(arr_a) @ arr_b
#array([[2., 4., 1., 3., 4.],
#       [5., 4., 3., 7., 7.],
#       [8., 3., 2., 1., 9.],
#       [3., 2., 8., 6., 2.],
#       [2., 6., 7., 9., 5.]])

どうやら両者同じ関数を呼びでしているようだが、それがFortranだったので追うのを諦めた。