如何将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解析。
运行步骤
- 打开OpenModelica OMEdit
- 创建新Modelica文件,粘贴上述修改后的代码
- 右键点击
VDP_Opt优化模型,选择Simulate > Optimize - 在仿真设置中选择优化求解器(如IPOPT),点击运行即可获取结果
内容的提问来源于stack exchange,提问作者Prims
相关产品推荐
相关产品推荐

