從物理學的機制出發,波動模型相對於光線模型,顯然更加接近光的本質;可是從物理學的發展來講,波動光學旨在解決幾何光學沒法解決的問題,可謂光線模型的一種升級。從編程的角度來講,波動光學在某些狀況下能夠簡單地理解爲在光線模型的基礎上,引入一個相位項。html
波動模型
通常來講,三個特徵能夠肯定空間中的波場:頻率、振幅和相位,故光波場可表示爲:python
E=Acos(ωt−kr)web
其中,
A爲振幅,
ω=2πf=T2π爲角頻率,
k=λ2π,爲波數。由上式可知,當時間固定時,光在傳播方向上有一個正弦波的外形;而對於空間中任意一點,沿着振幅方向也呈正弦波的規律上下振動。編程
其中,振幅、波數以及空間位置均爲矢量,當座標比較混亂的時候,也能夠寫成
E
=A
cos(ωt−k
r
);有時爲了計算方便,也能夠寫成指數形式app
E=Ae−i(ωt−kr)ide
對於平面波來講,其發散角爲0,即光場中的全部點,都具備統一的傳播方向,且振幅相等。設其傳播方向爲
z,則可寫爲svg
E=Acos(ωt−kz)ui
球面波則相對複雜,令
r爲空間中任意一點到點光源的距離,則對於
a、b兩點來講,其單位面積的光通量之比爲
IbIa=ra2rb2,則振幅之比爲
EaEb=rbra。這說明球面波振幅反比于波陣面到光源距離,即spa
E=rA
e−i(ωt−k
r
)3d
經過截取
xOz平面,假設光波長爲532nm,則能夠畫出這一截面處的光波振幅圖。
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
z = np.arange(15,200)*10
x = np.arange(15,200)*10
x,z = np.meshgrid(x,z)
E = 1/np.sqrt(x**2+z**2)*np.cos(2*np.pi*np.sqrt(x**2+z**2)/(532*1e-9))
fig = plt.figure()
ax = Axes3D(fig)
ax.plot_surface(x,z,E)
plt.show()
其結果如圖所示
菲涅耳公式
幾何光學能夠經過費馬原理獲得折射定律,可是沒法獲知光波的透過率,菲涅耳公式在幾何光學的基礎上,解決了這個問題。
因爲光是一羣橫波的集合,故能夠根據其電矢量的震動方向,將其分爲平行入射面與垂直入射面的兩個份量,分別用
p份量和
s份量來表示。一束光在兩介質交界處發生折射,兩介質折射率分別爲
n1和
n2,對於
p光來講,其電矢量平行於入射面,其磁矢量則垂直於入射面,即只有
s份量;而對於
s光來講,則偏偏相反,如圖所示。
則對於
p光來講即
{EpBs=Ep0ei(k(n^⋅r)−ωt)=Bs0ei(k(n^⋅r)−ωt)
在
n1、
n2平面內,其波數分別爲
k1=2πn1/λ,
k1=2πn2/λ,則入射波、反射波和透射波分別能夠寫爲
⎩⎪⎪⎨⎪⎪⎧EiErEt=Ei0ei[k1(sinθix−cosθiy)−ωt]=Er0ei[k1(sinθrx+cosθry)−ωt]=Et0ei[k2(sinθtx−cosθty)−ωt]
其角度關係爲
θi=θr
n1sinθi=n2sinθt
則波數之間的關係爲
k1sinθi=k1sinθr=k2sinθt
又因在界面上,反射波和透射波在x軸上的投影必然等於入射波,故對於電矢量而言,有
cosθiEi0=cosθrEr0+cosθtEt0
對於磁矢量而言,有
n1Bi0+n1Br0=n2Bt0→n1Ei0+n1Er0=n2Et0
令振幅反射係數和透射係數分別爲
rp=Ei0Er0,tp=Ei0Et0
則有
{cosθrrp+cosθttpn1rp−n2tp=cosθi=−n1
s光的計算方法與之相似,最後獲得
⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧rptprsts=n2cosθi+n11−(n1/n2)2sin2θi
n2cosθi−n11−(n1/n2)2sin2θi
=n2cosθi+n11−(n1/n2)2sin2θi
2n1cosθi=n1cosθi+n21−(n1/n2)2sin2θi
n1cosθi−n21−(n1/n2)2sin2θi
=n1cosθi+n21−(n1/n2)2sin2θi
2n1cosθi
咱們能夠經過python繪製出當入射光的角度不一樣時,其振幅反射率和透過率的變化
import matplotlib.pyplot as plt
import numpy as np
def fresnel(theta, n1, n2):
theta = theta*np.pi/180
xTheta = np.cos(theta)
mid = np.sqrt(1-(n1/n2*np.sin(theta))**2)
rp = (n2*xTheta-n1*mid)/(n2*xTheta+n1*mid)
rs = (n1*xTheta-n2*mid)/(n1*xTheta+n2*mid)
tp = 2*n1*xTheta/(n2*xTheta+n1*mid)
ts = 2*n1*xTheta/(n1*xTheta+n2*mid)
return rp, rs, tp, ts
def testFres(n1=1,n2=1.45):
theta = np.arange(0,90,0.1)+0j
a = theta*np.pi/180
rp,rs,tp,ts = fresnel(theta,n1,n2)
fig = plt.figure(1)
plt.subplot(1,2,1)
plt.plot(theta,rp,'-',label='rp')
plt.plot(theta,rs,'-.',label='rs')
plt.plot(theta,np.abs(rp),'--',label='|rp|')
plt.plot(theta,np.abs(rs),':',label='|rs|')
plt.legend()
plt.subplot(1,2,2)
plt.plot(theta,tp,'-',label='tp')
plt.plot(theta,ts,'-.',label='ts')
plt.plot(theta,np.abs(tp),'--',label='|tp|')
plt.plot(theta,np.abs(ts),':',label='|ts|')
plt.legend()
plt.show()
if __init__=="__main__":
testFres()
獲得其圖像爲
因爲強度與振幅之間存在一個平方的關係,因此強度反射率和透過率爲
∣r∣2、
n1n2∣t∣2。而能流與強度之間還須要除以一個橫截面積,故能流反射率和透過率分別爲:
⎩⎪⎨⎪⎧RT=∣r∣2=n1cosθi∣t∣2n2cosθt
經過python進行繪圖,將上面程序中的testFres
改成如下代碼便可。
def testFres(n1=1,n2=1.45):
theta = np.arange(0,90,0.1)+0j
a = theta*np.pi/180
rp,rs,tp,ts = fml.fresnel(theta,n1,n2)
Rp = np.abs(rp)**2
Rs = np.abs(rs)**2
Rn = (Rp+Rs)/2
Tp = n2*np.sqrt(1-(n1/n2*np.sin(a))**2)/(n1*np.cos(a))*np.abs(tp)**2
Ts = n2*np.sqrt(1-(n1/n2*np.sin(a))**2)/(n1*np.cos(a))*np.abs(ts)**2
Tn = (Tp+Ts)/2
fig = plt.figure(2)
plt.subplot(1,2,1)
plt.plot(theta,Rp,'-',label='R_p')
plt.plot(theta,Rs,'-.',label='R_s')
plt.plot(theta,Rn,'-',label='R_n')
plt.legend()
plt.subplot(1,2,2)
plt.plot(theta,Tp,'-',label='T_p')
plt.plot(theta,Ts,'-.',label='T_s')
plt.plot(theta,Tn,'--',label='T_n')
plt.legend()
plt.show()
得