光学设计漫谈操作篇-CODEV不同优化方法的应用

B站影视 电影资讯 2025-03-19 10:24 1

摘要:在上一篇文章中,我们介绍了完成一个光学设计的三个阶段:从最开始找到一个可用的初始结构,再到充分提升性能,最后进行平衡和调整,得到满足我们需求的设计。基本上每颗镜头的设计都是如此,对于一些较为复杂的镜头甚至还会经历多轮类似的操作,以保证系统得到充分优化。

不识庐山真面目,只缘身在此山中。

在上一篇文章中,我们介绍了完成一个光学设计的三个阶段:从最开始找到一个可用的初始结构,再到充分提升性能,最后进行平衡和调整,得到满足我们需求的设计。基本上每颗镜头的设计都是如此,对于一些较为复杂的镜头甚至还会经历多轮类似的操作,以保证系统得到充分优化。

既然我们的目标是一个足够好的系统,那就需要持续的优化来达到这个目标。这个过程中,我们的目标是寻找一个相对于全局最优解足够接近的局部最优解,同时对这个局部最优解进行充分优化,本文介绍的几种优化方法针对这两个问题各有侧重,所以基于合适的阶段使用合适的方法,能够在一定程度上提高我们的设计效率。

标准优化(standard optimization)

在“自动化设计”中,如果我们不改变任何优化模式相关的选项,采用的就是标准优化。

自动化设计的默认选项就是标准优化

对应的,如果采用.seq文件进行优化的话,我们在文件中单纯使用AUT-GO组合就代表着采用标准优化。通常我们采用MXC(最大循环次数)和MNC(最小循环次数)来控制优化的过程。关于用.seq文件优化,我们会在下一篇文章中进行详细介绍。

AUT约束1……约束2……MXC 20MNC 20GO

标准优化是最基础和最泛用的优化方法了,无论在哪个设计阶段我们都会用到这个方法。

标准优化示意图

标准优化与Zemax中“执行优化”类似,都是单纯从当前系统开始寻找让误差函数能够继续下降的路线。

这种方法的优势在于始终在“优化”,在不调整约束的情况下会评价函数会一直下降,直到找到当前系统附近的局部最优;与之相伴的则是强烈依赖于优化的起始点。以上面的示意图为例,如果初始结构比较好(红点位置),那么通过标准优化算法就能够找到全局最优;但是如果初始结构不够好(蓝点位置),按照标准优化的策略就会陷入局部最优,不能够“跨越”右侧的“障碍”找到全局最优。

判断当前系统是否可以只靠标准优化达到设计目标需要参考同类项目的状态,有的时候根据镜片形状(光焦度集中情况)也能够辅助推断。如果没有把握的话可以在一定时间内尝试去优化这个系统,慢慢积累经验后就能够自行判断了。

全局合成(global synthesis)

CODEV的这个功能叫做“全局合成”,与Zemax的全局优化有一些类似之处,都是能够大幅度改变结构的一种优化方式。

全局合成的开启方式

我们可以在“自动化设计”的第一页找到“全局合成”的选项。对应地在.seq文件中,我们可以使用GS来使用全局优化:

AUTGS 1 ! 开启全局优化TAR 100约束1……约束2……MXC 100MNC 100GO

全局优化有两个可以控制的参数,一个是差异系数,它对应于生成的每个初始结构的差异,但说实话我自己都没有修改过这个数值,有使用过的小伙伴可以在评论区里交流;另一个则是允许最大的误差函数,也就是只有系统在经历过初始优化之后,评价函数要小于TAR指令指定的数值,才能够被保存下来。这个指令不影响优化过程,只影响最终保存下来的结果数量,毕竟有的时候一个周末可能跑出几百个解。

在进行全局优化的时候通常每个结构只会执行一次标准优化,所以循环次数可以设得较大,来保证系统得到充分的收敛。我个人的习惯通常会设置100-200,系统较为复杂的时候会用更多的次数。

全局优化示意图

全局优化的优点是能够同时生成多个解,即使初始结构不够好,也有可能找到更好的结构去进行后续的优化。就像在上图中,每一个红点都是一个初始结构,有的可能会陷入局部最优,但是如果时间足够的话,我们也能够找到一些全局最优解附近的结构。同时通过TAR指令结合较大的循环次数,我们就能够排除掉部分没有太大潜力的初始结构。

我个人的体验是对于镜片较少的情况(如六片以下、双高斯等),初始结构性能一般,全局优化能找到更好的解;但是对于镜片较多的情况(15片或以上、非球面等),全局优化的效果就不那么好,尤其是约束设置得不好时,更是容易跑出一些不能用的结构[1],这时候也需要根据优化的结果修改约束的方式,还是不能做甩手掌柜。分步优化(step optimization)

分步优化是一种具体的优化方法,替代的是默认的阻尼最小二乘法,所以可以在标准优化和全局合成中都使用这种方法来进行优化,其开启的位置也位于前面的选项旁边。

分步优化开启方式

在使用.seq文件进行优化时,我们通过添加STP指令来开启分步优化:

AUTSTP YES约束1……约束2……MXC 100MNC 100GO

相比于标准优化,分步优化的特点在于优化过程中不会单纯追求评价函数的持续下降,而是会在一定的范围内浮动,以期找到评价函数更低的解。这个原理有点类似于Zemax中的锤形优化,但由于没有材料替换机制,分步优化只能够实现锤形优化的部分效果。

分步优化具有跨越能力的优化方法既是它的好处,也是它的限制:好处是能够避免一些较“浅”的局部最优,提高优化效果;限制则是我们不能用改善比例IMP来控制优化过程的退出,因为存在负改善的时候,同时对当前系统的优化程度应该不及标准优化。

分步优化示意图

在实际操作中,我会选择性使用分步优化:

一是在初步优化阶段使用,寻找更好的初始结构。这个阶段可以结合全局优化指令实现在同一时间内寻找到更好的解;

二是在性能提升阶段,当替换材料等操作后系统的评价函数明显变大,例如从几十变成了几千,这个时候为了尽可能贴近替换前的系统,我就会在替换后的这一轮优化中使用分步优化。

此外,官方文档中也是建议在较为复杂的系统中使用,并且在设计初期使用这个优化方法。使用了分步优化之后,还需要再切换为标准优化等方式再进行更加深入的优化。

扩展优化(extended optimization)

扩展优化的开启位置位于“自动化设计-高级-优化控制”中,点击收敛速度控制之后就可以看到扩展优化和加速收敛两个选项。勾选扩展优化即可激活这一优化模式,加速收敛系数可选,默认为1,官方文档里建议取值不超过2。

扩展优化不能够和分步优化同时使用,如果在前面激活了分步优化,那么扩展优化选项就不能打开了。

扩展优化开启方式

在.seq文件中,对应的指令为EXT和CNV:

AUTSTP NO ! 关闭分步优化EXT YES ! 开启扩展优化CNV 1.2 ! 收敛系数设置为1.2约束1……约束2……MXC 20MNC 20GO

虽然文档中说当评价函数低于一定限度之后也就是进入优化后期之后,扩展优化就会自动开启,但是目前我都是自行开启这个优化模式,可能我的设计没有满足官方定义的“优化后期”。在扩展优化的模式下,每个循环中,算法都会利用当前循环内的导数信息进行额外的尝试,这种尝试有时候就能够找到更好的优化方向。在命令行输出中可以看到每个cycle中会有多个extended步骤,这些步骤对应的评价函数可能会低于原来的评价函数,使得单个cycle的下降量比只执行主步骤还要更多一些。

加速收敛系数对应的就是cycle内的扩展步骤允许的评价函数变化范围,数值越大,变化也可能越大。因此如果这个参数设置得过小,扩展优化和标准优化可能没有太大的差别;设置得过大,评价函数可能出现上下波动,而不能够很好地降低。我目前常常将其设置为1.3-1.5之间。

扩展优化示意图

在实际使用过程中,我在性能平衡阶段会考虑启用扩展优化。一方面到了性能平衡阶段会更希望能够尽可能在调整系统的时候(约束评价函数),成像质量(像差评价函数)不要劣化得太多,这个时候我们需要对系统的性能“精打细算”;另一方面则是开启扩展优化有时候也未必能够有效地提高优化效果,但是一定能够增加所消耗的优化时间(笑)。基于这两者的平衡,我也不一定会开启这个优化模式。

后面有时间我还想着详细对比一下这两个的结果,到时候一起更新进来。

粗略优化(rough optimization)

这个优化模式我只使用过一次,而且结果还不好,系统跑崩了,所以下面的内容只是简单的介绍。

粗略优化的策略是忽略评价函数中像差的部分,而只保留约束的部分,而后往降低评价函数的方向去优化。这个优化方式乍看之下能够在系统实际值相对于约束目标值较远的时候,快速地找到满足目标的结构,但是实际上由于这个过程中没有像差约束,系统可能跑一下就变成无法成像的状态了。

因此在实际优化的过程中,对于不满足约束的情况我还是采取另外两种方法更多:

一是将其改写为惩罚函数约束方式,慢慢调整系统直至满足约束要求;

二是手动修改系统,使得系统既能够满足约束条件,又不会因为没有像差组成评价函数而进入崩坏状态。

如果有小伙伴有较多的粗略优化经验,也欢迎在评论区继续交流。

小结优化方式与设计阶段之间的匹配

本篇我们按照上一篇介绍的优化阶段,介绍了CODEV中不同的优化方法。总体来说,标准优化占据了超半壁江山,另外几种优化方法更倾向于解决特定问题。

标准优化最为泛用,优化的目标是为了最小化评价函数,在任何一个设计阶段都可以使用;

全局优化可以生成一系列更不相同的初始结构,有利于跳出局部最优,常常用于初步优化阶段;

分步优化类似于锤形优化,能够跨越较小的评价函数差异,寻找更好的结果,适用于性能提升阶段;

扩展优化在单个循环内计算得更多,有可能“压榨”出更多的性能,但是时间消耗也会随之增加,在性能平衡阶段可以考虑启用。

同时像全局优化、扩展优化都带有自己对应的控制因子,这些因子也会在一定程度上影响优化结果。不过目前我自己也没有太摸清其设置规律,之后如果有成系统的经验也会和大家分享,也欢迎大家留言分享对于CODEV几种优化方法的使用经验。

来源:语恬来了

相关推荐