149 lines
3.1 KiB
Python
149 lines
3.1 KiB
Python
|
# coding: utf-8
|
|||
|
|
|||
|
from __future__ import division, print_function, unicode_literals
|
|||
|
from lab import *
|
|||
|
import uncertainties.umath as um
|
|||
|
import uncertainties.unumpy as unp
|
|||
|
import numpy as np
|
|||
|
import matplotlib.pyplot as plt
|
|||
|
|
|||
|
# convert micrometer readings to SI unit
|
|||
|
length = lambda x,y,z: x*1e-4 + y*1/4*1e-4 + z*1e-6
|
|||
|
|
|||
|
##
|
|||
|
## Part I
|
|||
|
##
|
|||
|
|
|||
|
k = 60 # number of wavefronts
|
|||
|
l0 = ufloat(633, 1)*1e-9 # laser wavelength
|
|||
|
|
|||
|
# micrometer calibration
|
|||
|
d0 = k*l0/2 # expected value
|
|||
|
d = length(0,3,10) # measured value
|
|||
|
df = d - d0 # offset
|
|||
|
|
|||
|
# laser wavelength measure
|
|||
|
d = sample(length(*i)-df.n for i in [(0,3,9.5), (0,3,10),
|
|||
|
(0,3,10.5), (0,3,10)]).tval()
|
|||
|
l1 = 2*d/k
|
|||
|
|
|||
|
print(mformat('''
|
|||
|
# Part I (Fabry-Perot interferometer)
|
|||
|
offset: {} μm
|
|||
|
λ: {} nm
|
|||
|
''', df*1e6, l1*1e9))
|
|||
|
|
|||
|
|
|||
|
##
|
|||
|
## Part II
|
|||
|
##
|
|||
|
|
|||
|
df = length(2,0,1) # micrometer offset
|
|||
|
k = 70 # number of wavefronts
|
|||
|
|
|||
|
# laser wavelength measure
|
|||
|
d = sample(length(*i)-df for i in [(2,0,22.5), (2,0,23.5), (2,0,23.5),
|
|||
|
(2,0,23.5), (2,0,23), (2,0,23)]).tval()
|
|||
|
l2 = 2*d/k
|
|||
|
|
|||
|
print(mformat('''
|
|||
|
# Part II (Michelson interferometer)
|
|||
|
λ: {} nm''', l2*1e9))
|
|||
|
|
|||
|
|
|||
|
## compare wavelengths
|
|||
|
alpha = check_measures(l1, l2)
|
|||
|
l = combine_measures(l1, l2)
|
|||
|
|
|||
|
print(mformat('''
|
|||
|
comparibility test λ₁ - λ₂
|
|||
|
α={:.2f} α>ε: {}
|
|||
|
λbest: {} nm
|
|||
|
''', alpha, alpha>epsilon, l*1e9))
|
|||
|
|
|||
|
|
|||
|
|
|||
|
##
|
|||
|
## Part III
|
|||
|
##
|
|||
|
|
|||
|
d = 3e-2 # air cavity thickness
|
|||
|
Patm = 101.3e3 # atmosferic pressure
|
|||
|
|
|||
|
k = array(17, 20, 17, 18, 19) # number of wavefronts
|
|||
|
P = array(82e3, 83e3, 84e3, 83e3, 84e3) # gauge pressure
|
|||
|
|
|||
|
m = sample(*(k*l.n/(2*d*P)))
|
|||
|
|
|||
|
print(mformat('''
|
|||
|
# Part III (air refraction index)
|
|||
|
m: {} Pa⁻¹
|
|||
|
''', m.tval()))
|
|||
|
|
|||
|
|
|||
|
##
|
|||
|
## Part IV
|
|||
|
##
|
|||
|
|
|||
|
d = ufloat(6, 1)*1e-3 # glass pane thickness
|
|||
|
t = ufloat(12, 1)*np.pi/180 # angle
|
|||
|
k = sample(162, 112, 124, 122).tval() # number of wavefronts
|
|||
|
n = (2*d-k*l) / (2*d-k*l/(1-um.cos(t))) # refraction index
|
|||
|
|
|||
|
print(mformat('''
|
|||
|
# Part IV (glass refraction index)
|
|||
|
n: {}
|
|||
|
''', n))
|
|||
|
|
|||
|
|
|||
|
|
|||
|
##
|
|||
|
## Part V
|
|||
|
##
|
|||
|
|
|||
|
# peak position
|
|||
|
S = array(8.9, 10.7, 11.7, 12.7, 13.4,
|
|||
|
14.1, 14.7, 15.6, 16.3, 16.7,
|
|||
|
17.3, 18.0, 18.3, 18.9)*1e-2
|
|||
|
|
|||
|
# uncertainty
|
|||
|
sigmaS = 2e-3
|
|||
|
|
|||
|
# peak number
|
|||
|
n = np.arange(1, len(S))
|
|||
|
|
|||
|
d = ufloat(1e-3, 0) # slit length
|
|||
|
L = ufloat(125.1, 0.5)*1e-2 # screen distance
|
|||
|
ti = um.atan(S[0]/L) # incidence angle
|
|||
|
|
|||
|
# drop first peak
|
|||
|
S = S[1:]
|
|||
|
|
|||
|
x = np.linspace(0, 13, 200)
|
|||
|
peak = lambda n, t, l: L.n*np.sqrt(1/(np.cos(t)-n*l/d.n)**2 - 1)
|
|||
|
f, (tio, lo) = curve(n, S, peak, sigmaS, guess=[ti.n, l.n])
|
|||
|
|
|||
|
plt.xlabel('peak order')
|
|||
|
plt.ylabel('distance from center (m)')
|
|||
|
plt.errorbar(n, S, sigmaS, color='#604848', linestyle='', linewidth=1.1)
|
|||
|
plt.scatter(n, S, color='#a17e3e')
|
|||
|
plt.plot(x, f(x), color='#65788f')
|
|||
|
plt.show()
|
|||
|
|
|||
|
alpha = check_measures(l, lo)
|
|||
|
beta = chi_squared_fit(n, S, f, sigmaS)
|
|||
|
|
|||
|
print(mformat('''
|
|||
|
# Part V (ruler diffraction)
|
|||
|
λₒ: {} nm
|
|||
|
θₒ: {} rad
|
|||
|
|
|||
|
compatibility test λ - λₒ:
|
|||
|
α={:.2f}, α>ε: {}
|
|||
|
|
|||
|
χ² test:
|
|||
|
α={:.2f}, α>ε: {}
|
|||
|
''', lo*1e9, tio
|
|||
|
, alpha, alpha>epsilon
|
|||
|
, beta, beta>epsilon))
|