使用FMPy运行Simcenter导出FMU时出现NaN值问题求助
FMU在FMPy中运行多步后返回NaN的问题求助
场景与问题描述
- 运行环境:Azure容器中使用FMPy运行Simcenter导出的FMU,步长设为
5e-7 - 架构:FMU与本地Simulink模型构成循环反馈回路,要求每次仅运行FMU一步,返回结果至Simulink并保持FMU活跃(实现参考FMPy的
continue_simulation.py示例) - 异常表现:Simulink直接运行FMU一切正常,但改为Matlab函数块路由至容器后,第7步开始结果与直接运行差异极大,第10步输出变为
NaN - 当前
simulate_fmu()配置参数:
filename model_description fmu_instance input initialize=False start_time=0(下次计划设为5e-7) stop_time=5e-7(下次计划设为1e-6) step_size=5e-7 terminate=False set_stop_time=False
求助问题
- 针对该分步运行、保持FMU活跃的场景,应使用FMPy中的哪些变量/参数?
- 如何解决FMU运行多步后返回
NaN的问题?
问题1:分步运行场景的FMPy参数配置
针对每次运行一步、保持FMU活跃的场景,核心参数与配置逻辑如下:
- 必须保留的参数:
fmu_instance:必须复用同一个实例,不能每次重新创建,这是维持FMU活跃状态的核心initialize=False:首次初始化后,后续步骤不能再调用初始化,避免重置FMU内部状态terminate=False:每次运行结束后不终止实例,确保后续可继续调用
- 必须修正的参数:
start_time:每次运行必须设为上一次运行的结束时间(比如第一次start=0,stop=5e-7;第二次start=5e-7,stop=1e-6,以此类推),固定为0会导致FMU重复计算同一时间段,内部状态混乱stop_time:必须设为start_time + step_size,保证每次仅运行一个步长set_stop_time=True:需要启用该参数,确保FMU更新内部的停止时间,否则可能沿用初始值导致计算异常
- 建议补充的参数:
solver:如果是ModelExchange类型的FMU,指定与Simulink一致的求解器(如'CVode'),避免求解器差异引发结果偏差output:明确指定需要输出的变量,减少不必要的计算开销
问题2:NaN值问题的排查与解决方法
结合场景,NaN通常由FMU内部状态异常或计算逻辑冲突导致,可按以下步骤处理:
- 修正时间参数配置
立即调整start_time和stop_time为连续递增的时间(每次start=上一次stop,stop=start+step_size),同时设置set_stop_time=True。之前固定start_time=0会导致FMU反复从初始状态计算,内部状态积累错误最终溢出为NaN,这是最可能的原因。 - 验证输入数据的连续性
- 检查Simulink速率转换模块输出的输入值,确保没有跳变、NaN或不合理的数值传入FMU
- 确认输入数据的时间戳与FMU当前的
start_time完全匹配,避免时间错位引发计算异常
- 检查FMU状态一致性
- 复用
fmu_instance时,确保没有误调用重置FMU状态的API,比如reset() - 通过FMPy的
get_real()、get_integer()等API,对比Simulink直接运行时和容器中FMU的内部状态,定位差异点
- 复用
- 调整步长与求解器设置
- 尝试微调步长(如改为
4.9e-7),避免步长与FMU内部求解器的时间步冲突导致数值不稳定 - 如果是ModelExchange FMU,尝试切换求解器或调整容差参数(如
relative_tolerance=1e-6)
- 尝试微调步长(如改为
- 检查FMU导出配置
- 确认Simcenter导出FMU时的求解器、步长设置与FMPy中使用的一致
- 导出时启用状态保存选项,确保FMU能正确保留内部状态用于分步运行
内容的提问来源于stack exchange,提问作者Taurius
相关产品推荐
相关产品推荐

