第三章 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 矩阵知识体系。每次做新系统,我都会在心里过一遍这个流程。

ABCD矩阵知识体系 ABCD 矩阵理论核心逻辑 光线矢量 [y, θ] 平移矩阵 [1 d; 0 1] 折射矩阵 [1 0; (n1-n2)/(R*n2) n1/n2] 反射矩阵 [1 0; -2/R 1] 系统矩阵 = M_n * ... * M_2 * M_1 输出:焦距 f = -1/C 主平面位置 | 成像条件 (B=0) | 系统总光焦度 从右向左乘

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 矩阵理论,说白了就是把几何光学变成了线性代数。你只要记住三个基本矩阵(平移、折射、反射),掌握从右向左的乘法顺序,再复杂的系统也能一步步算出来。

这一章的内容,是后面所有计算的基础。我建议你亲手写几行代码,把薄透镜、双胶合透镜的矩阵算一遍。代码跑通了,概念也就真正理解了。