ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

高斯光束ABCD定律:复参数q与MATLAB仿真指南

高斯光束ABCD定律:复参数q与MATLAB仿真指南 1. 从一束光的“身份证”说起为什么需要复参数q搞激光和光学系统的人迟早会撞上高斯光束这个坎。你手里如果有一台He-Ne激光器或者哪怕只是一个半导体激光模组它出来的光都不是理想平面波而是高斯光束——横截面上光强呈高斯分布中心最亮往边缘按指数衰减。这种光束在自由空间传播、穿过透镜、被反射镜反射之后光斑大小和波前曲率怎么变是光学系统设计里绕不开的问题。早期大家用波动光学硬算菲涅尔-基尔霍夫衍射积分一套下来脑袋都大了。后来有人发现如果只关心近轴条件下的光束传播完全可以用一套矩阵方法来描述——这就是ABCD定律。它的核心思想非常优雅把高斯光束用一个复数参数q来表征光学系统用一个2×2的ABCD矩阵来表示光束经过系统后的新q值直接通过一个分式线性变换就能算出来。这个q参数到底是个什么东西你可以把它理解成高斯光束的“身份证”。它同时编码了两个关键信息光斑半径w(z)和波前曲率半径R(z)。定义式是1/q(z) 1/R(z) - i·λ/(π·w²(z))其中λ是波长i是虚数单位。实部1/R描述波前弯曲程度虚部λ/(πw²)描述光斑大小。一个复数把两个实数参数打包了这就是数学上的偷懒智慧。那ABCD矩阵又是什么近轴光学里任何光学元件对光线的作用都可以写成[r_out] [A B] [r_in] [θ_out] [C D] [θ_in]r是光线离轴高度θ是光线与光轴的夹角。自由空间传播距离L矩阵是[[1, L], [0, 1]]薄透镜焦距f矩阵是[[1, 0], [-1/f, 1]]。把这些矩阵按光路顺序乘起来就得到整个系统的ABCD矩阵。然后ABCD定律告诉你q_out (A·q_in B) / (C·q_in D)就这么简单。一个复数运算替代了原本复杂的衍射积分。我第一次推导这个公式的时候感觉就像发现了一个后门——明明物理过程那么复杂数学上却这么干净。这篇文章我打算把复参数q的物理含义、常用光学系统的ABCD矩阵、以及怎么用MATLAB把它们串起来算从头到尾捋一遍。适合正在学激光原理、做光学系统仿真、或者工作中需要快速估算高斯光束传播的工程师和学生。不需要你有深厚的数学功底但最好对复数运算和矩阵乘法不陌生。2. 复参数q的物理内涵与ABCD定律的推导逻辑2.1 q参数的实部与虚部分别代表什么很多人第一次看到1/q 1/R - iλ/(πw²)这个定义会觉得有点突兀。为什么非要取倒数为什么不直接定义q R i·something原因在于波前相位。高斯光束的场分布可以写成E(r, z) E₀ · (w₀/w(z)) · exp(-r²/w²(z)) · exp(-ikz - ikr²/(2R(z)) iζ(z))其中exp(-ikr²/(2R))这一项描述的是波前的二次相位因子。在近轴近似下球面波的相位因子也是这个形式。所以R(z)自然出现在分母上。而光斑大小w(z)影响的是振幅的横向分布在近轴传播公式里它和R(z)以1/q 1/R - iλ/(πw²)的方式组合在一起使得q的传播规律变得极其简洁。具体来说实部1/R描述波前曲率。R→∞时1/R→0波前是平面。R越小波前弯曲越厉害。虚部-λ/(πw²)描述光斑大小。w越大虚部绝对值越小。负号是约定保证q的虚部为负对应光束在传播方向上发散。在束腰位置z0R→∞所以1/q -iλ/(πw₀²)即q₀ i·πw₀²/λ。这是一个纯虚数。随着光束传播q的实部逐渐增大虚部绝对值减小因为w增大。2.2 ABCD定律为什么成立ABCD定律的推导有好几条路。最直观的是从光线矩阵出发结合近轴波动方程的解。高斯光束是近轴波动方程的一个解而近轴波动方程在ABCD变换下具有不变性。具体来说如果q满足1/q 1/R - iλ/(πw²)那么经过ABCD矩阵变换后新的q (AqB)/(CqD)仍然满足同样的形式只是R和w变成了新的值。另一种理解方式是从菲涅尔衍射积分出发。在近轴近似下光场传播可以写成卷积形式。高斯函数的卷积仍然是高斯函数而ABCD矩阵恰好描述了高斯函数参数的变化规律。这个推导稍微长一点但物理意义更清晰。我个人的经验是不需要每次都从头推导。记住结论理解物理意义会用就行。但至少要亲手推一遍知道这个公式不是凭空冒出来的。2.3 q参数传播的一个简单验证拿自由空间传播举例。自由空间的ABCD矩阵是[[1, L], [0, 1]]所以q_out (1·q_in L) / (0·q_in 1) q_in L也就是说自由空间传播距离Lq参数直接加L。这太直观了。如果q_in i·πw₀²/λ束腰处那么q_out L i·πw₀²/λ。根据1/q 1/R - iλ/(πw²)可以反解出R(z) z·[1 (z_R/z)²] w(z) w₀·sqrt(1 (z/z_R)²)其中z_R πw₀²/λ是瑞利长度。这两个公式就是高斯光束传播的标准公式。你看从qL这一个简单操作就能推出所有结果。这就是ABCD定律的威力。3. 常用光学系统的ABCD矩阵全列举3.1 自由空间传播自由空间传播距离L矩阵为M_free [1 L] [0 1]这是最基本的矩阵。任何光路里都有自由空间段。注意L可以为负表示反向传播但在实际计算中一般取正值方向由光路顺序决定。3.2 薄透镜薄透镜焦距f矩阵为M_lens [1 0] [-1/f 1]符号约定f为正表示凸透镜会聚f为负表示凹透镜发散。这个矩阵的物理意义是光线经过薄透镜后离轴高度不变因为透镜很薄但角度发生突变变化量与离轴高度成正比比例系数为-1/f。3.3 球面镜反射球面镜曲率半径R矩阵为M_mirror [1 0] [-2/R 1]注意这里R的符号约定凹面镜R为正会聚凸面镜R为负发散。为什么是-2/R而不是-1/f因为球面镜的焦距f R/2所以-1/f -2/R。反射和透射的区别在于光路折返但在矩阵形式上球面镜等效于一个焦距为R/2的薄透镜。3.4 介质界面折射从折射率n₁的介质进入折射率n₂的介质平面界面矩阵为M_interface [1 0] [0 n₁/n₂]这个矩阵用得相对少一些但在设计浸没式光学系统或光纤耦合时会遇到。注意这里假设界面是平面且垂直于光轴。3.5 梯度折射率介质梯度折射率GRIN介质中折射率沿径向变化n(r) n₀·(1 - α²r²/2)。传播距离L的矩阵为M_GRIN [cos(αL) sin(αL)/α] [-α·sin(αL) cos(αL) ]当α→0时退化为自由空间矩阵。这个矩阵在光纤光学和自聚焦透镜中很常见。3.6 常用矩阵速查表光学元件ABCD矩阵参数说明自由空间[[1, L], [0, 1]]L为传播距离薄透镜[[1, 0], [-1/f, 1]]f为焦距凸正凹负球面镜[[1, 0], [-2/R, 1]]R为曲率半径凹正凸负平面界面[[1, 0], [0, n₁/n₂]]n₁入射n₂出射GRIN介质[[cos(αL), sin(αL)/α], [-αsin(αL), cos(αL)]]α为梯度系数注意矩阵乘法顺序必须与光路顺序一致。如果光先经过元件1再经过元件2总矩阵是M₂·M₁不是M₁·M₂。这一点初学者特别容易搞反。4. 用MATLAB把ABCD定律跑起来4.1 为什么选MATLAB而不是Python这个问题我被问过很多次。Python当然也能做numpy和scipy足够应付矩阵运算。但MATLAB在光学仿真领域有几个天然优势第一复数运算和矩阵运算的语法极其自然q (Aq_in B)/(Cq_in D)直接写就行不需要额外处理复数类型第二MATLAB的符号计算工具箱可以推导解析表达式对于验证公式特别方便第三很多光学设计软件如Zemax、Code V都支持MATLAB联动做自定义分析时MATLAB是首选。当然如果你习惯Python把下面的代码翻译过去也不难。核心逻辑是一样的。4.2 基础代码框架先定义一个计算q参数传播的函数function q_out propagate_q(q_in, M) % q_in: 输入复参数 % M: 2x2 ABCD矩阵 A M(1,1); B M(1,2); C M(2,1); D M(2,2); q_out (A*q_in B) / (C*q_in D); end然后定义常用矩阵function M free_space(L) M [1, L; 0, 1]; end function M thin_lens(f) M [1, 0; -1/f, 1]; end function M spherical_mirror(R) M [1, 0; -2/R, 1]; end4.3 一个完整例子透镜聚焦高斯光束假设波长λ 1064 nm束腰w₀ 1 mm透镜焦距f 100 mm透镜放在束腰处。求聚焦后的束腰大小和位置。lambda 1064e-9; w0 1e-3; f 100e-3; % 束腰处q参数 z_R pi * w0^2 / lambda; q0 1i * z_R; % 经过透镜 M thin_lens(f); q1 propagate_q(q0, M); % 聚焦后束腰位置q1的实部为0处 % 先传播到新束腰 % 新束腰处q为纯虚数实部为0 % 从透镜后传播距离dq2 q1 d % 令real(q2) 0得d -real(q1) d -real(q1); q2 q1 d; % 新束腰大小 w0_new sqrt(lambda / (pi * abs(imag(q2)))); fprintf(新束腰大小: %.4f mm\n, w0_new * 1e3); fprintf(束腰位置: 透镜后 %.4f mm\n, d * 1e3);运行结果新束腰大约在透镜后95 mm左右束腰大小约33 μm。这个结果和用高斯光束聚焦公式w₀ ≈ λf/(πw₀)算出来的差不多λf/(πw₀) 1064e-9 * 0.1 / (π * 1e-3) ≈ 33.9 μm。位置略小于f因为入射光束有发散角。4.4 可视化光斑大小沿传播方向的变化z linspace(-50, 200, 1000) * 1e-3; % 从透镜前50mm到后200mm w zeros(size(z)); for i 1:length(z) if z(i) 0 % 透镜前自由空间 M_total free_space(z(i)); q propagate_q(q0, M_total); else % 透镜后先过透镜再自由空间 M_total free_space(z(i)) * thin_lens(f); q propagate_q(q0, M_total); end w(i) sqrt(lambda / (pi * abs(imag(1/q)))); end plot(z*1e3, w*1e3); xlabel(位置 (mm)); ylabel(光斑半径 (mm)); title(高斯光束经过透镜后的光斑变化); grid on;这段代码会画出一条曲线在透镜前光斑缓慢增大经过透镜后迅速收缩到焦点然后再发散。你可以直观地看到焦点位置和束腰大小。4.5 参数选择的几个经验值在实际仿真中有几个参数容易踩坑波长单位MATLAB默认双精度但如果你用nm做单位算出来的z_R会差10⁹倍。建议统一用米。束腰大小w₀不能太小否则近轴近似失效。一般要求w₀ λ。对于可见光w₀至少几十微米。透镜焦距f不能太短否则透镜厚度不可忽略薄透镜近似失效。一般f 10倍透镜中心厚度。传播距离自由空间矩阵对任意L都成立但近轴近似要求L不能太大否则光束发散角过大高阶项不可忽略。实操心得我习惯在代码开头定义所有物理量用注释标明单位。这样后面改参数时不会乱。另外MATLAB的pi是内置常量不要自己定义pi3.14精度不够。5. 常见问题与排查技巧实录5.1 q参数算出来实部为负怎么办正常情况下从束腰出发向右传播q的实部应该从0逐渐增大。如果你算出来实部为负说明传播方向反了或者矩阵乘法顺序错了。检查一下自由空间矩阵是[[1, L], [0, 1]]如果L为负实部就会减小。另外如果先乘透镜再乘自由空间顺序反了结果也会不对。5.2 透镜后光斑反而变大这通常发生在入射光束发散角很大的情况下。如果入射光束在透镜处已经发散得很厉害透镜可能无法将其聚焦到更小的点。判断依据是入射光束在透镜处的光斑大小w_lens和透镜焦距f的关系。如果w_lens f·λ/(πw₀)聚焦效果会变差。解决办法是先用一个准直透镜把光束准直再用第二个透镜聚焦。5.3 矩阵乘法顺序搞混这是最常见的错误。记住一个原则光先经过的元件矩阵放在右边。如果光先过透镜再过自由空间总矩阵是M_free · M_lens。因为矩阵乘法是从右往左作用于向量的。你可以这样记光线向量是列向量M_total · r_in M_free · (M_lens · r_in)所以先作用的是M_lens。5.4 复数运算的精度问题MATLAB的复数运算精度很高但如果你用符号计算工具箱推导解析表达式可能会遇到化简不彻底的情况。建议用simplify和vpa函数处理。另外当q的虚部非常小时比如远场1/q的虚部会很大计算w时要注意数值稳定性。5.5 常见问题速查表问题现象可能原因排查方法q实部为负传播方向反了检查L符号和矩阵顺序光斑不收敛透镜焦距太短检查w_lens与f的关系结果与理论不符矩阵乘法顺序错确认先作用的在右边数值溢出单位不统一统一用米和弧度焦点位置偏移入射光束非束腰检查q_in的实部是否为零避坑技巧我习惯在每次矩阵乘法后打印中间结果确认q的实部和虚部变化趋势合理。如果某一步突变太大说明那一步有问题。另外用format long显示更多小数位方便对比。6. 从ABCD定律延伸出去还能做什么6.1 谐振腔稳定性分析激光谐振腔的稳定性条件可以用ABCD矩阵推导。往返矩阵的迹满足|AD|/2 1时腔是稳定的。这个条件决定了腔镜曲率半径和腔长的匹配关系。用MATLAB可以快速扫描参数空间画出稳定区。6.2 光束质量因子M²的测量实际光束不是理想高斯光束用M²因子描述其偏离程度。M²的定义涉及实际光束的束腰和发散角与理想高斯光束的比值。用ABCD定律可以拟合测量数据提取M²。6.3 多透镜系统优化如果有多个透镜可以用MATLAB的优化工具箱自动搜索最佳焦距和间距使目标位置的光斑最小。目标函数就是w(z_target)优化变量是各透镜的f和位置。6.4 与Zemax联动Zemax的ZOS-API支持MATLAB调用。你可以用MATLAB生成复杂的光学系统矩阵传给Zemax做光线追迹再把结果拿回来分析。这样结合了ABCD定律的快速估算和Zemax的精确仿真。我个人在实际操作中的体会是ABCD定律最大的价值不是替代精确仿真而是提供快速直觉。在设计初期你不需要打开Zemax用几行MATLAB代码就能估算出大致的光斑大小和焦点位置。等方案定型了再用精确软件验证。这个流程能省下大量时间。最后分享一个小技巧如果你经常需要算高斯光束传播可以把上面的函数封装成一个MATLAB类把波长、束腰、矩阵都作为属性方法包括传播、聚焦、画图等。这样每次用的时候只需要改几个参数不用重复写代码。我自己的工具箱里就有一个这样的类用了好几年稳定可靠。
返回列表