In [1]:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
modelová funkce pro difrakci na štěrbině
In [3]:
def model_fce(alpha,d,alpha0):
wavelength=550 #vlnová délka světla (nm)
return (np.sinc(d*np.pi/wavelength*np.sin(alpha-alpha0)))**2
simulace spektra difrakce na šterbině
In [5]:
d=2500 #šířka štěrbiny (nm)
alpha0=2*np.pi/180 #poloha maxima (deg)
alpha=np.linspace(-15,15,100)
alpha=alpha*np.pi/180 #konverze deg. na rad.
y=model_fce(alpha,d,alpha0)+np.random.normal(0,0.005,np.size(alpha))
nakreslení simulovaného spektra
In [7]:
plt.scatter(alpha*180/np.pi,y)
plt.xlabel(r"$\alpha $ (deg.)")
plt.ylabel('intenzita')
plt.show()
fit nelineární metodou nejmenších čtverců
In [9]:
#počáteční odhady
d_initial=2500
alpha0_initial=5*np.pi/180
par,cov=curve_fit(model_fce,alpha,y,p0=[d_initial,alpha0_initial],bounds=([0,-15*np.pi/180],[5000,15*np.pi/180]))
d_fit=par[0]
alpha0_fit=par[1]
Nakreslení výsledků
In [11]:
plt.scatter(alpha*180/np.pi,y,label='simulated data')
plt.plot(alpha*180/np.pi,model_fce(alpha,d_fit,alpha0_fit),c='red',label='fit')
plt.xlabel(r"$\alpha$ (deg.)")
plt.ylabel('intenzita')
plt.legend()
plt.show()
In [12]:
print(f"šířka šterbiny d = ({d_fit:5.1f} +/- {np.sqrt(cov[0,0]):3.1f}) nm")
print(f"poloha maxima alpha0 = ({alpha0_fit*180/np.pi:6.3f} +/- {np.sqrt(cov[1,1])*180/np.pi:4.3f}) stupňů")
šířka šterbiny d = (2499.3 +/- 4.0) nm poloha maxima alpha0 = ( 1.993 +/- 0.003) stupňů
In [ ]: