Je développe un code plus grand pour effectuer des calculs de valeurs propres d'énormes matrices clairsemées, dans le contexte de la physique computationnelle. Je teste mes routines contre le simple oscillateur harmonique dans une dimension, car les valeurs propres sont bien connues analytiquement. Ce faisant et en comparant mes propres routines aux solveurs intégrés de SciPy, je suis tombé sur l'étrangeté affichée dans l'intrigue ci-dessous. Ici vous pouvez voir les 100 premières valeurs propres calculées numériquement et les valeurs propres analytiques λ a n a
Autour de la valeur propre 40, les résultats numériques commencent à diverger des résultats analytiques. Cela ne me surprend pas (je ne vais pas expliquer pourquoi ici, sauf si cela revient dans la discussion). Cependant, ce qui est surprenant pour moi que eigsh () produit des valeurs propres dégénérées (autour de 80) nombre de valeurs propres. Pourquoi eigsh () se comporte-t-il ainsi même pour un si petit nombre de valeurs propres?
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()