2、评价函数深度定制:自定义评价函数项(T, R, Abs, 相位)、多目标权衡策略(带宽 vs 波纹 vs 厚度)、加权因子动态调整技巧
评价函数(Merit Function),说白了就是优化器手里的那把尺子。它告诉你当前设计离目标还有多远。但TFCalc默认的评价函数,很多时候并不够用。我刚开始用的时候也踩过坑——默认优化出来的膜系,模拟看着挺好,实际做出来却差一截。后来才明白,问题出在评价函数上。
这一章,咱们就聊聊怎么把这把尺子做得更趁手。
2.1 自定义评价函数项
TFCalc允许你定义自己的评价函数项。不只是T、R、Abs,连相位都能加进去。这功能很强大,但很多人没用过。
2.1.1 基础项:T、R、Abs
这三个是最常用的。在TFCalc里,你可以在“Modify Target”里直接添加。但要注意,默认的权重是1.0,这往往不够。
关键点: 评价函数 = Σ [权重 × (目标值 - 当前值)²]
权重越大,优化器越优先满足这个目标。
举个例子,你想在400-700nm波段实现T>98%的增透膜。如果只设一个目标,优化器可能会在边缘波长上妥协。我建议你这样做:
- 在400nm、450nm、500nm、550nm、600nm、650nm、700nm各设一个目标
- 每个目标的权重设为1.0
- 在400nm和700nm处,权重可以提高到1.5
这样优化器就会更关注边缘波长的表现。
2.1.2 相位项:被忽视的关键
相位项在常规膜系里用得少,但在激光膜、偏振膜、以及某些特殊应用中,它是命门。
TFCalc里添加相位项的方法:
在Target Editor中:
1. 选择“Phase”作为目标类型
2. 输入波长和相位目标值(单位:度)
3. 设置权重
我记得有一次做激光分束膜,客户要求反射光和透射光的相位差控制在±2°以内。默认优化根本做不到。后来我在评价函数里加了相位项,权重设到5.0,才勉强达标。
注意: 相位项对膜层厚度极其敏感。加了相位项后,优化速度会明显变慢。建议先不加相位项做初步优化,最后再打开相位项做精细调整。
2.1.3 吸收项:金属膜必备
做金属膜时,吸收(Abs)是个大问题。TFCalc默认不优化吸收,你得手动加。
我一般这样处理:
- 先计算吸收:Abs = 1 - T - R
- 在目标里添加Abs项,目标值设为0(或你允许的最大值)
- 权重根据应用场景调整
比如做银反射镜,要求反射率>98%,吸收<0.5%。我会把吸收项的权重设得比反射项还高——因为吸收上去了,反射自然就下来了。
2.2 多目标权衡策略
做膜系设计,本质上就是个多目标优化问题。带宽、波纹、厚度,这三者往往互相矛盾。你想想看,想要宽带宽,通常就得增加层数;层数多了,厚度就上去了;厚度大了,波纹又不好控制。
怎么权衡?我总结了一个表格:
| 优先级 | 场景 | 带宽 | 波纹 | 厚度 |
|---|---|---|---|---|
| 1 | 宽带增透膜 | 高 | 中 | 低 |
| 2 | 窄带滤光片 | 低 | 高 | 中 |
| 3 | 激光高反膜 | 中 | 高 | 低 |
| 4 | 超薄手机镜头膜 | 中 | 中 | 高 |
这个表不是死的。实际项目中,你得根据客户需求动态调整。
我的经验: 做宽带膜时,先放宽波纹要求(比如允许±0.5%),等带宽达标了,再收紧波纹。分步走,比一步到位容易得多。
2.3 加权因子动态调整技巧
加权因子是评价函数里最灵活的参数。但很多人设好就不动了。其实,动态调整加权因子,能大幅提升优化效率。
2.3.1 为什么需要动态调整?
优化初期,膜系离目标很远。这时候如果某个目标的权重太高,优化器会拼命往那个方向跑,其他目标完全顾不上。等那个目标差不多了,再调整权重,把注意力转移到其他目标上。
说白了,就是“分阶段、抓重点”。
2.3.2 手动调整策略
我常用的手动调整流程:
- 第一阶段(前50次迭代): 所有目标权重设为1.0,快速找到可行解区域
- 第二阶段(50-200次迭代): 提高关键目标的权重(比如带宽边缘),压制次要目标
- 第三阶段(200次以后): 降低关键目标权重,提高次要目标权重,做精细平衡
举个例子,做400-700nm增透膜:
- 第一阶段:所有波长权重1.0
- 第二阶段:400nm和700nm权重提高到2.0,中心波长降到0.8
- 第三阶段:所有波长权重回到1.0,但加入波纹控制项,权重0.5
2.3.3 自动动态调整(高级技巧)
TFCalc支持用脚本控制加权因子。你可以写一个简单的循环:
// 伪代码示例
for iteration = 1 to 500
if iteration < 100
weight_bandwidth = 2.0
weight_ripple = 0.5
else if iteration < 300
weight_bandwidth = 1.0
weight_ripple = 1.5
else
weight_bandwidth = 0.8
weight_ripple = 2.0
end
run_optimization_step()
end
这样做的好处是,优化器会自动调整优先级,不会在一个目标上死磕。
注意: 自动调整脚本需要你对优化过程有很好的理解。我曾经试过权重变化太剧烈,结果优化器直接发散,膜系变得一塌糊涂。建议权重变化幅度每次不超过0.5。
2.4 实战案例:一个三目标权衡
咱们来看一个实际案例。我需要设计一个可见光波段(400-700nm)的增透膜,要求:
- 平均反射率 < 0.5%
- 最大波纹 < 0.3%
- 总厚度 < 500nm
这三个目标互相制约。我这样处理:
- 初始设置: 在400、450、500、550、600、650、700nm设反射率目标,目标值0.5%,权重1.0。厚度约束设为500nm,权重0.5。
- 第一次优化(100次迭代): 结果平均反射率0.6%,波纹0.4%,厚度480nm。带宽达标,波纹超标。
- 调整权重: 把波纹控制项的权重提高到2.0,反射率权重降到0.8。厚度权重不变。
- 第二次优化(100次迭代): 结果平均反射率0.7%,波纹0.25%,厚度510nm。波纹达标,厚度超标。
- 再次调整: 厚度权重提高到1.5,波纹权重降到1.0。反射率权重保持0.8。
- 第三次优化(100次迭代): 结果平均反射率0.65%,波纹0.28%,厚度495nm。三个目标都达标。
你看,通过三次权重调整,我找到了一个可行的平衡点。如果一开始就把所有权重设成一样,很可能优化半天都达不到要求。
核心思路: 评价函数不是一成不变的。它应该随着优化进程动态调整。权重是你的指挥棒,指向哪里,优化器就往哪里跑。
2.5 本章知识结构
下面这张图总结了本章的核心逻辑:
这张图把本章的三个核心内容串起来了。自定义项是基础,多目标权衡是策略,加权因子调整是手段。三者结合,才能做出真正好用的评价函数。
最后说一句: 评价函数定制没有标准答案。每个项目都不一样。我的建议是,多试、多调、多记录。把每次调整的权重和结果记下来,慢慢你就能找到感觉了。