第三章 ABCD矩阵理论:平移、折射、反射与系统合成
做光学设计的人,手里都得有几把“快刀”。
ABCD矩阵,就是我工具箱里最趁手的那一把。它把光线追迹变成了矩阵乘法,说白了,就是让复杂的光路计算变得像搭积木一样简单。我个人习惯,拿到一个系统,第一件事就是把它拆成几个基本矩阵的乘积。
这一章,咱们就把平移、折射、反射这三块“积木”讲透,再聊聊怎么把它们拼起来。
3.1 光线用什么表示?——光线矢量
在矩阵光学里,一根光线不再是一条线,而是一个向量。我通常用 列向量 来表示它:
[ y ]
光线 = [ θ ]
- y:光线在参考平面上的高度(离光轴的距离)。
- θ:光线与光轴的夹角(弧度制,近轴近似下 sinθ ≈ θ)。
你想想看,光线从一个平面传播到另一个平面,或者经过一个光学面,它的 y 和 θ 都会变。ABCD矩阵就是描述这种变化的“黑箱”。
核心公式:
[ y2 ] = [ A B ] * [ y1 ]
[ θ2 ] [ C D ] [ θ1 ]
输出 = 系统矩阵 × 输入。就这么简单。
3.2 三大基本矩阵
所有复杂的光学系统,归根结底就是这三种操作的组合。我在项目中遇到过不少新手,总想用复杂的公式去算,其实拆成矩阵,一目了然。
3.2.1 平移矩阵 (Translation Matrix)
光线在均匀介质中走一段距离,不发生折射或反射。它的矩阵形式是:
M_trans(d) = [ 1 d ]
[ 0 1 ]
其中 d 是光线在介质中传播的距离。如果介质折射率是 n,那 d 要换成 d/n,这叫“约化距离”。
物理意义: 光线走了一段路,高度 y 会变(因为有个倾角 θ),但倾角 θ 不变。
我的小技巧: 写代码时,我习惯把平移距离 d 和折射率 n 分开传参,而不是直接传 d/n。这样代码可读性更高,也方便后面处理不同介质。
3.2.2 折射矩阵 (Refraction Matrix)
光线经过一个球面(或平面)时,会发生折射。这个矩阵描述的就是光线在界面处的“偏折”。
M_refr(R, n1, n2) = [ 1 0 ]
[ (n1-n2)/(R*n2) n1/n2 ]
- R:曲率半径。凸面朝左为正,凹面朝左为负。平面时 R = ∞,此时 C = 0。
- n1:入射介质折射率。
- n2:出射介质折射率。
物理意义: 光线经过折射面,高度 y 不变(就在界面上),但倾角 θ 会变。
符号规则要记牢! 我曾经因为搞错 R 的符号,算出来的像距差了十万八千里。记住:光线从左向右传播,凸面迎着光线,R 为正。
3.2.3 反射矩阵 (Reflection Matrix)
对于反射镜,原理类似,但折射率会变号。反射矩阵是:
M_refl(R) = [ 1 0 ]
[ -2/R 1 ]
这里 R 是反射镜的曲率半径。凹面镜 R 为负,凸面镜 R 为正(按光线从左向右传播的惯例)。
物理意义: 反射前后,光线高度不变,但倾角变化是折射的两倍(因为反射角等于入射角,且方向反转)。
3.3 系统矩阵合成——搭积木的艺术
一个复杂系统,就是多个基本矩阵的乘积。顺序是 从右往左 乘。
比如,光线先平移 d1,再经过折射面 R,再平移 d2:
M_system = M_trans(d2) * M_refr(R, n1, n2) * M_trans(d1)
为什么是反的?因为矩阵乘法不满足交换律。第一个作用的矩阵,要写在最右边。我刚开始学的时候也老搞反,后来养成了一个习惯:“从光线出发的方向,依次左乘”。
系统矩阵的威力:
一旦你算出了整个系统的 ABCD 矩阵,所有的一阶光学参数就都出来了:
- 焦距 f:f = -1 / C
- 主平面位置:可以从 A、D 和 f 推导
- 成像关系:物像共轭时,B = 0
3.4 知识结构总览
下面这张图,是我自己总结的 ABCD 矩阵知识体系。每次做新系统,我都会在心里过一遍这个流程。
3.5 实战:一个薄透镜的矩阵表示
薄透镜可以看作是两个折射面的组合,中间距离为0。我们来推导一下它的矩阵。
假设透镜折射率为 n,前后曲率半径分别为 R1 和 R2,周围介质为空气 (n=1)。
# 第一个面 (从空气到透镜)
M1 = [ 1, 0 ]
[ (1-n)/(R1*n), 1/n ]
# 平移 (厚度为0,忽略)
M2 = [ 1, 0 ]
[ 0, 1 ]
# 第二个面 (从透镜到空气)
M3 = [ 1, 0 ]
[ (n-1)/(R2*1), n/1 ]
# 系统矩阵 (M3 * M2 * M1)
M_lens = M3 * M1
算出来你会发现,薄透镜的矩阵是:
M_lens = [ 1, 0 ]
[ -1/f, 1 ]
其中 1/f = (n-1) * (1/R1 - 1/R2),就是透镜制造者公式。你看,矩阵方法自动推导出了这个经典公式。
代码实现建议: 我一般用 Python 的 NumPy 库来处理矩阵运算。定义一个函数,输入是基本参数列表,输出是系统矩阵。这样调试起来非常方便。
import numpy as np
def translation(d, n=1):
return np.array([[1, d/n], [0, 1]])
def refraction(R, n1, n2):
return np.array([[1, 0], [(n1-n2)/(R*n2), n1/n2]])
# 合成一个系统
M = translation(50) @ refraction(100, 1, 1.5) @ translation(30)
print(M)
3.6 避坑指南
做矩阵光学计算,有几个坑我踩过,写出来给大家提个醒:
- 矩阵乘法顺序: 永远记住,第一个作用的矩阵在最右边。写代码时,我习惯从右往左写,或者用
@运算符从左往右乘,但心里要清楚顺序。 - 符号约定: 不同教材对 R 的符号定义可能不同。我建议你选定一套,从头用到尾。我个人用“光线从左向右,凸面朝左为正”。
- 单位统一: 长度用 mm,角度用 rad。混用单位是新手最容易犯的错误。
- 近轴近似失效: 当光线角度很大(比如 > 10°)或者高度很高时,ABCD 矩阵的精度会下降。这时候需要用真实光线追迹。
我曾经犯过的错: 有一次计算一个多透镜系统,怎么算像差都不对。查了两天,最后发现是中间一个空气间隔的折射率我写成了 1.5(玻璃的折射率)。平移矩阵里的 d/n,n 一定要用介质的实际折射率,空气就是 1.0,别想当然。
3.7 小结
ABCD 矩阵理论,说白了就是把几何光学变成了线性代数。你只要记住三个基本矩阵(平移、折射、反射),掌握从右向左的乘法顺序,再复杂的系统也能一步步算出来。
这一章的内容,是后面所有计算的基础。我建议你亲手写几行代码,把薄透镜、双胶合透镜的矩阵算一遍。代码跑通了,概念也就真正理解了。