You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenModelica生成的FMU在Python中仿真结果与原模型不一致求助

Modelica模型导出FMU后Python与OpenModelica仿真结果不一致问题

我将Modelica代码导出为FMU并在Python中调用仿真时,得到的结果和OpenModelica中的仿真结果不一致,尝试多种方法仍未解决,求排查方向。

Modelica模型代码

model integrator
  Modelica.Blocks.Continuous.Integrator y_to_x[6] annotation(
    Placement(visible = true, transformation(origin = {2, -12}, extent = {{20, 20}, {-20, -20}}, rotation = -180)));
  Modelica.Blocks.Interfaces.RealOutput x[6] annotation(
    Placement(visible = true, transformation(origin = {88, -12}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {100, 10}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
  Modelica.Blocks.Interfaces.RealInput y[6] annotation(
    Placement(visible = true, transformation(origin = {-82, -12}, extent = {{-20, -20}, {20, 20}}, rotation = 0), iconTransformation(origin = {-80, -40}, extent = {{-20, -20}, {20, 20}}, rotation = 0)));
equation
  connect(y_to_x.y, x) annotation(
    Line(points = {{24, -12}, {88, -12}}, color = {0, 0, 127}, thickness = 0.5));
  connect(y, y_to_x.u) annotation(
    Line(points = {{-82, -12}, {-22, -12}}, color = {0, 0, 127}, thickness = 0.5));

annotation(
    uses(Modelica(version = "4.0.0")));
end integrator;

Python调用代码

import numpy as np
import fmpy
from fmpy import dump

fmu_file = 'integrator.fmu'
model_description = fmpy.read_model_description(fmu_file)
dump(fmu_file)

t_start = 0; t_end = 200; t_step = 0.01

outputs = fmpy.simulate_fmu(
    fmu_file,
    start_time = t_start,
    stop_time = t_end,
    output_interval = t_step,
    input=np.array([0,2000,0,0,0,0], dtype=[("y[1]",np.float64), ("y[2]",np.float64), 
                                             ("y[3]",np.float64), ("y[4]",np.float64),
                                             ("y[5]",np.float64), ("y[6]",np.float64)]),
    output = ('x[1]','x[2]','x[3]','x[4]','x[5]','x[6]'))

可能的问题排查点

  • 输入数据格式错误:Python代码中构造输入数组的dtype定义时,"y[4]"和"y[5]"之间缺少逗号,会导致numpy解析数据类型失败,实际传入的输入不符合FMU要求。修正后的dtype应该是每个字段用逗号分隔。
  • 输入缺少时间维度:FMU的输入需要是时间序列,当前代码只传入了一组静态值,没有指定时间点。正确的输入格式需要包含time列,例如:
    input_data = np.array([
        (t_start, 0, 2000, 0, 0, 0, 0),
        (t_end, 0, 2000, 0, 0, 0, 0)
    ], dtype=[('time', np.float64), ('y[1]', np.float64), ('y[2]', np.float64),
              ('y[3]', np.float64), ('y[4]', np.float64), ('y[5]', np.float64), ('y[6]', np.float64)])
    
    这样才能让FMU识别输入信号在整个仿真周期内的取值。
  • 仿真配置不一致:检查OpenModelica和Python中使用的求解器、积分算法、步长是否一致。例如OpenModelica默认可能使用DASSL求解器,而fmpy默认使用CVode,不同求解器的积分结果可能存在差异;另外两者的仿真步长、误差容忍度设置也需要对齐。
  • FMU导出配置问题:确认导出FMU时选择的类型(Model Exchange或Co-Simulation)是否正确,OpenModelica导出FMU时是否启用了正确的选项(比如是否包含了所需的求解器接口,是否保留了模型的初始条件)。
  • 初始条件差异:检查两个环境中积分器的初始值是否一致。Modelica的Integrator默认初始值为0,如果在OpenModelica中修改了初始值,需确保FMU导出时保留该配置,或者在Python调用时通过start_values参数设置一致的初始值。

内容的提问来源于stack exchange,提问作者Elena

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 14:19:55