In [12]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit # import the curve fitting function
%matplotlib inline
In [13]:
df = pd.read_excel('SpectralData.xlsx', sheetname=None)
In [14]:
df['Hydrogen']
Out[14]:
In [15]:
df['Mercury']
Out[15]:
In [16]:
#Degrees
HRed = np.array([df['Hydrogen']['Angles'][i] for i in np.arange(0,len(df['Hydrogen']['Angles']),3) ])
HTeal = np.array([df['Hydrogen']['Angles'][i] for i in np.arange(1,len(df['Hydrogen']['Angles']),3) ])
HViolet = np.array([df['Hydrogen']['Angles'][i] for i in np.arange(2,len(df['Hydrogen']['Angles']),3) ])
#Add Minutes
HRed = HRed + np.array([df['Hydrogen']['Minute'][i] for i in np.arange(0,len(df['Hydrogen']['Minute']),3) ])/60
HTeal = HTeal + np.array([df['Hydrogen']['Minute'][i] for i in np.arange(1,len(df['Hydrogen']['Minute']),3) ])/60
HViolet = HViolet + np.array([df['Hydrogen']['Minute'][i] for i in np.arange(2,len(df['Hydrogen']['Minute']),3) ])/60
# Standard deviation of the mean
HRedStd = np.std(HRed)/np.sqrt(3)
HTealStd = np.std(HTeal)/np.sqrt(3)
HVioletStd = np.std(HViolet)/np.sqrt(3)
# Averaging
HRed = np.mean(HRed)
HTeal = np.mean(HTeal)
HViolet = np.mean(HViolet)
# True angle is difference from 180
HRed = abs(HRed - 180)
HTeal = abs(HTeal - 180)
HViolet = abs(HViolet-180)
In [17]:
#Degrees
HRedCCW = np.array([df['Hydrogen']['AnglesCCW'][i] for i in np.arange(0,len(df['Hydrogen']['AnglesCCW']),3) ])
HTealCCW = np.array([df['Hydrogen']['AnglesCCW'][i] for i in np.arange(1,len(df['Hydrogen']['AnglesCCW']),3) ])
HVioletCCW = np.array([df['Hydrogen']['AnglesCCW'][i] for i in np.arange(2,len(df['Hydrogen']['AnglesCCW']),3) ])
#Add Minutes
HRedCCW = HRedCCW + np.array([df['Hydrogen']['MinuteCCW'][i] for i in np.arange(0,len(df['Hydrogen']['MinuteCCW']),3) ])/60
HTealCCW = HTealCCW + np.array([df['Hydrogen']['MinuteCCW'][i] for i in np.arange(1,len(df['Hydrogen']['MinuteCCW']),3) ])/60
HVioletCCW = HVioletCCW + np.array([df['Hydrogen']['MinuteCCW'][i] for i in np.arange(2,len(df['Hydrogen']['MinuteCCW']),3) ])/60
# Standard deviation of the mean
HRedCCWStd = np.std(HRedCCW)/np.sqrt(3)
HTealCCWStd = np.std(HTealCCW)/np.sqrt(3)
HVioletCCWStd = np.std(HVioletCCW)/np.sqrt(3)
#Averaging
HRedCCW = np.mean(HRedCCW)
HTealCCW = np.mean(HTealCCW)
HVioletCCW = np.mean(HVioletCCW)
# True angle is difference from 180
HRedCCW = abs(HRedCCW - 180)
HTealCCW = abs(HTealCCW - 180)
HVioletCCW = abs(HVioletCCW-180)
In [18]:
HRed
Out[18]:
In [19]:
HRedStd
Out[19]:
In [20]:
HRedCCWStd
Out[20]:
In [7]:
# Average CW and CCW
HRed = (HRed + HRedCCW)/2
HTeal = (HTeal + HTealCCW)/2
HViolet = (HViolet + HVioletCCW)/2
HRedStd = (HRedStd + HRedCCWStd)/2
HTealStd = (HTealStd + HTealCCWStd)/2
HVioletStd = (HVioletStd + HVioletCCWStd)/2
# Convert to radians
HRed = np.deg2rad(HRed)
HTeal = np.deg2rad(HTeal)
HViolet = np.deg2rad(HViolet)
HRedStd = np.deg2rad(HRedStd)
HTealStd = np.deg2rad(HTealStd)
HVioletStd = np.deg2rad(HVioletStd)
print('HRed = %.7f +/-%.7f Radians' % (HRed,HRedStd))
print('HTeal = %.7f +/-%.7f Radians' % (HTeal,HTealStd))
print('HViolet = %.7f +/-%.7f Radians' % (HViolet,HVioletStd))
In [21]:
#Degrees
HgY1 = np.array([df['Mercury']['Angles'][i] for i in np.arange(0,len(df['Mercury']['Angles']),5) ])
HgY2 = np.array([df['Mercury']['Angles'][i] for i in np.arange(1,len(df['Mercury']['Angles']),5) ])
HgG = np.array([df['Mercury']['Angles'][i] for i in np.arange(2,len(df['Mercury']['Angles']),5) ])
HgB = np.array([df['Mercury']['Angles'][i] for i in np.arange(3,len(df['Mercury']['Angles']),5) ])
HgV = np.array([df['Mercury']['Angles'][i] for i in np.arange(4,len(df['Mercury']['Angles']),5) ])
#Add Minutes
HgY1 = HgY1 + np.array([df['Mercury']['Minute'][i] for i in np.arange(0,len(df['Mercury']['Minute']),5) ])/60
HgY2 = HgY2 + np.array([df['Mercury']['Minute'][i] for i in np.arange(1,len(df['Mercury']['Minute']),5) ])/60
HgG = HgG + np.array([df['Mercury']['Minute'][i] for i in np.arange(2,len(df['Mercury']['Minute']),5) ])/60
HgB = HgB + np.array([df['Mercury']['Minute'][i] for i in np.arange(3,len(df['Mercury']['Minute']),5) ])/60
HgV = HgV + np.array([df['Mercury']['Minute'][i] for i in np.arange(4,len(df['Mercury']['Minute']),5) ])/60
# Averaging
HgY1 = np.mean(HgY1)
HgY2 = np.mean(HgY2)
HgG = np.mean(HgG)
HgB = np.mean(HgB)
HgV = np.mean(HgV)
# True angle is difference from 180
HgY1 = abs(HgY1-180)
HgY2 = abs(HgY2 - 180)
HgG = abs(HgG-180)
HgB = abs(HgB-180)
HgV = abs(HgV-180)
In [22]:
#Degrees
HgY1CCW = np.array([df['Mercury']['AnglesCCW'][i] for i in np.arange(0,len(df['Mercury']['AnglesCCW']),5) ])
HgY2CCW = np.array([df['Mercury']['AnglesCCW'][i] for i in np.arange(1,len(df['Mercury']['AnglesCCW']),5) ])
HgGCCW = np.array([df['Mercury']['AnglesCCW'][i] for i in np.arange(2,len(df['Mercury']['AnglesCCW']),5) ])
HgBCCW = np.array([df['Mercury']['AnglesCCW'][i] for i in np.arange(3,len(df['Mercury']['AnglesCCW']),5) ])
HgVCCW = np.array([df['Mercury']['AnglesCCW'][i] for i in np.arange(4,len(df['Mercury']['AnglesCCW']),5) ])
#Add Minutes
HgY1CCW = HgY1CCW + np.array([df['Mercury']['MinuteCCW'][i] for i in np.arange(0,len(df['Mercury']['MinuteCCW']),5) ])/60
HgY2CCW = HgY2CCW + np.array([df['Mercury']['MinuteCCW'][i] for i in np.arange(1,len(df['Mercury']['MinuteCCW']),5) ])/60
HgGCCW = HgGCCW + np.array([df['Mercury']['MinuteCCW'][i] for i in np.arange(2,len(df['Mercury']['MinuteCCW']),5) ])/60
HgBCCW = HgBCCW + np.array([df['Mercury']['MinuteCCW'][i] for i in np.arange(3,len(df['Mercury']['MinuteCCW']),5) ])/60
HgVCCW = HgVCCW + np.array([df['Mercury']['MinuteCCW'][i] for i in np.arange(4,len(df['Mercury']['MinuteCCW']),5) ])/60
# Averaging
HgY1CCW = np.mean(HgY1CCW)
HgY2CCW = np.mean(HgY2CCW)
HgGCCW = np.mean(HgGCCW)
HgBCCW = np.mean(HgBCCW)
HgVCCW = np.mean(HgVCCW)
# True angle is difference from 180
HgY1CCW = abs(HgY1CCW-180)
HgY2CCW = abs(HgY2CCW -180)
HgGCCW = abs(HgGCCW-180)
HgBCCW = abs(HgBCCW-180)
HgVCCW = abs(HgVCCW-180)
In [49]:
HgVCCW
Out[49]:
In [50]:
HVioletCCWStd
Out[50]:
In [10]:
# Average CW and CCW
HgYellow1 = (HgY1 + HgY1CCW)/2
HgYellow2 = (HgY2 + HgY2CCW)/2
HgGreen = (HgG + HgGCCW)/2
HgBlue = (HgB + HgBCCW)/2
HgViolet = (HgV + HgVCCW)/2
#Approximating uncertainty based on Hydrogen measurements.
HgYellow1Std = HRedStd
HgYellow2Std = HRedStd
HgGreenStd = HTealStd
HgBlueStd = HTealStd
HgVioletStd = HVioletStd
# Convert to radians
HgYellow1 = np.deg2rad(HgYellow1)
HgYellow2 = np.deg2rad(HgYellow2)
HgGreen = np.deg2rad(HgGreen)
HgBlue = np.deg2rad(HgBlue)
HgViolet = np.deg2rad(HgViolet)
#Std are already in radians
print('HgYellow1 = %.7f +/-%.7f Radians' % (HgYellow1,HgYellow1Std))
print('HgYellow2 = %.7f +/-%.7f Radians' % (HgYellow2,HgYellow2Std))
print('HgGreen = %.7f +/-%.7f Radians' % (HgGreen,HgGreenStd))
print('HgBlue = %.7f +/-%.7f Radians' % (HgBlue,HgBlueStd))
print('HgViolet = %.7f +/-%.7f Radians' % (HgViolet,HgVioletStd))
In [11]:
d = 1/(3*1e5)
In [12]:
def wavelength(theta):
#Theta in radians
return d*np.sin(theta)
In [13]:
def uncertainty(theta):
delta_d = 1.2*1e-8 #From text
delta_theta = np.deg2rad(2/60) #Three minute uncertainty from Visual and Tool.
return abs(np.sin(theta)*delta_d) + abs(d*np.cos(theta)*delta_theta)
In [14]:
HWave = np.array([
wavelength(HRed),
wavelength(HTeal),
wavelength(HViolet)
])
HWave = HWave*1e9 #Observed Hydrogen spectrum in nm
HWave
Out[14]:
In [15]:
HAngles = np.array([HRed,HTeal,HViolet])
In [16]:
HWaveu = np.array([uncertainty(entry) for entry in HAngles])*1e9
HWaveu
Out[16]:
In [17]:
HWaveStd = np.array([
wavelength(HRedStd),
wavelength(HTealStd),
wavelength(HVioletStd),
])
HWaveStd = HWaveStd*1e9 #Observed Hydrogen spectrum in nm
HWaveStd
Out[17]:
In [18]:
HgWave = np.array([
wavelength(HgYellow1),
wavelength(HgYellow2),
wavelength(HgGreen),
wavelength(HgBlue),
wavelength(HgViolet)
])
HgWave = HgWave*1e9 #Observed Hydrogen spectrum in nm
HgWave
Out[18]:
In [19]:
HgAngles = np.array([HgYellow1, HgYellow2, HgGreen, HgBlue, HgViolet])
In [20]:
Hgu = np.array([uncertainty(entry) for entry in HgAngles])
In [21]:
Hgu
Out[21]:
In [22]:
HgWaveStd = np.array([
wavelength(HgYellow1Std),
wavelength(HgYellow2Std),
wavelength(HgGreenStd),
wavelength(HgBlueStd),
wavelength(HgVioletStd)
])
HgWaveStd = HgWaveStd*1e9 #Observed Hydrogen spectrum in nm
HgWaveStd
Out[22]:
In [23]:
from IPython.display import Latex
In [24]:
print('HRed = %.1f +/-%.1f (nm)' % (HWave[0],HWaveStd[0]))
print('HTeal = %.1f +/-%.1f (nm)' % (HWave[1],HWaveStd[1]))
print('HViolet = %.1f +/-%.1f (nm)' % (HWave[2],HWaveStd[2]))
In [25]:
print('HgYellow1 = %.1f +/-%.1f (nm)' % (HgWave[0],HgWaveStd[0]))
print('HgYellow2 = %.1f +/-%.1f (nm)' % (HgWave[1],HgWaveStd[1]))
print('HgGreen = %.1f +/-%.1f (nm)' % (HgWave[2],HgWaveStd[2]))
print('HgBlue = %.1f +/-%.1f (nm)' % (HgWave[3],HgWaveStd[3]))
print('HgViolet = %.1f +/-%.1f (nm)' % (HgWave[4],HgWaveStd[4]))
In [26]:
h = 6.6261*1e-34 #Plancks constant Js
e = 1.6022*1e-19 #Electron Charge C
c = 2.9989*1e8 #Light Speed m/s
hc_ev = h*c/e
E_r = 13.60 #Ionization energy. eV
def HSpectrum(n):
q = 1/(1/4 - 1/(n**2))
return (hc_ev*q/E_r)*1e9 #Emitted wavelength in nm
In [27]:
HSpectrum(3)
Out[27]:
In [28]:
HSpectrum(4)
Out[28]:
In [29]:
HSpectrum(5)
Out[29]:
Then our recorded wavelengths for Hydrogen correspond to $n_o$ = 3, 4, and 5.
In [30]:
nH = np.array([3,4,5])
q_array = np.array([1/(1/4 - 1/(entry**2)) for entry in nH])
In [31]:
plt.figure(figsize=(12,6))
plt.errorbar(q_array,HWave,HWaveStd,linestyle = '',marker = 'o');
plt.xlabel('$q = (1/4 - 1/n^2)^{-1}$',size=20);
plt.ylabel('$\lambda = (hc/E_r)q$ (nm)', size = 20);
plt.xticks(size=12);
plt.yticks(size=12);
plt.xlim(4,8);
plt.ylim(300,800);
In [32]:
def myfun(x,m):
ans = m*x # this is y, "the function to be fit"
return ans
In [33]:
p0 = [1240/13.6]
In [34]:
xlots = np.linspace(-1,7.5,50) # need lots of data points for smooth curve
yfit = np.zeros((len(nH),xlots.size))
plsq, pcov = curve_fit(myfun, q_array, HWave, p0, HWaveu) # curve fit returns p and covariance matrix
# these give the parameters and the uncertainties
m = plsq[0]
em = np.sqrt(pcov[0,0])
yfit = myfun(xlots,plsq[0]) # use fit results for a, b, c
print('hc/E_r = %.2f +/- %.2f nm' % (plsq[0], np.sqrt(pcov[0,0])))
In [35]:
plt.figure(figsize=(14,8))
plt.errorbar(q_array,HWave,HWaveStd,linestyle = '',marker = 'o');
plt.xlabel('q',size=20);
plt.xlabel('$q = (1/4 - 1/n^2)^{-1}$',size=30);
plt.ylabel('$\lambda = (hc/E_r)q$ (nm)', size = 30);
plt.text(4, 700, 'Slope = %.2f $\pm$ %.2f nm' %(m,em), fontsize=30)
plt.xticks(size=20);
plt.yticks(size=20);
plt.xlim(3.75,7.5);
plt.ylim(250,800);
plt.plot(xlots,yfit);
plt.savefig('Rhydberg')
In [36]:
hc_ev*1e9
Out[36]:
In [37]:
E_r = hc_ev/m
E_r = E_r*1e9 #nm was used in the calculation above. Converting to eV
E_r
Out[37]:
In [38]:
dE_r = (hc_ev/(m**2))*em
dE_r = dE_r*1e9 #nm was used in the calculation above. Converting to eV
dE_r
Out[38]:
In [39]:
print('E_r = %.2f +/- %.2f eV' % (E_r, dE_r))
In [40]:
def energy(wavelength):
return hc_ev/wavelength
In [41]:
HgWave
Out[41]:
In [42]:
HgEnergies = np.array([energy(entry)*1e9 for entry in HgWave]) #In eV
HgEnergies
Out[42]:
In [ ]: