PyFMI运行Simulink导出FMU报步长需非负且可被0.2整除如何解决
PyFMI运行Simulink导出FMU步长报错解决方案
报错根因:你导出的FMU内置了Simulink的固定步长求解器,步长固定为0.2,要求所有仿真步长、通信步长必须为0.2的非负整数倍,你之前使用的0.02、0.004步长,以及initialize方法传入的0.1终止时间均不满足该要求,因此触发报错。
以下为3种可行解决方案,按需选择即可:
方案1:调整simulate方法参数适配现有FMU
你当前默认配置里ncp=500代表均匀输出500个通信点,步长为总仿真时长/500,默认不符合0.2的整除要求,两种修改方式:
- 指定
ncp为符合要求的值:仿真总时长/0.2 = 通信点数量,例如总仿真时长为10s时,ncp设为50即可,调用示例:
model.simulate(start_time=0, final_time=10, options={'ncp': 50})
- 关闭均匀通信点输出:不需要固定间隔输出结果时,将
ncp设为0,由FMU内置求解器控制步长,调用示例:
model.simulate(start_time=0, final_time=10, options={'ncp': 0})
方案2:调整手动步进的参数
如果使用do_step手动控制仿真流程,需要保证初始化的终止时间、每次步进的步长均为0.2的整数倍,示例代码:
# 初始化时终止时间设为0.2的整数倍即可 model.initialize(start_time=0, stop_time=10) current_time = 0 step_size = 0.2 # 步长取0.2的整数倍即可,如0.4、1.0都符合要求 while current_time < 10: model.do_step(current_time, step_size) current_time += step_size
你之前调用model.do_step(0, 1.0)本身步长是符合要求的,问题出在初始化时传入的终止时间0.1不符合规则,才会持续报错。
方案3:修改Simulink导出配置(适配更小步长需求)
如果确实需要更小的通信步长,回到Simulink修改FMU导出配置:将求解器的固定步长修改为你需要的最小粒度(如0.004),重新导出FMU后,0.004、0.02等步长即可满足整除要求。
内容的提问来源于stack exchange,提问作者bhomass
相关产品推荐
相关产品推荐

