4. 局部优化算法:阻尼最小二乘法(DLS)与 Hammer 的较量

聊到局部优化,很多刚入行的朋友会觉得:“不就是找个局部最小值嘛,有啥好比的?”

嗯,还真不是这么简单。我做了十几年光学设计,踩过最大的坑之一,就是以为所有优化算法都一样。结果呢?同一个初始结构,Code V 跑出来是 0.02 波前差,Zemax 跑出来是 0.08——你说算法重不重要?

4.1 阻尼最小二乘法(DLS)——Code V 的看家本领

DLS 说白了,就是给传统最小二乘法加了个“阻尼”项。传统最小二乘法只管让误差平方和最小,但跑着跑着就容易“抽风”——步长太大,直接跳出合理区间。

阻尼的作用是什么?就是给每一步加个刹车。步长太大?阻尼系数自动增大,让你稳稳当当收敛。

核心公式(理解即可):
(ATA + μI)Δx = ATb
其中 μ 就是阻尼系数,I 是单位矩阵。

Code V 的 DLS 实现有几个特点,我这些年用下来感受很深:

  • 自适应阻尼调整:每次迭代后,如果误差下降,阻尼就减小;如果误差反弹,阻尼就增大。说白了就是“路好走就加速,路不好就减速”。
  • 边界处理更激进:Code V 的 DLS 对变量边界有专门的投影算法。我曾经做一个投影镜头,镜片边缘厚度快成负数了,Code V 硬是给拉回来了。
  • 误差函数加权灵活:你可以给每个视场、每个波长单独设权重。这个在 Zemax 里也有,但 Code V 的权重更新策略更“聪明”——它会根据当前误差自动调整权重,避免某个视场被“忽略”。
我的习惯: 在 Code V 里做 DLS 优化前,我一定会先跑一遍 AUTOMATIC DESIGN 命令。这个命令会自动帮你设置好阻尼初始值、变量边界和权重,省去很多手动调参的麻烦。

4.2 Hammer 优化算法——Zemax 的“暴力美学”

Zemax 的 Hammer 优化,名字听着就很硬核。它本质上是一种“全局搜索 + 局部下山”的混合算法。

怎么理解呢?你可以想象成:

  1. 先随机生成一堆候选结构(全局搜索阶段)
  2. 对每个候选结构跑一遍局部优化(下山阶段)
  3. 比较所有结果,保留最好的

Hammer 的厉害之处在于它的“随机扰动”机制。它不是傻傻地随机,而是根据当前结构的灵敏度来调整扰动幅度——敏感变量扰动小一点,不敏感变量扰动大一点。这个设计很巧妙,我当年第一次看到这个机制时,心里想的是:“这谁想出来的?太聪明了。”

注意: Hammer 不是真正的全局优化算法。它本质上还是局部优化,只是多了个“多起点”策略。如果你初始结构离全局最优太远,Hammer 也救不了你。

4.3 收敛速度对比——谁更快?

这个问题我经常被问到。直接给结论:没有绝对谁快,要看场景。

场景 Code V DLS Zemax Hammer
初始结构较好(接近最优) 快,5-10 次迭代收敛 慢,因为要跑多起点
初始结构较差 容易陷入局部极值 有机会跳出,但耗时更长
变量数少(< 20 个) 极快,几乎秒出 中等,受随机扰动影响
变量数多(> 50 个) 阻尼调整频繁,速度下降 多起点并行,反而可能更快
有强约束(如总长固定) 边界处理高效,收敛稳定 约束处理较弱,容易震荡

我个人经验是:做定焦镜头优化,Code V 的 DLS 通常更快;做变焦镜头或初始结构未知的系统,Zemax 的 Hammer 更有优势。

4.4 避坑指南——我踩过的那些坑

我曾经犯过的错: 有一次优化一个 8 片镜头的投影系统,我在 Code V 里用 DLS 跑了 200 次迭代,误差死活降不下去。后来发现,是我把某个镜片的曲率半径边界设得太死了——阻尼算法每次想跨大步,都被边界弹回来。改成软边界后,20 次迭代就收敛了。

几个实用建议:

  • 不要一上来就用 Hammer:先用 DLS 或局部优化把结构“拉”到合理区间,再用 Hammer 做精细搜索。我见过太多人直接上 Hammer,跑了一晚上,结果还不如 DLS 跑 5 分钟。
  • 阻尼系数不是越大越好:阻尼太大,收敛慢得像蜗牛;阻尼太小,容易震荡。Code V 的默认值通常不错,但如果你发现收敛曲线像心电图一样上下跳动,可以手动增大阻尼。
  • Zemax 里用 Hammer 前,先跑一遍 Local Optimization:让结构先“站稳”,Hammer 的随机扰动才有效。否则扰动全被结构本身的“不稳定”吃掉了。

4.5 知识结构图

下面这张图帮你理清两种算法的核心逻辑和适用场景:

局部优化算法对比:DLS vs Hammer 阻尼最小二乘法 (DLS) Code V 核心算法 自适应阻尼 自动调整步长 边界投影 强约束处理 加权灵活 视场/波长权重 快速收敛 初始结构好时极快 Hammer 优化算法 Zemax 核心算法 多起点搜索 全局探索能力 随机扰动 灵敏度自适应 混合策略 全局+局部结合 变量多时优势 并行效率高 选择建议 初始结构好 → DLS 优先 | 变量多/结构未知 → Hammer 优先 | 最佳实践:先 DLS 后 Hammer

4.6 实战建议

如果你问我,在实际项目中怎么选?我的建议是:

  • 第一步:不管用哪个软件,先用局部优化(DLS 或 Local Optimization)跑 20-30 次迭代,看看收敛趋势。
  • 第二步:如果收敛曲线平滑下降,说明初始结构不错,继续用局部优化直到收敛。
  • 第三步:如果收敛曲线震荡或停滞,换 Hammer 或全局算法试试。
  • 第四步:别忘了手动检查结构——算法再聪明,也替代不了工程师的眼睛。
一个小技巧: 在 Code V 里,你可以用 GRAPHIC 命令实时查看优化过程中的光路图。我习惯一边跑优化一边盯着光路看——有时候算法觉得“好了”,但光路明显有折返或边缘过薄,这时候就要手动干预了。