SciPy eigsh()が高調波発振器の場合に誤った固有値を生成するのはなぜですか?


15

私は、計算物理学の文脈で、巨大なスパース行列の固有値計算を実行するために、いくつかのより大きなコードを開発しています。固有値は分析的によく知られているため、1次元の単純な調和振動子に対してルーチンをテストします。そのようにして、自分のルーチンをSciPyの組み込みソルバーと比較すると、下のプロットに表示される奇妙なことに出くわしました。ここでは、数値計算された最初の100個の固有値および分析固有値を見ることができますλnあなたはmλana

固有値番号40付近で、数値結果は分析結果から分岐し始めます。これは私を驚かせるものではありません(議論で取り上げられない限り、ここではなぜなのかを説明しません)。しかし、私にとって驚くべきことは、eigsh()縮退した固有値(固有値80あたり)を生成することです。なぜeigsh()は、そのような少数の固有値に対してもそのように振る舞いますか?

ここに画像の説明を入力してください

import numpy as np
from scipy.sparse.linalg import eigsh
import myFunctions as myFunc
import matplotlib.pyplot as plt

#discretize x-axis
N = 100
xmin = -10.
xmax = 10.
accuracy = 1e-5
#stepsize
h = (xmax - xmin) / (N + 1.)
#exclude first and last points since we force wave function to be zero there
x = np.linspace(-10. + h,10. - h,N)
#create potential
V = x**2

def fivePoint(N,h,V):
    C0 = (np.ones(N))*30. / (12. * h * h) + V
    C1 = (np.ones(N)) * (-16.) / (12. * h * h)
    C2 = (np.ones(N)) / (12. * h * h)
    H = sp.spdiags([C2, C1, C0, C1, C2],[-2, -1, 0, 1, 2],N,N)
    return H

H = myFunc.fivePoint(N,h,V)
eigval,eigvec = eigsh(H, k=N-1, which='SM', tol=accuracy)

#comparison analytical and numerical eigenvalues
xAxes = np.linspace(0,len(eigval)-1,len(eigval))
analyticalEigval = 2. * (xAxes + 0.5)
plt.figure()
plt.plot(xAxes,eigval, '+', label=r"$\lambda_{num}$")
plt.plot(xAxes,analyticalEigval, label=r"$\lambda_{ana}$")
plt.xlabel("Number of Eigenvalue")
plt.ylabel("Eigenvalue")
plt.legend(loc=4)
plt.title("eigsh()-method: Comparison of $\lambda_{num}$ and $\lambda_{ana}$")
plt.show()

それは非常に奇妙な振る舞いです。今日は後でテストします。
ラファエルライター

答えを見つけました。要するに、私の考えは間違っていました。高調波発振器(HOSZ)の解析ソリューションは、空間的な制限なしで有効です。ただし、上記のコードでは、ボックスが-10から10まで実行されるため、数値解に境界条件が設定されます。その結果、eigsh()はそれが正しく与えられたシステムを解決します。n = 50付近(nは主要な量子数)で、分析解は-10、10ボックス内に収まりません。今(ある程度の考えの後で)、これは明らかです。しかし、コードをビルドしてテストしている間、私はそれを見ませんでした。
seb

これはまだ縮退を説明していませんが、そうですか?
seb

回答:


12

いくつかの固有値の縮退は、ランチョスアルゴリズムの内訳の特徴のように思えます。Lanczosアルゴリズムは、エルミート行列の固有値と固有ベクトルを近似するために、より一般的に使用される方法の1つです。ARPACKライ​​ブラリの呼び出しを通じて、scipy.eigsh()が使用するものです。

正確な算術では、Lanczosアルゴリズムは直交ベクトルのセットを生成しますが、浮動小数点演算では、これらは直交にならず、線形依存になることさえあります。本当に厄介なのは、この直交性の損失は、近似固有値の1つが実際の固有値の1つに収束したときに正確に発生することです。いわば、アルゴリズム自体が妨害されます。その結果、近くの固有値の偽のペアが得られます。これにはさまざまな修正があります。たとえば、グラム-シュミットを使用して、収束した固有ベクトルをすべてのステップで強制的に直交させます。

それにもかかわらず、特にマトリックスのスペクトル全体を計算しようとしている場合、完璧な方法はありません。したがって、50個の最小固有値を取得しようとする場合は、50 eigsh()個のポイントを持つベクトルを使用してすべてを求めるのではなく、波動関数を100個の要素を持つベクトルで近似し、最初の50個のエネルギーレベルのみを求める方がよい場合があります固有値の。

さらに読みたい場合は、Yousef Saadの大規模な固有値問題に対する数値法を参照してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.