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])