मैं कम्प्यूटेशनल भौतिकी के संदर्भ में विशाल विरल मैट्रिसेस के आइजनवेल्यू कम्प्यूटेशन करने के लिए कुछ बड़े कोड विकसित कर रहा हूं। मैं एक सरल आयाम में सरल हार्मोनिक थरथरानवाला के खिलाफ अपनी दिनचर्या का परीक्षण करता हूं, क्योंकि आइजनवेल्स को विश्लेषणात्मक रूप से जाना जाता है। ऐसा करने और अपने स्वयं के दिनचर्या की तुलना करने के लिए SciPy के इनबिल्ट सॉल्वरों की तुलना में, मैं नीचे दिए गए प्लॉट में प्रदर्शित विषमता के पार आया हूं। यहाँ आप देख सकते हैं पहले 100 संख्यानुसार अभिकलन eigenvalues और विश्लेषणात्मक eigenvalues λ एक एन एक
लगभग eigenvalue नंबर 40 के आसपास, संख्यात्मक परिणाम विश्लेषणात्मक लोगों से अलग होने लगते हैं। यह मुझे आश्चर्यचकित नहीं करता (मैं यहाँ क्यों नहीं जाऊँगा, जब तक कि यह चर्चा में नहीं आता)। हालांकि, क्या है आश्चर्य की बात मेरे लिए यह है कि eigsh () पैदा करता है पतित eigenvalues (करीब eigenvalue संख्या 80)। इतनी कम संख्या में स्वदेशी के लिए भी ईगश () ऐसा व्यवहार क्यों करता है?
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()