계산 물리학의 맥락에서 거대한 희소 행렬의 고유 값 계산을 수행하는 더 큰 코드를 개발 중입니다. 고유 값은 분석적으로 잘 알려져 있기 때문에 간단한 고조파 발진기에 대해 일차원으로 테스트합니다. 그렇게하고 내 자신의 루틴을 SciPy의 빌트인 솔버와 비교하면서 아래 그림에 표시된 이상한 점을 발견했습니다. 여기에서 처음 100 개의 숫자로 계산 된 고유 값 과 분석 고유 값 λ a n a를 볼 수 있습니다
고유 값 번호 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()