Tôi đang phát triển một số mã lớn hơn để thực hiện các tính toán eigenvalue của các ma trận thưa thớt lớn, trong bối cảnh vật lý tính toán. Tôi kiểm tra các thói quen của tôi chống lại bộ dao động điều hòa đơn giản trong một chiều, vì các giá trị riêng được biết đến một cách phân tích. Làm như vậy và so sánh các thói quen của riêng tôi với người giải quyết sẵn có của SciPy, tôi đã bắt gặp sự kỳ lạ được hiển thị trong cốt truyện dưới đây. Tại đây, bạn có thể thấy 100 giá trị riêng được tính toán bằng số và giá trị riêng phân tích
Xung quanh eigenvalue số 40, kết quả số thương mại bắt đầu phân kỳ từ những người phân tích. Điều này không làm tôi ngạc nhiên (tôi sẽ không đi vào lý do tại sao ở đây, trừ khi nó xuất hiện trong cuộc thảo luận). Tuy nhiên, điều đáng ngạc nhiên với tôi là eigsh () tạo ra các giá trị riêng suy biến (khoảng số eigenvalue 80). Tại sao eigsh () lại hành xử như vậy đối với một số lượng nhỏ giá trị bản địa như vậy?
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()