2. 局部优化基础:局部优化算法原理(阻尼最小二乘法),局部优化在Code V中的实现。

局部优化,说白了就是“在一个坑里找最深的点”。你给Code V一个初始结构,它就在这个结构附近的山谷里,一步步往下走,直到找到谷底。这个谷底,就是局部最优解。

我刚开始学光学设计时,总觉得局部优化不够“高级”,一心想着全局优化。后来被现实教育了——没有扎实的局部优化,全局优化就是无根之木。你想想看,全局优化再厉害,最后也得靠局部优化去精修。

2.1 阻尼最小二乘法(DLS)的原理

Code V的局部优化核心,就是阻尼最小二乘法。这个名字听着唬人,其实逻辑很直白。

核心思想:我们有一堆像差(比如球差、彗差、像散),每个像差都想让系统参数(曲率、厚度、非球面系数)往某个方向变。但这些方向经常打架——改曲率能减小球差,却可能增大彗差。DLS要做的,就是找到一组参数变化量,让所有像差的平方和最小。

数学上,它解的是这个方程:

(AᵀA + μI)Δx = -Aᵀf

这里:

  • A 是雅可比矩阵——每个像差对每个参数的偏导数
  • f 是当前像差向量
  • Δx 是参数变化量(我们要找的)
  • μ 是阻尼因子——这就是“阻尼”二字的来源
  • I 是单位矩阵

为什么要加这个 μI?我举个例子。有一次我在优化一个鱼眼镜头,初始结构离目标很远。如果不加阻尼,AᵀA 矩阵可能接近奇异,算出来的 Δx 大得离谱,系统直接崩掉。阻尼因子就像给优化加了“刹车”——当步长太大时,μ 自动增大,让步子变小;当接近谷底时,μ 减小,让步子更精确。

关键理解:阻尼最小二乘法 = 最小二乘法 + 自适应步长控制。它既保证了收敛方向,又防止了“一步跨过山谷”的灾难。

2.2 阻尼因子的自适应策略

Code V 的 DLS 实现中,阻尼因子 μ 不是固定的。它有一套自适应逻辑:

  1. 初始值:通常设为 0.001 或 0.01
  2. 迭代判断:如果本次迭代后像差平方和下降,μ 减小(比如乘以 0.3),步子变大
  3. 如果像差上升:μ 增大(比如乘以 10),步子变小,重新计算
  4. 重复:直到找到下降方向或达到最大尝试次数

这个机制,我称之为“优化器的自我修养”。它让算法在平坦区域大步流星,在陡峭区域小心翼翼。

场景 阻尼因子变化 效果
像差下降顺利 μ 减小 步长增大,加速收敛
像差上升或震荡 μ 增大 步长减小,稳定搜索
接近谷底 μ 趋近于 0 退化为高斯-牛顿法,精确收敛
远离谷底 μ 较大 接近最速下降法,保证下降

我的习惯:在 Code V 中,我通常用 AUT 命令让软件自动管理阻尼因子。只有在遇到收敛震荡时,我才会手动调整 DMP 参数。记住:不要轻易动阻尼因子,除非你知道自己在做什么。

2.3 Code V 中局部优化的实现

在 Code V 里跑局部优化,核心命令就两个:AUT 和 AEI。但用好它们,需要理解背后的逻辑。

2.3.1 基本流程

  1. 定义误差函数:用 MXT、MTF、SPC 等命令设置优化目标
  2. 选择变量:用 CVX 或 THX 等命令将参数设为变量
  3. 运行优化:输入 AUT 启动自动优化
  4. 检查结果:用 AEI 查看优化后的像差变化

一个典型的优化会话:

! 设置优化目标:控制焦距和像差
MXT 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0
SPC WAV 0.5876 0.4861 0.6563
SPC CIR 0.0 0.7 1.0

! 选择变量:曲率和厚度
CVX 1 10
THX 1 10

! 启动优化
AUT

! 查看结果
AEI

我曾经踩过的坑:有一次我忘了设置 MXT 的权重,结果优化出来的系统焦距完全跑偏。后来我养成了习惯——每次优化前,先用 LIS 命令检查一下误差函数设置。这个习惯救了我很多次。

2.3.2 优化策略的选择

Code V 的 AUT 命令有几个关键参数:

参数 作用 我的建议
DMP 阻尼因子初始值 默认 0.01,一般不动
ITR 最大迭代次数 先设 20,看收敛情况再调
PRT 打印详细程度 设 2,能看到每次迭代的误差变化
STP 步长缩放因子 默认 1.0,收敛慢时可调大

我个人习惯这样用:

AUT DMP 0.01 ITR 30 PRT 2 STP 1.0

这个配置适合大多数情况。如果遇到收敛慢,我会把 ITR 加到 50,STP 调到 1.2。但注意——步长太大可能导致震荡,要观察 PRT 输出的误差变化曲线。

2.4 局部优化的局限性

这里我要说句大实话:局部优化只能找到最近的谷底,不能保证是全局最优。你给一个双高斯初始结构,它不会自己变成反远距结构。

为什么会这样?因为 DLS 本质上是“贪心”的——它只看当前点的梯度方向,不看远处的山形。就像你在雾天爬山,只能看到脚下几米的路,不可能知道山顶在哪。

核心认知:局部优化的结果,高度依赖初始结构。一个好的初始结构,能让局部优化事半功倍;一个差的初始结构,局部优化再努力也救不回来。

这也是为什么我们需要全局优化——它负责“找对山头”,局部优化负责“爬到山顶”。两者配合,才是完整的设计流程。

2.5 本章知识体系

下面这张图,帮你理清局部优化的核心逻辑:

局部优化(阻尼最小二乘法)知识体系 阻尼最小二乘法(DLS) 数学原理 阻尼因子自适应 Code V 实现 雅可比矩阵 + 误差函数 μ 增大 → 步长减小 AUT / AEI 命令 核心认知 局部优化 = 在初始结构附近找最优解,依赖梯度信息,无法跳出局部极值

这张图把局部优化的三个核心模块串起来了:数学原理是基础,阻尼因子自适应是灵魂,Code V 实现是工具。三者缺一不可。

我的建议:刚开始学局部优化时,不要急着调参数。先用默认设置跑几次,观察 PRT 输出的误差变化曲线。看懂了曲线,你就理解了 DLS 的脾气。等你熟悉了它的“性格”,再去调阻尼因子、步长这些参数,会顺手很多。