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

为何无法在OpenModelica中仿真或生成该代码的FMU?

问题分析

你的代码核心问题是混淆了Modelica中「参数(Parameter)」和「输入(Input)」的本质区别:Gain块的k是编译时确定的常量参数,不能直接用仿真时动态变化的输入变量value1赋值——这种写法会让模型在编译阶段无法确定参数的固定值,导致仿真失败、无法导出FMU。

解决方案

要实现「通过输入动态调整增益」的需求,不能修改参数,而是要基于动态变量搭建逻辑,以下是两种可行方案:

方案1:用Product模块替代Gain

利用乘法模块将输入的增益因子与信号相乘,实现动态增益效果:

model test
  input Real value1;       // 动态调整的增益值
  input Real u;            // 原始输入信号
  Modelica.Blocks.Math.Product product annotation(
    Placement(visible = true, transformation(origin = {200, 84}, extent = {{-10, -10}, {10, 10}})));
  output Real y;           // 最终输出信号
equation
  y = product.y;
  // 连接信号与增益因子到乘法模块
  connect(u, product.u1);
  connect(value1, product.u2);
annotation(
  Diagram(coordinateSystem(extent = {{100, 100}, {300, 60}})),
  uses(Modelica(version = "4.0.0")));
end test;

方案2:自定义动态增益模块

如果需要更灵活的封装,可以自己实现一个极简的动态增益模型:

model DynamicGain
  input Real gain;    // 动态输入的增益值
  input Real u;       // 输入信号
  output Real y;      // 输出信号
equation
  y = gain * u;       // 直接通过方程实现动态乘法
end DynamicGain;

// 调用自定义模块的测试模型
model test
  input Real value1;
  input Real u;
  DynamicGain gamma annotation(
    Placement(visible = true, transformation(origin = {200, 84}, extent = {{-10, -10}, {10, 10}})));
  output Real y;
equation
  y = gamma.y;
  connect(u, gamma.u);
  connect(value1, gamma.gain);
annotation(
  Diagram(coordinateSystem(extent = {{100, 100}, {300, 60}})),
  uses(Modelica(version = "4.0.0")));
end test;
Python中操作FMU的示例

修改后的模型可正常导出FMU,用fmpy库(Python常用FMU处理工具)加载后,即可动态设置value1输入并运行仿真:

from fmpy import read_model_description, extract, simulate_fmu
import numpy as np

# 加载FMU模型信息
model_desc = read_model_description('test.fmu')

# 提取FMU到临时目录
unzip_path = extract('test.fmu')

# 定义仿真输入:设置value1随时间变化的序列
input_signals = [
    ('time', np.array([0, 1, 2, 3])),
    ('value1', np.array([1, 2, 0.5, 3])),
    ('u', np.array([1, 1, 1, 1]))  # 示例:输入信号u恒定为1
]

# 运行仿真并获取结果
sim_result = simulate_fmu(
    unzip_path,
    start_time=0,
    stop_time=3,
    input=input_signals,
    output=['y']
)

# 打印仿真结果
print(sim_result)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 10:42:59