Julia言語による対称直交化と正準直交化の実装
A. ザボ, N.S.オストランド著, 大野公男, 阪井健男, 望月祐志訳『新しい量子化学 上 電子構造の理論入門』(東京大学出版会, 1987) の3.4.5と3.5.2で解説されている対称直交化と正準直交化をJuliaで実装します.
一般固有値問題から標準固有値問題へ
量子力学に関わる分野では, よく一般固有値問題
に遭遇します. これを標準固有値問題
の形に変形する手続きとして対称直交化や正準直交化が知られています. 例えば, Hartree-Fock法ではRoothaan方程式
を前述の手法によって直交化し,
に変形してから解きます. 直交化の具体的な説明はA. ザボ, N.S.オストランド著, 大野公男, 阪井健男, 望月祐志訳『新しい量子化学 上 電子構造の理論入門』(東京大学出版会, 1987) の3.4.5や3.5.2にあります. 対称直交化と正準直交化では, 重なり行列
いずれの場合でも
となることを実際に計算してみましょう.
重なり行列の対角化
3.5.2節に下記の具体的な計算例があります. 重なり行列 S
の固有値 s
と固有ベクトルを並べた行列 U
を使って X
を計算し, これらの数値と一致するか確かめます.
julia> S = [1.0 0.4508; 0.4508 1.0]
2×2 Matrix{Float64}:
1.0 0.4508
0.4508 1.0
s, U = eigen(S)
で重なり行列を対角化してs
とU
が得られます. 実際に教科書の値と一致していることが確かめられました.
julia> using LinearAlgebra
julia> s, U = eigen(S)
julia> s = sort(s, rev=true)
julia> U = U[:, sortperm(s)]
2×2 Matrix{Float64}:
0.707107 -0.707107
0.707107 0.707107
julia> diagm(s .^ (-1/2))
2×2 Matrix{Float64}:
0.830226 0.0
0.0 1.34938
対称直交化
Juliaでは S ^ (-1/2)
が直ちに計算できてしまいます. これは U * diagm(s .^ (-1/2)) * U'
と一致しており, 多少の誤差が入るものの X' * S * X
が実際に単位行列になっていることも確かめられます.
julia> X = S ^ (-1/2)
2×2 Symmetric{Float64, Matrix{Float64}}:
1.0898 -0.259578
-0.259578 1.0898
julia> X = U * diagm(s .^ (-1/2)) * U'
2×2 Matrix{Float64}:
1.0898 -0.259578
-0.259578 1.0898
julia> X' * S * X
2×2 Matrix{Float64}:
1.0 -7.50288e-17
-1.29604e-16 1.0
正準直交化
diagm(s .^ (-1/2))
は単に s
の要素の平方根の逆数 X' * S * X
が実際に単位行列になっていることが確かめられます.
julia> X = U * diagm(s .^ (-1/2))
2×2 Matrix{Float64}:
0.587058 -0.954157
0.587058 0.954157
julia> X' * S * X
2×2 Matrix{Float64}:
1.0 0.0
0.0 1.0
まとめ
対称直交化と正準直交化をJuliaで実装し, どちらの手法でも
余談
直観的なイメージはA. ザボ, N.S.オストランド著, 大野公男, 阪井健男, 望月祐志訳『新しい量子化学 上 電子構造の理論入門』(東京大学出版会, 1987)の図3.7を参照してください. 中井 浩巳 『手で解く量子化学Ⅰ』 (丸善出版, 2022) の4.3にも解説があり, 演習問題も用意されています. 将来的にはTwoBody.jlのRayleigh–Ritz法への正準直交化の導入を計画しています. LAPACKにおける一般固有値問題のソルバdsygvなどは上記の手順とは異なり, dpotrfでCholesky分解を行ってdsygstで標準固有値問題に帰着してからdsyevで解いています.
Discussion