Add code comments
This commit is contained in:
parent
ed96bc6c0d
commit
02e81cf7bb
2 changed files with 50 additions and 57 deletions
|
|
@ -1,9 +1,9 @@
|
||||||
import matplotlib.pyplot as plt
|
import matplotlib.pyplot as plt
|
||||||
import numpy as np
|
import numpy as np
|
||||||
from scipy import integrate
|
from scipy import integrate
|
||||||
from tqdm import tqdm
|
from tqdm import tqdm #Import all needed modules
|
||||||
|
|
||||||
def Fresnel2dreal(yp, xp, y, x, k, z):
|
def Fresnel2dreal(yp, xp, y, x, k, z): #Define functions for integral kernels
|
||||||
kernel = np.cos((k/(2*z))*((x-xp)**2+(y-yp)**2))
|
kernel = np.cos((k/(2*z))*((x-xp)**2+(y-yp)**2))
|
||||||
return kernel
|
return kernel
|
||||||
|
|
||||||
|
|
@ -11,85 +11,80 @@ def Fresnel2dimag(yp, xp, y, x, k, z):
|
||||||
kernel = np.sin((k/(2*z))*((x-xp)**2+(y-yp)**2))
|
kernel = np.sin((k/(2*z))*((x-xp)**2+(y-yp)**2))
|
||||||
return kernel
|
return kernel
|
||||||
|
|
||||||
c = 3e8
|
c = 3e8 #Universal constants
|
||||||
e0 = 8.85e-12
|
e0 = 8.85e-12
|
||||||
|
|
||||||
def plot1D(aperture, z, k, screen_range, resolution):
|
def plot1D(aperture, z, k, screen_range, resolution): #Function for part 1
|
||||||
def genData(aperture, z, k, screen_range, resolution):
|
def genData(aperture, z, k, screen_range, resolution): #Function to generate data
|
||||||
y = 0
|
y = 0 #As in 1D
|
||||||
|
|
||||||
xp1=yp1=-aperture/2
|
xp1=yp1=-aperture/2 #Set range over which we are integrating
|
||||||
xp2=yp2=aperture/2
|
xp2=yp2=aperture/2
|
||||||
|
|
||||||
xs = np.linspace(-screen_range/2, screen_range/2, num=resolution)
|
xs = np.linspace(-screen_range/2, screen_range/2, num=resolution) #Generate values to calculate for
|
||||||
intensities = []
|
intensities = []
|
||||||
|
|
||||||
constant = k/2*np.pi*z
|
constant = k/2*np.pi*z #Relative intensity constant
|
||||||
completion = 0
|
|
||||||
|
|
||||||
for x in tqdm(xs):
|
for x in tqdm(xs): #Loop through all values of x
|
||||||
realpart, realerror = integrate.dblquad(Fresnel2dreal, xp1, xp2, yp1, yp2, args=(y, x, k, z), epsabs=1e-10, epsrel=1e-10)
|
realpart, realerror = integrate.dblquad(Fresnel2dreal, xp1, xp2, yp1, yp2, args=(y, x, k, z), epsabs=1e-10, epsrel=1e-10) #Calculate both real and imaginary parts
|
||||||
imagpart, imagerror = integrate.dblquad(Fresnel2dimag, xp1, xp2, yp1, yp2, args=(y, x, k, z), epsabs=1e-10, epsrel=1e-10)
|
imagpart, imagerror = integrate.dblquad(Fresnel2dimag, xp1, xp2, yp1, yp2, args=(y, x, k, z), epsabs=1e-10, epsrel=1e-10)
|
||||||
|
|
||||||
I = c*e0*((realpart*constant)**2+(imagpart*constant)**2)
|
I = c*e0*((realpart*constant)**2+(imagpart*constant)**2) #Combine parts and constants to get intensity
|
||||||
intensities.append(I)
|
intensities.append(I) #Add calculated intensity to list
|
||||||
completion = completion + 100/resolution
|
|
||||||
print(completion)
|
|
||||||
return xs, intensities
|
return xs, intensities
|
||||||
|
|
||||||
ax = plt.axes()
|
ax = plt.axes()
|
||||||
xs, intensities = genData(aperture, z, k, screen_range, resolution)
|
xs, intensities = genData(aperture, z, k, screen_range, resolution) #Plot intensity against distance
|
||||||
ax.plot(xs, intensities)
|
ax.plot(xs, intensities)
|
||||||
# xs, intensities = genData(2e-5, 0.05, 8.377e6, 0.015)
|
# xs, intensities = genData(2e-5, 0.05, 8.377e6, 0.015)
|
||||||
# ax.plot(xs, intensities)
|
# ax.plot(xs, intensities)
|
||||||
plt.show()
|
plt.show()
|
||||||
|
|
||||||
def plot2Drectangular(aperture, z, k, screen_range, resolution):
|
def plot2Drectangular(aperture, z, k, screen_range, resolution): #Function for part 2
|
||||||
def genData(aperture, z, k, screen_range, resolution):
|
def genData(aperture, z, k, screen_range, resolution): #Function to generate data
|
||||||
xp1=yp1=-aperture/2
|
xp1=yp1=-aperture/2 #Set integration limits
|
||||||
xp2=yp2=aperture/2
|
xp2=yp2=aperture/2
|
||||||
|
|
||||||
xs = np.linspace(-screen_range/2, screen_range/2, num=resolution)
|
xs = np.linspace(-screen_range/2, screen_range/2, num=resolution) #Generate values to integrate for
|
||||||
ys = np.linspace(-screen_range/2, screen_range/2, num=resolution)
|
ys = np.linspace(-screen_range/2, screen_range/2, num=resolution)
|
||||||
|
|
||||||
intensities = []
|
intensities = []
|
||||||
|
|
||||||
constant = k/2*np.pi*z
|
constant = k/2*np.pi*z #Relative intensity constant
|
||||||
completion = 0
|
completion = 0
|
||||||
|
|
||||||
for y in tqdm(ys):
|
for y in tqdm(ys):
|
||||||
xIntensities = []
|
xIntensities = []
|
||||||
for x in xs:
|
for x in xs:
|
||||||
realpart, realerror = integrate.dblquad(Fresnel2dreal, xp1, xp2, yp1, yp2, args=(y, x, k, z), epsabs=1e-10, epsrel=1e-10)
|
realpart, realerror = integrate.dblquad(Fresnel2dreal, xp1, xp2, yp1, yp2, args=(y, x, k, z), epsabs=1e-10, epsrel=1e-10)#Calculate both parts
|
||||||
imagpart, imagerror = integrate.dblquad(Fresnel2dimag, xp1, xp2, yp1, yp2, args=(y, x, k, z), epsabs=1e-10, epsrel=1e-10)
|
imagpart, imagerror = integrate.dblquad(Fresnel2dimag, xp1, xp2, yp1, yp2, args=(y, x, k, z), epsabs=1e-10, epsrel=1e-10)
|
||||||
|
|
||||||
I = c*e0*((realpart*constant)**2+(imagpart*constant)**2)
|
I = c*e0*((realpart*constant)**2+(imagpart*constant)**2)#Combine both parts and constants
|
||||||
xIntensities.append(I)
|
xIntensities.append(I)
|
||||||
completion = completion + 100/resolution**2
|
|
||||||
print(completion)
|
|
||||||
intensities.append(xIntensities)
|
intensities.append(xIntensities)
|
||||||
intensities = np.array(intensities)
|
intensities = np.array(intensities)
|
||||||
return intensities
|
return intensities
|
||||||
|
|
||||||
intensity = genData(aperture, z, k, screen_range, resolution)
|
intensity = genData(aperture, z, k, screen_range, resolution) #Generate the data
|
||||||
extents = (-screen_range/2,screen_range/2,-screen_range/2,screen_range/2)
|
extents = (-screen_range/2,screen_range/2,-screen_range/2,screen_range/2) #Set limits of the plot
|
||||||
|
|
||||||
plt.imshow(intensity,vmin=0.0,vmax=1.0*intensity.max(),extent=extents,origin="lower",cmap="nipy_spectral_r")
|
plt.imshow(intensity,vmin=0.0,vmax=1.0*intensity.max(),extent=extents,origin="lower",cmap="nipy_spectral_r") #Plot the graphs
|
||||||
plt.colorbar()
|
plt.colorbar()
|
||||||
plt.show()
|
plt.show()
|
||||||
|
|
||||||
def plot2Dcircular(aperture, z, k, screen_range, resolution):
|
def plot2Dcircular(aperture, z, k, screen_range, resolution): #Function for part 3
|
||||||
def genData(aperture, z, k, screen_range, resolution):
|
def genData(aperture, z, k, screen_range, resolution):
|
||||||
xp1=-aperture/2
|
xp1=-aperture/2 #Set integration limits
|
||||||
xp2=aperture/2
|
xp2=aperture/2
|
||||||
|
|
||||||
def yp1func(xp):
|
def yp1func(xp):
|
||||||
return -np.sqrt((aperture/2)**2-(xp**2))
|
return -np.sqrt((aperture/2)**2-(xp**2)) #Define y limits in terms of x
|
||||||
|
|
||||||
def yp2func(xp):
|
def yp2func(xp):
|
||||||
return np.sqrt((aperture/2)**2-(xp**2))
|
return np.sqrt((aperture/2)**2-(xp**2))
|
||||||
|
|
||||||
xs = np.linspace(-screen_range/2, screen_range/2, num=resolution)
|
xs = np.linspace(-screen_range/2, screen_range/2, num=resolution) #Generate values to integrate for
|
||||||
ys = np.linspace(-screen_range/2, screen_range/2, num=resolution)
|
ys = np.linspace(-screen_range/2, screen_range/2, num=resolution)
|
||||||
|
|
||||||
intensities = []
|
intensities = []
|
||||||
|
|
@ -99,8 +94,8 @@ def plot2Dcircular(aperture, z, k, screen_range, resolution):
|
||||||
for y in tqdm(ys):
|
for y in tqdm(ys):
|
||||||
xIntensities = []
|
xIntensities = []
|
||||||
for x in xs:
|
for x in xs:
|
||||||
realpart, realerror = integrate.dblquad(Fresnel2dreal, xp1, xp2, yp1func, yp2func, args=(y, x, k, z))
|
realpart, realerror = integrate.dblquad(Fresnel2dreal, xp1, xp2, yp1func, yp2func, args=(y, x, k, z), epsabs=1e-10, epsrel=1e-10) #Calculate functions using circular limits
|
||||||
imagpart, imagerror = integrate.dblquad(Fresnel2dimag, xp1, xp2, yp1func, yp2func, args=(y, x, k, z))
|
imagpart, imagerror = integrate.dblquad(Fresnel2dimag, xp1, xp2, yp1func, yp2func, args=(y, x, k, z), epsabs=1e-10, epsrel=1e-10)
|
||||||
|
|
||||||
I = c*e0*((realpart*constant)**2+(imagpart*constant)**2)
|
I = c*e0*((realpart*constant)**2+(imagpart*constant)**2)
|
||||||
xIntensities.append(I)
|
xIntensities.append(I)
|
||||||
|
|
@ -115,32 +110,32 @@ def plot2Dcircular(aperture, z, k, screen_range, resolution):
|
||||||
plt.colorbar()
|
plt.colorbar()
|
||||||
plt.show()
|
plt.show()
|
||||||
|
|
||||||
def monte(aperture, z, k, screen_range, resolution, samples):
|
def monte(aperture, z, k, screen_range, resolution, samples): #Function for part 4
|
||||||
N = samples
|
N = samples #Number of samples
|
||||||
|
|
||||||
def doubleInteg(x, y, xp, yp, z, k, aperture):
|
def doubleInteg(x, y, xp, yp, z, k, aperture): #Function to return calculated values for each sample
|
||||||
values = []
|
values = []
|
||||||
for i in range(len(xp)):
|
for i in range(len(xp)):
|
||||||
if (xp[i]**2+yp[i]**2) > (aperture/2)**2:
|
if (xp[i]**2+yp[i]**2) > (aperture/2)**2: #Check if point is in the aperture
|
||||||
values.append(0)
|
values.append(0)
|
||||||
else:
|
else:
|
||||||
value = np.exp(((1j*k)/(2*z))*((x-xp[i])**2+(y-yp[i])**2))
|
value = np.exp(((1j*k)/(2*z))*((x-xp[i])**2+(y-yp[i])**2)) #Calculate value if in aperture
|
||||||
values.append(value.imag)
|
values.append(value.imag)
|
||||||
return np.array(values)
|
return np.array(values)
|
||||||
|
|
||||||
def monteCarlo(x, y, z, k, aperture):
|
def monteCarlo(x, y, z, k, aperture): #Perform onte carlo method
|
||||||
xp = np.random.uniform(low=(-aperture/2), high=aperture/2, size=N)
|
xp = np.random.uniform(low=(-aperture/2), high=aperture/2, size=N) #Generate random samples
|
||||||
yp = np.random.uniform(low=(-aperture/2), high=aperture/2, size=N)
|
yp = np.random.uniform(low=(-aperture/2), high=aperture/2, size=N)
|
||||||
values = doubleInteg(x, y, xp, yp, z, k , aperture)
|
values = doubleInteg(x, y, xp, yp, z, k , aperture) #Calculate value for each pair of samples
|
||||||
mean = values.sum()/N
|
mean = values.sum()/N
|
||||||
meansq = (values*values).sum()/N
|
meansq = (values*values).sum()/N
|
||||||
integral = aperture*mean
|
integral = aperture*mean #Calculate the integral end error
|
||||||
error = aperture*np.sqrt((meansq-mean*mean)/N)
|
error = aperture*np.sqrt((meansq-mean*mean)/N)
|
||||||
return integral, error
|
return integral, error
|
||||||
|
|
||||||
def genData(aperture, z, k, resolution, screen_range):
|
def genData(aperture, z, k, resolution, screen_range): ~Function to generate the data
|
||||||
|
|
||||||
xs = np.linspace(-screen_range/2, screen_range/2, num=resolution)
|
xs = np.linspace(-screen_range/2, screen_range/2, num=resolution) #Generate values to integrate for
|
||||||
ys = np.linspace(-screen_range/2, screen_range/2, num=resolution)
|
ys = np.linspace(-screen_range/2, screen_range/2, num=resolution)
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -152,32 +147,28 @@ def monte(aperture, z, k, screen_range, resolution, samples):
|
||||||
for y in tqdm(ys):
|
for y in tqdm(ys):
|
||||||
xIntensities = []
|
xIntensities = []
|
||||||
for x in tqdm(xs):
|
for x in tqdm(xs):
|
||||||
integral, error = monteCarlo(x, y, z, k, aperture)
|
integral, error = monteCarlo(x, y, z, k, aperture) #Find integral vaule using monte carlo method
|
||||||
I = c*e0*constant*integral
|
I = c*e0*constant*integral
|
||||||
if I < 0.005:
|
|
||||||
I = 0
|
|
||||||
# completion = completion + 100/resolution**2
|
|
||||||
# print(completion)
|
|
||||||
xIntensities.append(I)
|
xIntensities.append(I)
|
||||||
intensities.append(xIntensities)
|
intensities.append(xIntensities)
|
||||||
intensities = np.array(intensities)
|
intensities = np.array(intensities)
|
||||||
return intensities
|
return intensities
|
||||||
|
|
||||||
intensity = genData(aperture, z, k, resolution, screen_range)
|
intensity = genData(aperture, z, k, resolution, screen_range) #Generate data
|
||||||
extents = (-screen_range/2,screen_range/2,-screen_range/2,screen_range/2)
|
extents = (-screen_range/2,screen_range/2,-screen_range/2,screen_range/2)
|
||||||
|
|
||||||
plt.imshow(intensity,vmin=1.0*intensity.min(),vmax=1.0*intensity.max(),extent=extents,origin="lower",cmap="nipy_spectral_r")
|
plt.imshow(intensity,vmin=1.0*intensity.min(),vmax=1.0*intensity.max(),extent=extents,origin="lower",cmap="nipy_spectral_r")
|
||||||
plt.colorbar()
|
plt.colorbar()
|
||||||
plt.show()
|
plt.show()
|
||||||
|
|
||||||
MyInput = '0'
|
MyInput = '0' #Selection menu
|
||||||
while MyInput != 'q':
|
while MyInput != 'q':
|
||||||
MyInput = input('Enter a choice, "1", "2", "3", "4" or "q" to quit: ')
|
MyInput = input('Enter a choice, "1", "2", "3", "4" or "q" to quit: ')
|
||||||
print('You entered the choice: ',MyInput)
|
print('You entered the choice: ',MyInput)
|
||||||
if MyInput == '1':
|
if MyInput == '1':
|
||||||
print('You have chosen part (1): 1D rectangular diffraction')
|
print('You have chosen part (1): 1D rectangular diffraction')
|
||||||
aperture = input("Please input the desired aperture (m): ")
|
aperture = input("Please input the desired aperture (m): ")
|
||||||
z = input("Please enter the desired distnce from the screen (m): ")
|
z = input("Please enter the desired distance from the screen (m): ")
|
||||||
wl = input("Please enter the desired wavelength of light (m): ")
|
wl = input("Please enter the desired wavelength of light (m): ")
|
||||||
k = (2*np.pi)/float(wl)
|
k = (2*np.pi)/float(wl)
|
||||||
screen_range = input("Please enter the diameter of the screen (m): ")
|
screen_range = input("Please enter the diameter of the screen (m): ")
|
||||||
|
|
@ -186,7 +177,7 @@ while MyInput != 'q':
|
||||||
elif MyInput == '2':
|
elif MyInput == '2':
|
||||||
print('You have chosen part (2): 2D rectangular diffraction')
|
print('You have chosen part (2): 2D rectangular diffraction')
|
||||||
aperture = input("Please input the desired aperture (m): ")
|
aperture = input("Please input the desired aperture (m): ")
|
||||||
z = input("Please enter the desired distnce from the screen (m): ")
|
z = input("Please enter the desired distance from the screen (m): ")
|
||||||
wl = input("Please enter the desired wavelength of light (m): ")
|
wl = input("Please enter the desired wavelength of light (m): ")
|
||||||
k = (2*np.pi)/float(wl)
|
k = (2*np.pi)/float(wl)
|
||||||
screen_range = input("Please enter the diameter of the screen (m): ")
|
screen_range = input("Please enter the diameter of the screen (m): ")
|
||||||
|
|
@ -195,7 +186,7 @@ while MyInput != 'q':
|
||||||
elif MyInput == '3':
|
elif MyInput == '3':
|
||||||
print('You have chosen part (3): 2D circular diffraction')
|
print('You have chosen part (3): 2D circular diffraction')
|
||||||
aperture = input("Please input the desired aperture (m): ")
|
aperture = input("Please input the desired aperture (m): ")
|
||||||
z = input("Please enter the desired distnce from the screen (m): ")
|
z = input("Please enter the desired distance from the screen (m): ")
|
||||||
wl = input("Please enter the desired wavelength of light (m): ")
|
wl = input("Please enter the desired wavelength of light (m): ")
|
||||||
k = (2*np.pi)/float(wl)
|
k = (2*np.pi)/float(wl)
|
||||||
screen_range = input("Please enter the diameter of the screen (m): ")
|
screen_range = input("Please enter the diameter of the screen (m): ")
|
||||||
|
|
@ -204,7 +195,7 @@ while MyInput != 'q':
|
||||||
elif MyInput == '4':
|
elif MyInput == '4':
|
||||||
print('You have chosen part (3): 2D circular diffraction usinf Monte Carlo')
|
print('You have chosen part (3): 2D circular diffraction usinf Monte Carlo')
|
||||||
aperture = input("Please input the desired aperture (m): ")
|
aperture = input("Please input the desired aperture (m): ")
|
||||||
z = input("Please enter the desired distnce from the screen (m): ")
|
z = input("Please enter the desired distance from the screen (m): ")
|
||||||
wl = input("Please enter the desired wavelength of light (m): ")
|
wl = input("Please enter the desired wavelength of light (m): ")
|
||||||
k = (2*np.pi)/float(wl)
|
k = (2*np.pi)/float(wl)
|
||||||
screen_range = input("Please enter the diameter of the screen (m): ")
|
screen_range = input("Please enter the diameter of the screen (m): ")
|
||||||
|
|
|
||||||
|
|
@ -85,6 +85,8 @@ To allow for this to be calculated computtionally, we will simplify it, integrat
|
||||||
|
|
||||||
\section{Explanation of Code}
|
\section{Explanation of Code}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
\section{Results and Discussion}
|
\section{Results and Discussion}
|
||||||
|
|
||||||
\section{Conclusion}
|
\section{Conclusion}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue