从物理学的机制出发,波动模型相对于光线模型,显然更加接近光的本质;但是从物理学的发展来说,波动光学旨在解决几何光学无法解决的问题,可谓光线模型的一种升级。从编程的角度来说,波动光学在某些情况下可以简单地理解为在光线模型的基础上,引入一个相位项。
一般来说,三个特征可以确定空间中的波场:频率、振幅和相位,故光波场可表示为:
E = A c o s ( ω t − k r ) E = Acos(\omega t-kr) E=Acos(ωt−kr)
其中, A A A为振幅, ω = 2 π f = 2 π T \omega=2\pi f=\frac{2\pi}{T} ω=2πf=T2π为角频率, k = 2 π λ k=\frac{2\pi}{\lambda} k=λ2π,为波数。由上式可知,当时间固定时,光在传播方向上有一个正弦波的外形;而对于空间中任意一点,沿着振幅方向也呈正弦波的规律上下振动。
其中,振幅、波数以及空间位置均为矢量,当坐标比较混乱的时候,也可以写成 E ⃗ = A ⃗ c o s ( ω t − k ⃗ r ⃗ ) \vec E = \vec{A}cos(\omega t-\vec k\vec r) E=Acos(ωt−kr);有时为了计算方便,也可以写成指数形式
E = A e − i ( ω t − k r ) E = Ae^{-i(\omega t-kr)} E=Ae−i(ωt−kr)
对于平面波来说,其发散角为0,即光场中的所有点,都具有统一的传播方向,且振幅相等。设其传播方向为 z z z,则可写为
E = A c o s ( ω t − k z ) E = Acos(\omega t-kz) E=Acos(ωt−kz)
球面波则相对复杂,令 r r r为空间中任意一点到点光源的距离,则对于 a 、 b a、b a、b两点来说,其单位面积的光通量之比为 I a I b = r b 2 r a 2 \frac{I_a}{I_b}=\frac{r^2_b}{r^2_a} IbIa=ra2rb2,则振幅之比为 E b E a = r a r b \frac{E_b}{E_a}=\frac{r_a}{r_b} EaEb=rbra。这说明球面波振幅反比于波阵面到光源距离,即
E = A ⃗ r e − i ( ω t − k ⃗ r ⃗ ) E = \frac{\vec A}{r}e^{-i(\omega t-\vec k\vec r)} E=rAe−i(ωt−kr)
通过截取 x O z xOz xOz平面,假设光波长为532nm,则可以画出这一截面处的光波振幅图。
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
z = np.arange(15,200)*10 #单位为nm
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 p p分量和 s s s分量来表示。一束光在两介质交界处发生折射,两介质折射率分别为 n 1 n_1 n1和 n 2 n_2 n2,对于 p p p光来说,其电矢量平行于入射面,其磁矢量则垂直于入射面,即只有 s s s分量;而对于 s s s光来说,则恰恰相反,如图所示。
则对于 p p p光来说即
{ E p = E p 0 e i ( k ( n ^ ⋅ r ) − ω t ) B s = B s 0 e i ( k ( n ^ ⋅ r ) − ω t ) \left\{ \begin{aligned} E_p&=E_{p0}e^{i(k(\hat{n}\cdot r)-\omega t)}\\ B_s&=B_{s0}e^{i(k(\hat{n}\cdot r)-\omega t)} \end{aligned}\right. {EpBs=Ep0ei(k(n^⋅r)−ωt)=Bs0ei(k(n^⋅r)−ωt)
在 n 1 n_1 n1、 n 2 n_2 n2平面内,其波数分别为 k 1 = 2 π n 1 / λ k_1=2\pi n_1/\lambda k1=2πn1/λ, k 1 = 2 π n 2 / λ k_1=2\pi n_2/\lambda k1=2πn2/λ,则入射波、反射波和透射波分别可以写为
{ E i = E i 0 e i [ k 1 ( s i n θ i x − c o s θ i y ) − ω t ] E r = E r 0 e i [ k 1 ( s i n θ r x + c o s θ r y ) − ω t ] E t = E t 0 e i [ k 2 ( s i n θ t x − c o s θ t y ) − ω t ] \left\{ \begin{aligned} E_i&=E_{i0}e^{i[k_1(sin\theta_ix-cos\theta_iy)-\omega t]}\\ E_r&=E_{r0}e^{i[k_1(sin\theta_rx+cos\theta_ry)-\omega t]}\\ E_t&=E_{t0}e^{i[k_2(sin\theta_tx-cos\theta_ty)-\omega t]} \end{aligned}\right. ⎩⎪⎪⎨⎪⎪⎧EiErEt=Ei0ei[k1(sinθix−cosθiy)−ωt]=Er0ei[k1(sinθrx+cosθry)−ωt]=Et0ei[k2(sinθtx−cosθty)−ωt]
其角度关系为
θ i = θ r \theta_i=\theta_r θi=θr
n 1 s i n θ i = n 2 s i n θ t n_1sin\theta_i=n_2sin\theta_t n1sinθi=n2sinθt
则波数之间的关系为
k 1 s i n θ i = k 1 s i n θ r = k 2 s i n θ t k_1sin\theta_i=k_1sin\theta_r=k_2sin\theta_t k1sinθi=k1sinθr=k2sinθt
又因在界面上,反射波和透射波在x轴上的投影必然等于入射波,故对于电矢量而言,有
c o s θ i E i 0 = c o s θ r E r 0 + c o s θ t E t 0 cos\theta_iE_{i0}=cos\theta_rE_{r0}+cos\theta_tE_{t0} cosθiEi0=cosθrEr0+cosθtEt0
对于磁矢量而言,有
n 1 B i 0 + n 1 B r 0 = n 2 B t 0 → n 1 E i 0 + n 1 E r 0 = n 2 E t 0 n_1B_{i0}+n_1B{r0}=n_2B_{t0} \to n_1E_{i0}+n_1E{r0}=n_2E_{t0} n1Bi0+n1Br0=n2Bt0→n1Ei0+n1Er0=n2Et0
令振幅反射系数和透射系数分别为 r p = E r 0 E i 0 , t p = E t 0 E i 0 r_p = \frac{E_{r0}}{E_{i0}},t_p = \frac{E_{t0}}{E_{i0}} rp=Ei0Er0,tp=Ei0Et0
则有
{ c o s θ r r p + c o s θ t t p = c o s θ i n 1 r p − n 2 t p = − n 1 \left\{ \begin{aligned} cos\theta_rr_p+cos\theta_tt_p&=cos\theta_i\\ n_1r_p-n_2t_p &= -n_1 \end{aligned}\right. {cosθrrp+cosθttpn1rp−n2tp=cosθi=−n1
s光的计算方法与之类似,最后得到
{ r p = n 2 c o s θ i − n 1 1 − ( n 1 / n 2 ) 2 s i n 2 θ i n 2 c o s θ i + n 1 1 − ( n 1 / n 2 ) 2 s i n 2 θ i t p = 2 n 1 c o s θ i n 2 c o s θ i + n 1 1 − ( n 1 / n 2 ) 2 s i n 2 θ i r s = n 1 c o s θ i − n 2 1 − ( n 1 / n 2 ) 2 s i n 2 θ i n 1 c o s θ i + n 2 1 − ( n 1 / n 2 ) 2 s i n 2 θ i t s = 2 n 1 c o s θ i n 1 c o s θ i + n 2 1 − ( n 1 / n 2 ) 2 s i n 2 θ i \left\{\begin{aligned} r_p&=\frac{n_2cos\theta_i-n_1\sqrt{1-(n_1/n_2)^2sin^2\theta_i}}{n_2cos\theta_i+n_1\sqrt{1-(n_1/n_2)^2sin^2\theta_i}}\\ t_p&=\frac{2n_1cos\theta_i}{n_2cos\theta_i+n_1\sqrt{1-(n_1/n_2)^2sin^2\theta_i}}\\ r_s&=\frac{n_1cos\theta_i-n_2\sqrt{1-(n_1/n_2)^2sin^2\theta_i}}{n_1cos\theta_i+n_2\sqrt{1-(n_1/n_2)^2sin^2\theta_i}}\\ t_s&=\frac{2n_1cos\theta_i}{n_1cos\theta_i+n_2\sqrt{1-(n_1/n_2)^2sin^2\theta_i}} \end{aligned}\right. ⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧rptprsts=n2cosθi+n11−(n1/n2)2sin2θin2cosθi−n11−(n1/n2)2sin2θi=n2cosθi+n11−(n1/n2)2sin2θi2n1cosθi=n1cosθi+n21−(n1/n2)2sin2θin1cosθi−n21−(n1/n2)2sin2θi=n1cosθi+n21−(n1/n2)2sin2θi2n1cosθ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) #p分量振幅反射率
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): #默认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 |r|^2 ∣r∣2、 n 2 n 1 ∣ t ∣ 2 \frac{n_2}{n_1}|t|^2 n1n2∣t∣2。而能流与强度之间还需要除以一个横截面积,故能流反射率和透过率分别为:
{ R = ∣ r ∣ 2 T = n 2 c o s θ t n 1 c o s θ i ∣ t ∣ 2 \left\{\begin{aligned} R &= |r|^2\\ T &= \frac{n_2cos\theta_t}{n_1cos\theta_i|t|^2} \end{aligned}\right. ⎩⎪⎨⎪⎧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()
得