python光学仿真之菲涅耳公式

从物理学的机制出发,波动模型相对于光线模型,显然更加接近光的本质;但是从物理学的发展来说,波动光学旨在解决几何光学无法解决的问题,可谓光线模型的一种升级。从编程的角度来说,波动光学在某些情况下可以简单地理解为在光线模型的基础上,引入一个相位项。

波动模型

一般来说,三个特征可以确定空间中的波场:频率、振幅和相位,故光波场可表示为:

E = A c o s ( ω t − k r ) E = Acos(\omega t-kr) E=Acos(ωtkr)

其中, 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 =A cos(ωtk r );有时为了计算方便,也可以写成指数形式

E = A e − i ( ω t − k r ) E = Ae^{-i(\omega t-kr)} E=Aei(ωtkr)

对于平面波来说,其发散角为0,即光场中的所有点,都具有统一的传播方向,且振幅相等。设其传播方向为 z z z,则可写为

E = A c o s ( ω t − k z ) E = Acos(\omega t-kz) E=Acos(ωtkz)

球面波则相对复杂,令 r r r为空间中任意一点到点光源的距离,则对于 a 、 b a、b ab两点来说,其单位面积的光通量之比为 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=rA ei(ωtk r )

通过截取 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θixcosθiy)ωt]=Er0ei[k1(sinθrx+cosθry)ωt]=Et0ei[k2(sinθtxcosθ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=n2Bt0n1Ei0+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θttpn1rpn2tp=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θi n2cosθin11(n1/n2)2sin2θi =n2cosθi+n11(n1/n2)2sin2θi 2n1cosθi=n1cosθi+n21(n1/n2)2sin2θi n1cosθin21(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)  #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 __name__=="__main__":
    testFres()

得到其图像为

在这里插入图片描述

由于强度与振幅之间存在一个平方的关系,所以强度反射率和透过率为 ∣ r ∣ 2 |r|^2 r2 n 2 n 1 ∣ t ∣ 2 \frac{n_2}{n_1}|t|^2 n1n2t2。而能流与强度之间还需要除以一个横截面积,故能流反射率和透过率分别为:
{ 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=r2=n1cosθit2n2cosθ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()

在这里插入图片描述

好的,以下是Matlab代码,用于计算某振幅光栅的菲涅尔衍射和夫朗和费衍射的光强分布,并绘制衍射屏和观测屏上的光强分布图片。 首先,我们需要定义一些参数,包括光栅周期P、占空比、入射光波长等。可以将这些参数存储在变量中,方便后续的计算和绘图: ```matlab P = 3e-6; % 光栅周期 d = P/2; % 光栅线宽 lambda = 0.6e-6; % 入射光波长 k = 2*pi/lambda; % 入射光波数 n = 1024; % 采样点数 L = 0.5; % 衍射屏和观测屏边长 dx = L/n; % 采样间隔 ``` 接下来,我们可以定义一个函数,用于计算振幅光栅的复振幅分布。在这个函数中,我们可以使用一个二维数组来表示光栅的振幅分布。振幅为1的部分表示光栅线,振幅为0的部分表示光栅缝隙。根据占空比,我们可以计算得到光栅的相位分布,然后将振幅和相位组合起来,得到光栅的复振幅分布: ```matlab function [E, x, y] = amplitude_grating(P, d, n) x = linspace(-P/2, P/2, n); y = x; [X, Y] = meshgrid(x, y); A = zeros(n,n); A(abs(X)<=d/2) = 1; phi = exp(-1i*k*X); E = A.*phi; end ``` 接下来,我们可以定义一个计算菲涅尔衍射的函数。在这个函数中,我们将会使用Huygens-Fresnel衍射公式,计算光栅的复振幅分布在不同距离处的衍射场。我们可以将衍射场看作是一个二维复数数组。为了方便绘图,我们可以对衍射场的强度进行归一化处理,将其限制在0到1之间。最后,我们可以使用imshow函数绘制衍射屏上的光强分布图像: ```matlab function [U, x, y] = fresnel_diffraction(E, L, n, z) x = linspace(-L/2, L/2, n); y = x; [X, Y] = meshgrid(x, y); U = zeros(n,n); for i = 1:n for j = 1:n r = sqrt((X(i,j)^2 + Y(i,j)^2 + z^2)); U(i,j) = (1/(1i*lambda*z))*exp(1i*k*r)/(r^2)*E(i,j); end end I = abs(U).^2; I = I/max(I(:)); imshow(I); end ``` 最后,我们可以定义一个计算夫朗和费衍射的函数。在这个函数中,我们将会使用衍射积分公式,计算光栅的复振幅分布在不同角度处的衍射场。由于衍射积分公式中包含复杂的积分计算,我们可以使用Matlab中的quad2d函数来进行数值积分。最后,我们可以使用imshow函数绘制观测屏上的光强分布图像: ```matlab function [U, x, y] = fraunhofer_diffraction(E, L, n, z) x = linspace(-L/2, L/2, n); y = x; [X, Y] = meshgrid(x, y); U = zeros(n,n); for i = 1:n for j = 1:n integrand = @(u,v) E(u,v).*exp(-1i*k*(X(i,j)*u+Y(i,j)*v)/z)/(1i*lambda*z); U(i,j) = quad2d(integrand,-d/2,d/2,-P/2,P/2); end end I = abs(U).^2; I = I/max(I(:)); imshow(I); end ``` 最后,我们可以将这些函数组合起来,计算并绘制菲涅尔衍射和夫朗和费衍射的光强分布: ```matlab % 计算振幅光栅的复振幅分布 [E, x, y] = amplitude_grating(P, d, n); % 计算菲涅尔衍射 z_f = 1e-3; % 菲涅尔距离 figure; fresnel_diffraction(E, L, n, z_f); title('Fresnel diffraction'); % 计算夫朗和费衍射 z_ff = 50e3; % Fraunhofer距离 figure; fraunhofer_diffraction(E, L, n, z_ff); title('Fraunhofer diffraction'); ``` 运行程序后,将会得到两张图片,分别表示菲涅尔衍射和夫朗和费衍射的光强分布。在观测屏上至少能够显示5个光斑,需要调整观测屏的大小或者距离。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微小冷

请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值