同一步骤内Model Exchange FMU状态导数未更新问题咨询
Heun法求解ME类型FMU导数未更新问题排查
核心原因
该问题是调用流程不符合FMI2 Model Exchange规范导致的,FMU内部的时间、状态缓存未完成同步刷新,导数计算仍基于旧的运行上下文,因此返回的结果和预估步导数一致。
现有流程的问题
- 完成Heun法修正状态计算后,未同步更新FMU时间:你在获取预估步导数后将时间重置回了
t,设置完最终状态后未将时间更新到t + h,调用导数获取接口时,模型仍以t时刻的时间参数参与计算。 - 缺失积分步完成通知调用:FMI2 ME规范明确要求,自定义求解器完成一个积分步的状态更新后,必须调用
fmi2_import_completed_integrator_step()通知FMU积分完成,触发内部离散事件处理、状态缓存刷新逻辑,否则FMU不会主动更新导数计算依赖的内部变量。 - 若模型存在随时间变化的外部输入,调用导数接口前未更新
t + h时刻的输入值,也会导致导数计算结果异常。
修正方案
在你现有代码的最后一次fmi2_import_set_continuous_states调用后,补充以下流程即可:
// 1. 将FMU时间更新到当前积分步结束时刻 fmistatus = fmi2_import_set_time(fmu, t + h); // 2. 若模型有外部输入,此处设置t+h时刻对应的输入值 // fmi2_import_set_real(fmu, input_vrs, input_count, input_values); // 3. 通知FMU积分步完成,处理内部事件、刷新缓存 fmi2_boolean_t need_event_update; fmistatus = fmi2_import_completed_integrator_step(fmu, fmi2_true, &need_event_update); // 若返回需要处理事件,先完成事件迭代再继续后续操作 if (need_event_update) { // 按FMI2规范实现离散事件处理逻辑即可 } // 此时调用fmi2_import_get_derivatives()即可获取到更新后的正确导数值
内容的提问来源于stack exchange,提问作者bruaug
相关产品推荐
相关产品推荐

