pythonで固有値方程式を解く

プログラミング

こんにちは、はっこんです。

本日はpythonを用いて固有値方程式を解いていきます。

固有値方程式とは

そもそも固有値方程式とはなんでしょうか?

理系の方は大学に入学するとすぐに線形代数の授業で習うと思います。

線形代数における固有値方程式とは、与えられた行列に対し、積をとっても方向が変化しない特別なベクトル(固有ベクトル)を求めるための方程式です。

実際に式にして表してみると、このようになります。

\bf{A}\bf{x}=\lambda\bf{x}

Aは行列、xは固有ベクトル、λは整数(固有値)となります。

紙と鉛筆を使って解く場合は、Iを単位行列とすると、

|\bf{A}-\bf{I}\lambda |=0

を解いて固有値を求め、

(\bf{A}-\bf{I} \lambda)\bf{x}=0

を解くことによって固有ベクトルを求めることができます。

関係ないですが、量子力学の波動関数も固有値方程式の形になっています。

pythonを用いた解き方

pythonを用いればかなり簡単に固有値方程式を解くことができます。

というのも、固有値方程式を解く関数がnumpyライブラリ内に存在しているためです。

早速コードを見てみましょう。

import numpy as np

A = np.array([[8,1],[3,2]]) 
eig_val, eig_vec = np.linalg.eig(A) 
print("eigenvalue:{}" .format(eig_val))
print("eigenvector:{}" .format(eig_vec))

たったの5行ですね、本当に簡単です。

ちなみに出力結果がこちら、

eigenvalue:[8.46410162 1.53589838]
eigenvector:[[ 0.90707274 -0.15288195]
             [ 0.42097392  0.98824446]]

注意して欲しいことは固有ベクトルが縦で表示されていることです。

要するに、固有値λ=8.46410162のときの固有ベクトルは、

eigenvector:[[ 0.90707274]
             [ 0.42097392]]

となります。

行列の次元が増えても大丈夫!

import numpy as np

A = np.array([[8,1,4,3],[3,2,7,10],[3,8,9,1],[5,6,4,8]]) 
eig_val, eig_vec = np.linalg.eig(A) 
print("eigenvalue:{}" .format(eig_val))
print("eigenvector:{}" .format(eig_vec))
eigenvalue:
[20.60615371+0.j         -5.04705406+0.j          5.72045018+1.12548339j
  5.72045018-1.12548339j]
eigenvector:[
 [ 0.34084933+0.j          0.14955497+0.j         -0.18865938-0.50081144j
  -0.18865938+0.50081144j]
 [ 0.55050931+0.j          0.81722018+0.j         -0.12627708+0.24629721j
  -0.12627708-0.24629721j]
 [ 0.51589261+0.j         -0.47693374+0.j          0.61805281+0.j
   0.61805281-0.j        ]
 [ 0.56090645+0.j         -0.28691235+0.j         -0.45074025+0.22766481j
  -0.45074025-0.22766481j]
 ]

与えられた行列が複素数でも問題なく解くことができます。

import numpy as np

A = np.array([[1+4j,2j],[2,4j]]) 
eig_val, eig_vec = np.linalg.eig(A) 
print("eigenvalue:{}" .format(eig_val))
print("eigenvector:{}" .format(eig_vec))
eigenvalue:[ 1.95907589+5.37073062j -0.95907589+2.62926938j]
eigenvector:[[ 0.76703668+0.j         -0.36782319-0.52570033j]
             [ 0.52570033-0.36782319j  0.76703668+0.j        ]]

本当に簡単ですよね、

かなり便利だと思います。

コメント

タイトルとURLをコピーしました