Numpy, Scipy による連立方程式,固有値の計算
モジュールのインポート
import numpy as np
from scipy import linalg
連立方程式
連立方程式を行列表示して,
a = np.array([[3,2,1],[5,-5,4],[6,0,1]])
c = np.array([4,3,0])
a,c
(array([[ 3, 2, 1],
[ 5, -5, 4],
[ 6, 0, 1]]),
array([4, 3, 0]))
連立方程式を解く関数は,
https://numpy.org/doc/stable/reference/generated/numpy.linalg.solve.html
b = np.linalg.solve(a,c)
b
array([-0.49056604, 1.26415094, 2.94339623])
この結果を用いて行列計算すると,次のように $c$ が求められる.
a@b
array([4., 3., 0.])
同様にして,4次の行列では,
d = np.array([[3,2,3,10],[2,-2,5,8],[3,3,4,9],[3,4,-3,-7]])
e = np.array([4,1,3,2])
d,e
(array([[ 3, 2, 3, 10],
[ 2, -2, 5, 8],
[ 3, 3, 4, 9],
[ 3, 4, -3, -7]]),
array([4, 1, 3, 2]))
x = np.linalg.solve(d,e)
x
array([ 0.78378378, 0.03603604, -0.67567568, 0.36036036])
次のように解を確認する関数があり,
np.allclose(np.dot(d, x), e) # 解の確認
True
Scipy
Scipy にも同様の関数があり,
x2 = linalg.solve(d,e)
x2
array([ 0.78378378, 0.03603604, -0.67567568, 0.36036036])
固有値,固有ベクトル
a = np.array([[4,2,2],[2,4,2],[2,2,4]])
a
array([[4, 2, 2],
[2, 4, 2],
[2, 2, 4]])
w, v = np.linalg.eig(a)
w # 固有値
array([2., 8., 2.])
v # 固有ベクトル
array([[-0.81649658, 0.57735027, -0.23513651],
[ 0.40824829, 0.57735027, -0.55958248],
[ 0.40824829, 0.57735027, 0.79471899]])
v1 = v[:,0]
v1
array([-0.81649658, 0.40824829, 0.40824829])
a@v1 # 固有ベクトルとの積
array([-1.63299316, 0.81649658, 0.81649658])
w[0]*v1 # 固有値との積
array([-1.63299316, 0.81649658, 0.81649658])
a@v[:,1]
array([4.61880215, 4.61880215, 4.61880215])
w[1]*v[:,1]
array([4.61880215, 4.61880215, 4.61880215])