আমি কম্পিউটেশনাল ফিজিক্সের প্রসঙ্গে বিশাল স্পার্স ম্যাট্রিক্সের ইগেনভ্যালু গণনা সম্পাদনের জন্য আরও কিছু বড় কোড বিকাশ করছি। আমি আমার রুটিনগুলি এক মাত্রায় সাধারণ সুরেলা দোলকের বিরুদ্ধে পরীক্ষা করি, যেহেতু ইগেনভ্যালুগুলি বিশ্লেষণাত্মকভাবে সুপরিচিত। এটি করা এবং আমার নিজস্ব রুটিনগুলি সায়পাইয়ের ইনবিল্ট সলভারগুলির সাথে তুলনা করে, আমি নীচের প্লটে প্রদর্শিত অদ্ভুততা জুড়ে এসেছি। এখানে আপনি প্রথম 100 টি সংখ্যার সাথে সংখ্যায়িত ইগেনভ্যালুগুলি দেখতে পাচ্ছেন এবং বিশ্লেষণাত্মক ইগন্যালিয়্যস λ একটি এন a
৪০ নম্বর ইগ্যালভ্যালু প্রায়, সংখ্যার ফলাফলগুলি বিশ্লেষণাত্মকগুলির থেকে পৃথক হওয়া শুরু করে। এটি আমাকে অবাক করে না (আমি কেন এখানে যাব না, যদি না এটি আলোচনায় না আসে)। যাইহোক, আমার জন্য অবাক করা বিষয় হ'ল ইগশ () ইজেনভ্যালুগুলি অবনমিত (প্রায় ৮০ নম্বর ইগেনভ্যালু ) উত্পাদন করে । ইগশ () এত ছোট সংখ্যক ইগন্যাল্যুজের জন্যও কেন এমন আচরণ করে?
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()