Juliaで線形代数:固有値問題
この記事では固有値問題とエルミート行列について, Juliaによる具体的な計算例を挙げながら解説する.
パッケージ
LinearAlgebra.jlはJuliaに最初からインストールされているので, ノートブック上でusing LinearAlgebra
を宣言するだけでよい.
using LinearAlgebra
ベンチマーク
斎藤正彦『線型代数入門』(1966, 東京大学出版会) 第5章の問題1をベンチマークとする. 対角形の各対角成分は元の行列の固有値である.
問題1 | 行列 | 対角形 |
---|---|---|
イ) | ||
ロ) | ||
ハ) |
行列の宣言
行列は次のように宣言する.
A = [-4 0 6;
-3 2 3;
-3 0 5]
B = [ 1 0 -2;
2 -1 -2;
-2 2 0]
C = [-3 -2 -2 1;
2 3 2 0;
3 1 2 -1;
-4 -2 -2 2]
固有値
事前にusing LinearAlgebra
を宣言しておく必要がある. 行列をeigvals()
に渡すことで固有を格納した配列が得られる. なお, eigvals()
は固有値を小さい順に並べるため, 上記の問題とは順序が異なる. また, Juliaに限らず, コンピュータで実数を扱うことは不可能なので, 代わりに浮動小数点数が採用される. そのため-1
が-0.999999999999998
となったり, 0
が-2.539596429704816e-15
となったりするが, 前述のベンチマークに矛盾しない結果が得られている.
eigvals(A)
-1.0
2.0
2.0
eigvals(B)
-0.999999999999998
-2.539596429704816e-15
1.0000000000000024
eigvals(C)
4.440892098500626e-15
0.9999999999999977
0.9999999999999997
1.9999999999999996
固有ベクトル
固有値はeigvec()
で求められる. 固有ベクトル(列ベクトル)を並べた行列が出力される.
eigvecs(A)
-0.816497 0.0 -0.707107
-0.408248 1.0 0.0
-0.408248 0.0 -0.707107
eigvecs(B)
-0.666667 0.666667 -0.707107
-0.333333 0.666667 -0.707107
-0.666667 0.333333 3.66027e-16
eigvecs(C)
-0.57735 0.235702 0.0116258 -0.408248
-8.46545e-16 0.471405 -0.712657 0.816497
0.57735 -0.707107 0.701031 -1.46869e-15
-0.57735 0.471405 0.0232516 -0.408248
対角化
行列
P = eigvecs(A)
inv(P) * A * P
-1.0 0.0 -6.66134e-16
0.0 2.0 0.0
-4.44089e-16 0.0 2.0
P = eigvecs(B)
inv(P) * B * P
-1.0 1.33227e-15 -1.77636e-15
-5.03301e-15 -3.15544e-30 -3.14018e-15
-5.32907e-15 2.66454e-15 1.0
P = eigvecs(C)
inv(P) * C * P
-2.56395e-16 3.97757e-15 -1.43785e-15 -3.80727e-15
-4.98164e-15 1.0 -9.74804e-16 -1.97652e-15
-1.78924e-15 -3.14804e-16 1.0 -1.39507e-15
1.23016e-15 -8.76336e-16 -7.77466e-16 2.0
eigen()の使い方
eigen()
に行列を渡すと, 固有値と固有ベクトルを同時に求める. 固有値と固有ベクトルの配列はそれぞれvalues
とvectors
というキーで個別に取り出すこともできる.
eigen(A)
values:
3-element Vector{Float64}:
-1.0
2.0
2.0
vectors:
3×3 Matrix{Float64}:
-0.816497 0.0 -0.707107
-0.408248 1.0 0.0
-0.408248 0.0 -0.707107
eigen(A).values
-1.0
2.0
2.0
eigen(A).vectors
-0.816497 0.0 -0.707107
-0.408248 1.0 0.0
-0.408248 0.0 -0.707107
エルミート行列
詳細はWikipediaを参照されたい. 次のようなエルミート行列を考える.
H = [ 1 2im
-2im 1 ]
エルミート行列の固有値は実数である.
これは, 量子力学の支配方程式であるSchrödinger方程式が複素数を含む方程式であるにも関わらず, 導かれるエネルギー固有値が必ず実数であることと密接に関係している.
eigvals(H)
-1.0
3.0
異なる固有値に属する固有ベクトルは直交する.
これも量子力学において重要である.
P = eigvecs(H)
println(dot(P[:,1], P[:,2]))
0.0 + 0.0im
そして量子力学へ
量子力学の支配方程式はSchrödinger方程式という微分方程式である. 一見, 線形代数とは関係無いように思われるが, 適当な基底関数で展開することによって, 行列方程式に帰着できる. シリーズ最後の記事では, その方法の一つである線形変分法について, Juliaによる具体的な計算例を挙げながら解説する.
参考文献
この記事の元になったノートブックはGistにアップロードしてある.
Discussion