Gekko动态优化结果图形验证、初始条件对比及代码问题咨询
问题解答
1. c_m2初始值为0的修复方案
你出现该问题有两个核心原因:
- 方程书写错误:你定义
c_m2初始值时的表达式为2*taxa2*M2*m.sqrt(grv/l_M2),但后续写约束方程时漏掉了M2项,导致方程和初始值冲突,求解器覆盖了你设置的初始值得到错误结果。 - 变量类型选择不当:
c_m2是M2和l_M2两个固定变量(FV)的函数,天然全时间步恒定,不需要定义为Var,直接定义为Intermediate即可,也不需要额外加约束方程。
修改方式:删除原代码中c_m2的Var定义和对应的约束方程,替换为一行Intermediate定义:
c_m2 = m.Intermediate(2*taxa2*M2*m.sqrt(grv/l_M2))
2. 初始值响应结果的保存方法
你可以先固定优化变量求解初始响应,再开启优化得到最优结果,具体操作步骤:
- 定义完
M2和l_M2后,先将二者的STATUS设为0,此时求解器不会调整这两个变量的取值,完全使用你给定的初始值计算 - 调用
solve()得到初始响应,将q1.value等需要对比的结果保存到普通Python变量中 - 再将
M2.STATUS和l_M2.STATUS设为1,再次调用solve()得到优化后的结果
示例代码片段:
# 先求解初始值响应 M2.STATUS = 0 l_M2.STATUS = 0 m.solve() # 保存初始结果 q1_initial = q1.value.copy() c_m2_initial = c_m2.value[0] # 开启优化求解最优结果 M2.STATUS = 1 l_M2.STATUS = 1 m.solve() # 后续绘图时直接绘制q1_initial和q1.value即可完成对比
3. IMODE=6的正确性说明
IMODE=6对应动态优化模式,适用于在整个时间序列上优化目标函数的场景,你的需求是最小化全时间域内q1的振幅,属于典型的动态参数优化问题,使用IMODE=6是完全正确的,不需要调整。
内容的提问来源于stack exchange,提问作者omar gutierrez
相关产品推荐
相关产品推荐

