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

如何将JModelica-Optimica代码转换为OpenModelica-Optimica代码并运行示例

适配OpenModelica的Van Der Pol优化模型修改方案

原代码的兼容性问题

原代码来自Akesson等人2009年Modelica会议论文,直接在OpenModelica中运行会遇到以下问题:

  • OpenModelica对finalTime的声明语法要求更严格,需显式在优化块内定义为变量
  • 输入变量u作为优化变量时,原写法无法被OpenModelica正确识别为自由变量
  • 部分约束的作用域写法不符合OpenModelica的解析规则

修改后的兼容代码

package y

// Van Der Pol振荡器的Modelica模型
model VDP
  Real x1(start=0);
  Real x2(start=1);
  Real u; // 改为普通Real变量,避免输入变量的优化限制
equation
  der(x1) = (1 - x2^2)*x1 - x2 + u;
  der(x2) = x1;
end VDP;

// 适配OpenModelica的Optimica优化规范
optimization VDP_Opt
  startTime = 0;
  finalTime(finalTime, free=true, initialGuess=1); // 显式声明finalTime为优化变量
  VDP vdp;
  Real cost(start=0);
  Real u(free=true, initialGuess=0.0); // 单独声明优化变量u
equation
  der(cost) = 1;
  vdp.u = u; // 将优化变量绑定到模型实例
  // 终端约束
  vdp.x1(finalTime) = 0;
  vdp.x2(finalTime) = 0;
  // 输入约束
  u >= -1;
  u <= 1;
  // 目标函数:最小化最终时刻的cost(即最小化finalTime)
  objective = cost(finalTime);
end VDP_Opt;

end y;

修改说明

  • 变量u的调整:把原模型的input Real u改为普通Real u,在优化块内单独声明u为优化变量后绑定到模型实例。OpenModelica对输入变量作为优化变量的支持有限,这种方式更可靠。
  • finalTime的显式声明:在优化块内直接定义finalTime为变量,指定free=true和初始猜测值,符合OpenModelica的Optimica语法要求。
  • 目标函数写法调整:将原代码中括号内的目标函数定义移到优化块的equation段后,用objective = ...的标准格式声明。
  • 约束优化:把原针对vdp.u的约束改为直接针对优化变量u,逻辑等价且更易被OpenModelica解析。

运行步骤

  1. 打开OpenModelica OMEdit
  2. 创建新Modelica文件,粘贴上述修改后的代码
  3. 右键点击VDP_Opt优化模型,选择Simulate > Optimize
  4. 在仿真设置中选择优化求解器(如IPOPT),点击运行即可获取结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 17:47:38