193 lines
4.4 KiB
Python
193 lines
4.4 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 degrees to radians
|
||
angle = lambda x, y, z: (x + y/60 + z/3600) * np.pi/180
|
||
|
||
t0 = angle(180,0,0) # angle offset
|
||
te = angle(0,0,1) # angle uncertainty
|
||
|
||
|
||
|
||
##
|
||
## Part I
|
||
##
|
||
|
||
l = 5893e-10 # sodium doublet wavelength
|
||
n = array(1, 2) # line order
|
||
|
||
# line angles
|
||
t = array(angle(200,0,16) - angle(159,0,8),
|
||
angle(225,0,24) - angle(134,1,5))/2
|
||
|
||
# spacing (m⁻¹)
|
||
d = ufloat((n*l/np.sin(t)).mean(), 0.01e-6)
|
||
|
||
print(mformat('''
|
||
# Part I: diffraction grating spacing
|
||
|
||
## Na lamp
|
||
d: {} lines/mm
|
||
''', 1/d*1e-3))
|
||
|
||
|
||
##
|
||
## Part II
|
||
##
|
||
|
||
|
||
## lamp B
|
||
|
||
# line angles
|
||
t = uarray(te, angle(195,0,2 ), # violet
|
||
angle(195,0,15),
|
||
angle(195,1,1 ),
|
||
angle(195,1,20),
|
||
angle(195,1,30),
|
||
angle(199,1,9 ), # green
|
||
angle(200,1,21)) # orange
|
||
|
||
# wavelengths
|
||
l = d*unp.sin(t-t0)
|
||
|
||
print('''
|
||
# Part II
|
||
|
||
## lamp B - Xe?
|
||
λ:''', '\n '.join(mformat('{}', i) for i in l*1e9), 'nm')
|
||
|
||
|
||
## lamp C
|
||
|
||
# line angles
|
||
t = uarray(te, angle(193,1,11), # violet
|
||
angle(195,1,14),
|
||
angle(196,1,11), # green
|
||
angle(197,0,25),
|
||
angle(197,1,23),
|
||
angle(200,1,27),
|
||
angle(204,0,1 ))
|
||
|
||
# wavelengths
|
||
l = d*unp.sin(t-t0)
|
||
|
||
print('''
|
||
## lamp C - Kr?
|
||
λ:''', '\n '.join(mformat('{}', i) for i in l*1e9), 'nm')
|
||
|
||
|
||
|
||
## lamp D
|
||
|
||
# line angles
|
||
t = uarray(te, angle(194,1,12), # violet
|
||
angle(194,1,23),
|
||
angle(195,0,8 ),
|
||
angle(195,0,15),
|
||
angle(195,0,25),
|
||
angle(196,0,2 ), # blue
|
||
angle(196,0,10),
|
||
angle(196,1,13), # green
|
||
angle(198,0,15),
|
||
angle(198,0,22),
|
||
angle(198,1,5 ),
|
||
angle(199,1,2 ), # yellow
|
||
angle(199,1,12),
|
||
angle(200,0,0 ),
|
||
angle(200,0,11), # orange
|
||
angle(200,0,23),
|
||
angle(201,0,2 ),
|
||
angle(201,0,8 ),
|
||
angle(201,1,11)) # red
|
||
|
||
# wavelengths
|
||
l = d*unp.sin(t-t0)
|
||
|
||
print('''
|
||
## lamp D
|
||
λ:''', '\n '.join(mformat('{}', i) for i in l*1e9), 'nm')
|
||
|
||
|
||
##
|
||
## Part III
|
||
##
|
||
|
||
## Hg lamp
|
||
|
||
# prism angle
|
||
a = ufloat(angle(60,0,0), te)
|
||
|
||
# spectral line angles
|
||
t = array(
|
||
(angle(230,50,11), angle(230,44, 1), angle(230,1,21), angle(229,1,19), angle(228,16,4), angle(228,1,25), angle(228,1,19)),
|
||
(angle(230,50,25), angle(230,44,10), angle(230,1,28), angle(229,1,21), angle(228,16,4), angle(228,1,22), angle(228,1,21)),
|
||
(angle(230,50,11), angle(230,44, 5), angle(230,1,15), angle(229,1,12), angle(228,16,3), angle(228,1,13), angle(228,1,12)),
|
||
(angle(230,50,15), angle(230,44, 7), angle(230,1,20), angle(229,1,14), angle(228,16,2), angle(228,1,11), angle(228,1,10)))
|
||
|
||
# calculate mean values
|
||
t = uarray(1e-3, *map(np.mean, t.T))
|
||
|
||
# refractive index
|
||
n = unp.sin((a+t-t0)/2) / unp.sin(a/2)
|
||
|
||
# spectral lines wavelengths
|
||
l = array(4047e-10, # violet I
|
||
4077e-10, # violet II
|
||
4358e-10, # blue
|
||
4916e-10, # green I
|
||
5460e-10, # green II
|
||
5769e-10, # yellow I
|
||
5790e-10) # yellow II
|
||
|
||
# fit and plot n(λ)
|
||
f, (a,b) = curve(l, nominal(n), lambda x, a, b: a+b/x**2, sigma(n), guess=[1, 0.001])
|
||
alpha = chi_squared_fit(l, nominal(n), f, sigma(n))
|
||
x = np.linspace(400e-9, 580e-9, 100)
|
||
|
||
print(mformat('''
|
||
# Part III
|
||
|
||
## Hg lamp
|
||
a: {}
|
||
b: {}
|
||
|
||
χ² test: α={}
|
||
''', a, b, alpha))
|
||
|
||
plt.figure(1)
|
||
plt.xlabel('wavelength (nm)')
|
||
plt.ylabel('refractive index')
|
||
plt.scatter(l*1e9, nominal(n), color='#4f28fc')
|
||
plt.errorbar(l*1e9, nominal(n), yerr=sigma(n), linestyle='', color='#286bfc')
|
||
plt.plot(x*1e9, f(x), color='#5671c9')
|
||
plt.show()
|
||
|
||
|
||
## lamp B
|
||
t = array(angle(124,1,15), # violet
|
||
angle(125,0,0 ),
|
||
angle(125,0,5 ),
|
||
angle(125,0,16), # blue
|
||
angle(125,0,24),
|
||
angle(127,0,0 ), # green
|
||
angle(127,0,19), # yellow
|
||
angle(127,0,26), # orange
|
||
angle(127,1,12), # red
|
||
angle(128,0,25)) # red
|
||
|
||
## lamp C
|
||
t = array(angle(232,1,24), # red
|
||
angle(233,0,18),
|
||
angle(234,1,1 ), # yellow
|
||
angle(236,1,3 ), # green
|
||
angle(237,0,7 ),
|
||
angle(237,1,28), # blue
|
||
angle(239,0,10)) # violet
|