O8 Fraunhofersche Beugung

Santiago R. , 24.3.2021

In [381]:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

Messwerte

In [382]:
from IPython.display import Image
Image(filename='Messwerte.png', width = 800, height = 300)
Out[382]:

Gitter

In [383]:
#Gitter
l_0 = 150
u_l0 = 0.5
k = np.array([-3,-2,-1,1,2,3])
l = np.array([-29.1,-19.3,-9.6,9.6,19.3,29.1])
alpha = np.arctan(np.array([-29.1,-19.3,-9.6,9.6,19.3,29.1])/l_0)
u_l = np.ones(len(l))*0.1
u_alpha = np.sqrt((u_l/(l_0*(1+l**2/l_0**2)))**2+(l*u_l0/(l_0**2*(1+l**2/l_0**2)))**2)

Für das von einem Gitter mit Gitterkonstante $g$ erzeugte Interferenzmuster gilt in Abhängigkeit der Ordnung k der abgebildeten Maxima für den Beugungswinkel $\alpha$
$sin(\alpha _k) = k \frac{\lambda}{g}$

In [384]:
def sin_alpha_k(k,lamda):
    g = 10**(-5)
    sin = k*lamda/g
    return sin
popt, pcov = curve_fit(sin_alpha_k,k,np.sin(alpha), sigma=u_alpha)
plt.plot(k,sin_alpha_k(k,*popt), label="Fit sin(alpha)=kx/g")
plt.errorbar(k,np.sin(alpha), yerr=u_alpha,fmt='o',marker='x',label="Messwerte")
plt.ylabel(r'$sin(\alpha _k)$')
plt.xlabel("Ordnung "r'$k$')
plt.legend(loc="upper left")
plt.savefig("FitGitter.pdf")
print("Lambda = ", np.round(popt[0]*1e9,1), "+/-", np.round(pcov[0,0]**0.5*1e9,1), "nm")
Lambda =  636.3 +/- 0.8 nm
In [385]:
def residuals(f, popt, x, y, res_name):
    residuals = y - f(x,*popt)
    ss_res = np.sum(residuals**2)
    ss_tot = np.sum((y-np.mean(y))**2)
    R_2 = 1 - (ss_res / ss_tot)
    plt.scatter(x,residuals, label='Residuen, R^2 ='+str(np.round(R_2,7)))
    plt.xlabel("x-Werte")
    plt.ylabel("Differenz y-f(x)")
    plt.ylim(-np.abs(max(residuals))*1.5, np.abs(max(residuals))*1.5)
    plt.legend(loc="upper right", prop={'size': 8})
    plt.gca().set_aspect(aspect=int(1/(np.abs(max(residuals))*1.5)))
    #plt.rcParams["figure.figsize"] = (8,1)
    plt.savefig("Residuen"+res_name+".pdf", bbox_inches = "tight")
    print("R^2 =", R_2)
In [386]:
residuals(sin_alpha_k, popt, k, np.sin(alpha), "Gitter")
R^2 = 0.9999933316026048

Spalte

Für das von einem Einfachspalt mit Spaltbreite $b$ erzeugte Interferenzmuster gilt in Abhängigkeit der Ordnung k der abgebildeten Minima für den Beugungswinkel $\alpha$
$sin(\alpha _k) = k \frac{\lambda}{b}$

In [387]:
#Spalt
l_0 = 150
u_l0 = 0.5
k = np.array([1,2,3,4,5,6,7,8])
delta_l = np.arctan(np.array([1, 1.9,3.3,4.4,4.9,5.6,6.9,7.7])/(2*l_0))
u_l = np.ones(len(delta_l))*0.2
u_alpha = np.sqrt((u_l/(l_0*(1+delta_l**2/l_0**2)))**2+(delta_l*u_l0/(l_0**2*(1+delta_l**2/l_0**2)))**2)
In [388]:
def sin_alpha_k(k,b):
    lamda = 636.3
    sin = k*lamda/b
    return sin
popt, pcov = curve_fit(sin_alpha_k,k,np.sin(delta_l), sigma=u_alpha)
plt.plot(k,sin_alpha_k(k,*popt), label="Fit sin(alpha)=kx/g")
plt.errorbar(k,np.sin(delta_l), yerr=u_alpha,fmt='o',marker='x',label="Messwerte")
plt.ylabel(r'$sin(\alpha _k)$')
plt.xlabel("Ordnung "r'$k$')
plt.legend(loc="upper left")
plt.savefig("FitSpalte.pdf")
print("b = ", np.round(popt[0]/1e6,3), "+/-", np.round(pcov[0,0]**0.5/1e6,3), "mm")
b =  0.194 +/- 0.004 mm
In [389]:
residuals(sin_alpha_k, popt, k, np.sin(delta_l), "Spalt")
R^2 = 0.9877332747909656

Lochblende

Bei der Lochblende kann der Intensitätsverlauf $I(\alpha)$ nach einer Besselfunktion $J_1$ erster Ordnung beschrieben werden mit
$I(\alpha) = I_0 \left[\frac{J_1\left(\theta (\alpha)/2\right)}{\theta (\alpha)/4}\right] ^2 + I_{noise}$ mit $\theta (\alpha) = \frac{2\pi B sin(\alpha)}{\lambda}$
Aus den Messungen für die Position $x$ bezüglich des zentralen Einfallspunktes $x_0$ des gebeugten Laserstrahls in einem Abstand $l_0$ zur Lochblende ergibt sich für den Beugungswinkel $\alpha$
$tan(\alpha) = \frac{|x-x_0|}{l_0} $
Im Sinne der Konvergenz des numerischen Fit-Algorithmus kann die obige Beziehung aufgrund der sehr kleinen radialen Ablenkung des Laserstrahls vereinfacht angenähert werden als
$sin(\alpha) \approx \alpha \approx tan(\alpha) = \frac{|x-x_0|}{l_0} $
Damit folgt dann für die oberen Gleichungen mit $A = \frac{B}{\lambda l_0}$
$\theta (x) = 2\pi A |x-x_0| \Rightarrow I(x) = I_0 \left[\frac{J_1\left(\pi A |x-x_0| \right)}{\pi A |x-x_0|/2}\right] ^2 + I_{noise}$

In [390]:
#Lochblende
l_0 = 162*10 #in mm
u_l0 = 0.5*10
d = np.arange(10.05,23.05,0.5) #in mm
u_d = 0.01
I = np.array([37*1e3,47*1e3,54*1e3,55*1e3,53*1e3,45*1e3,35*1e3,24*1e3,12*1e3,7.2*1e3,2.7*1e3,600,72,300,550,680,480,230,60,12,70,140,160,120,86,17]) #in nA
u_I = I*0.2
In [391]:
from scipy.special import jv
def bessel(x, A, I_0, I_noise, x_0):
    Bessel = jv(1,np.pi*A*np.abs(x-x_0))
    I = I_0*(Bessel/(np.pi*A*np.abs(x-x_0)/2))**2 + I_noise
    return I
Bessel_Guess = np.array([0.3,3600,0.01,13])
x_test = np.linspace(10,23,1000)
popt, pcov = curve_fit(bessel,d,I, Bessel_Guess, sigma=u_I)
plt.plot(x_test, bessel(x_test, *popt), label="Fit Besselfunktion")
plt.errorbar(d,I, xerr= u_d, yerr=u_I,fmt='o',marker='x',label="Messwerte", color="red")
plt.yscale("log")
plt.ylabel(r'$log(I)$'"in nA")
plt.xlabel("d in mm")
plt.legend(loc="upper right")
plt.savefig("FitBessel.pdf")
print("A = ", np.round(popt[0],3), "+/-", np.round(pcov[0,0]**0.5,3), "1/mm")
print("I_0 = ", np.round(popt[1]/1e3,3), "+/-", np.round(pcov[1,1]**0.5/1e3,3), "uA")
print("I_noise = ", np.round(popt[2],3), "+/-", np.round(pcov[2,2]**0.5,3), "nA")
print("x_0 = "