MetaModelStructuredComp使用slinear插值时偏导数校验大误差问题
问题根因
你遇到的slinear方法偏导数误差过大问题不属于配置错误,是OpenMDAO原生slinear双线性插值的解析偏导数实现存在逻辑缺陷:
- 双线性插值在网格节点位置属于数学上的不可导点,左右区间的插值斜率不一致
- OpenMDAO原生
slinear的解析导数实现默认固定取当前网格区间右端的斜率作为节点处导数,而复步法校验时,给输入添加的极小复数偏移会让计算点落到相邻区间,取到的是对应区间的真实斜率,二者就会出现量级差异 - 你测试的第二个节点
mach=7刚好落在网格节点上,刚好触发了这个边界逻辑,所以出现了10^-1量级的误差,非节点位置的导数计算(比如第三个测试点mach=7.5)就没有这个问题
验证依据
你提供的测试结果已经可以佐证该判断:
cubic方法本身是全局可导的,不存在节点不可导的问题,所以误差量级仅为10^-15,符合要求scipy_slinear方法的偏导数实现对网格节点处的斜率做了兼容处理(默认取左右斜率的平均或者单侧匹配有限差分逻辑),所以误差仅为10^-10量级,符合校验要求- 节点位置的
slinear插值结果本身是正确的,仅导数计算逻辑有问题,和你观测到的「插值结果表现正常,仅导数校验失败」的现象完全匹配
解决方案
有三种可行的处理方式,优先级从高到低:
- 直接改用
scipy_slinear插值方法:仅需要将interp_method参数的值替换为'scipy_slinear',不需要修改其他任何配置,插值结果和slinear完全一致,偏导数精度满足常规使用要求 - 规避节点输入:如果必须使用原生
slinear方法,可以给输入参数添加1e-12量级的极小偏移量,避免输入刚好落在网格节点上,即可让导数计算落到同一个区间内,误差回到正常水平 - 修复源码逻辑:如果需要从根源解决问题,可以修改OpenMDAO中
MetaModelStructuredComp的slinear导数计算逻辑,针对网格节点位置的导数做单侧斜率匹配或者平均处理
内容的提问来源于stack exchange,提问作者Guillermo Dominguez Calabuig
相关产品推荐
相关产品推荐

