Warum erzeugt SciPy eigsh () im Fall eines harmonischen Oszillators fehlerhafte Eigenwerte?


15

λnumλeinnein

Um den Eigenwert 40 beginnen die numerischen Ergebnisse von den analytischen zu abweichen. Das überrascht mich nicht (ich gehe hier nicht auf das Warum ein, es sei denn, es wird in der Diskussion erwähnt). Was mich jedoch überrascht , ist, dass eigsh () entartete Eigenwerte erzeugt (um die Eigenwertzahl 80). Warum verhält sich eigsh () auch für so wenige Eigenwerte so?

Bildbeschreibung hier eingeben

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

Das ist ein sehr merkwürdiges Verhalten. Ich werde es später heute testen.
Rafael Reiter

Ich habe die Antwort gefunden. Kurz gesagt: Mein Denken war falsch. Die analytischen Lösungen des Oberwellenoszillators (HOSZ) gelten ohne räumliche Einschränkung. Im obigen Code reicht meine Box jedoch von -10 bis 10, wodurch die numerischen Lösungen eine Randbedingung erhalten. Folglich löst eigsh () das System, für das es korrekt angegeben wurde. Bei n = 50 (wobei n die Hauptquantenzahl ist) passen die analytischen Lösungen nicht mehr in die -10, 10-Box. Nun (nach einigem Nachdenken) scheint dies offensichtlich zu sein. Das habe ich jedoch beim Erstellen und Testen des Codes nicht gesehen.
14.

das erklärt aber immer noch nicht die Entartung, oder?
14.

Antworten:


12

Die Entartung einiger Eigenwerte scheint mir das Kennzeichen für den Zusammenbruch des Lanczos-Algorithmus zu sein . Der Lanczos-Algorithmus ist eine der am häufigsten verwendeten Methoden zur Approximation der Eigenwerte und Eigenvektoren von Hermit-Matrizen. Dies wird von scipy.eigsh () durch einen Aufruf der ARPACK-Bibliothek verwendet .

In der exakten Arithmetik erzeugt der Lanczos-Algorithmus eine Menge orthogonaler Vektoren, in der Gleitkomma-Arithmetik können diese nicht orthogonal sein und sogar linear abhängig werden. Das wirklich ärgerliche ist, dass dieser Orthogonalitätsverlust genau dann auftritt, wenn einer der ungefähren Eigenwerte gegen einen der realen Eigenwerte konvergiert ist - der Algorithmus sabotiert sich sozusagen von selbst. Das Ergebnis ist, dass Sie einige unechte Paare von nahegelegenen Eigenwerten erhalten. Hierfür gibt es verschiedene Korrekturen, zum Beispiel die Verwendung von Gram-Schmidt, um konvergierte Eigenvektoren bei jedem Schritt orthogonal zu machen.

Dennoch ist keine Methode perfekt, insbesondere wenn Sie versuchen, das gesamte Spektrum Ihrer Matrix zu berechnen . Wenn Sie also versuchen, die 50 kleinsten Eigenwerte zu erhalten, ist es möglicherweise besser, die Wellenfunktion durch einen Vektor mit 100 Elementen zu approximieren und nur eigsh()die ersten 50 Energieniveaus abzufragen, als einen Vektor mit 50 Punkten zu verwenden und nach allen zu fragen der Eigenwerte.

Wenn Sie mehr darüber erfahren möchten, schauen Sie sich die numerischen Methoden von Yousef Saad für große Eigenwertprobleme an .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.