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()
No description has been provided for this image

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()
No description has been provided for this image
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 [ ]: