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默认不优化吸收,你得手动加。

我一般这样处理:

  1. 先计算吸收:Abs = 1 - T - R
  2. 在目标里添加Abs项,目标值设为0(或你允许的最大值)
  3. 权重根据应用场景调整

比如做银反射镜,要求反射率>98%,吸收<0.5%。我会把吸收项的权重设得比反射项还高——因为吸收上去了,反射自然就下来了。

2.2 多目标权衡策略

做膜系设计,本质上就是个多目标优化问题。带宽、波纹、厚度,这三者往往互相矛盾。你想想看,想要宽带宽,通常就得增加层数;层数多了,厚度就上去了;厚度大了,波纹又不好控制。

怎么权衡?我总结了一个表格:

优先级 场景 带宽 波纹 厚度
1 宽带增透膜 高 中 低
2 窄带滤光片 低 高 中
3 激光高反膜 中 高 低
4 超薄手机镜头膜 中 中 高

这个表不是死的。实际项目中,你得根据客户需求动态调整。

我的经验: 做宽带膜时,先放宽波纹要求(比如允许±0.5%),等带宽达标了,再收紧波纹。分步走,比一步到位容易得多。

2.3 加权因子动态调整技巧

加权因子是评价函数里最灵活的参数。但很多人设好就不动了。其实,动态调整加权因子,能大幅提升优化效率。

2.3.1 为什么需要动态调整?

优化初期,膜系离目标很远。这时候如果某个目标的权重太高,优化器会拼命往那个方向跑,其他目标完全顾不上。等那个目标差不多了,再调整权重,把注意力转移到其他目标上。

说白了,就是“分阶段、抓重点”。

2.3.2 手动调整策略

我常用的手动调整流程:

  1. 第一阶段(前50次迭代): 所有目标权重设为1.0,快速找到可行解区域
  2. 第二阶段(50-200次迭代): 提高关键目标的权重(比如带宽边缘),压制次要目标
  3. 第三阶段(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

这三个目标互相制约。我这样处理:

  1. 初始设置: 在400、450、500、550、600、650、700nm设反射率目标,目标值0.5%,权重1.0。厚度约束设为500nm,权重0.5。
  2. 第一次优化(100次迭代): 结果平均反射率0.6%,波纹0.4%,厚度480nm。带宽达标,波纹超标。
  3. 调整权重: 把波纹控制项的权重提高到2.0,反射率权重降到0.8。厚度权重不变。
  4. 第二次优化(100次迭代): 结果平均反射率0.7%,波纹0.25%,厚度510nm。波纹达标,厚度超标。
  5. 再次调整: 厚度权重提高到1.5,波纹权重降到1.0。反射率权重保持0.8。
  6. 第三次优化(100次迭代): 结果平均反射率0.65%,波纹0.28%,厚度495nm。三个目标都达标。

你看,通过三次权重调整,我找到了一个可行的平衡点。如果一开始就把所有权重设成一样,很可能优化半天都达不到要求。

核心思路: 评价函数不是一成不变的。它应该随着优化进程动态调整。权重是你的指挥棒,指向哪里,优化器就往哪里跑。

2.5 本章知识结构

下面这张图总结了本章的核心逻辑:

评价函数深度定制知识结构图 评价函数深度定制知识结构 评价函数定制 自定义评价函数项 T / R / Abs 相位项 多目标权衡策略 带宽 vs 波纹 波纹 vs 厚度 带宽 vs 厚度 加权因子动态调整 手动调整 自动脚本 分阶段策略 核心:评价函数是动态的,权重是指挥棒

这张图把本章的三个核心内容串起来了。自定义项是基础,多目标权衡是策略,加权因子调整是手段。三者结合,才能做出真正好用的评价函数。

最后说一句: 评价函数定制没有标准答案。每个项目都不一样。我的建议是,多试、多调、多记录。把每次调整的权重和结果记下来,慢慢你就能找到感觉了。