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列,例如:
这样才能让FMU识别输入信号在整个仿真周期内的取值。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)]) - 仿真配置不一致:检查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
相关产品推荐
相关产品推荐

