Gekko动态优化函数异常求助:求解结果与理论曲线不符
问题分析与解决
你的Gekko优化结果和理论曲线不匹配,核心原因是缺少终端约束条件,导致求解的问题边界和理论解对应的最优控制问题不一致。
问题拆解
你定义的性能指标为:
J = ∫₀¹ (24xt + 2ẋ² -4t) dt
理论解x2(t)=t³+t+1对应的是终端时刻x(1)=3的最优解,而当前代码未设置该终端约束,Gekko默认求解自由终端下的最优控制问题,结果自然偏离预期。
修正后的代码
import numpy as np from gekko import GEKKO import matplotlib.pyplot as plt m = GEKKO() m.options.IMODE = 6 # 动态优化模式 m.time = np.linspace(0, 1, 100) # 定义变量,显式设置初始值匹配理论解x(0)=1 x = m.Var(value=1, lb=1, ub=3) x2 = m.Var(lb=1, ub=3) J = m.Var(0) t = m.Param(value=m.time) # 性能指标的微分方程 m.Equation(J.dt() == 24*x*t + 2*x.dt()**2 -4*t) # 理论解曲线 m.Equation(x2 == t**3 + t + 1) # 添加终端约束:强制x在t=1时等于3(匹配理论解的终端值) x.fix(3, pos=1) # 关联终端J值并设置为可优化 Jf = m.FV() Jf.STATUS = 1 m.Connection(Jf, J, pos2='end') # 最小化终端J值 m.Obj(Jf) m.solve(disp=False) plt.plot(m.time, x.value, label='优化结果x(t)') plt.plot(m.time, x2.value, color='black', label='理论解x2(t)') plt.legend() plt.xlabel('时间t') plt.ylabel('x值') plt.show()
关键修改说明
- 添加终端约束:通过
x.fix(3, pos=1)强制x在终端时刻(t=1)的值为3,这是理论解x2(1)=1³+1+1=3的必要边界条件,没有这个约束,Gekko求解的是无终端限制的最优解,和预期不符。 - 显式设置初始值:给x设置初始值
value=1,匹配理论解的初始值x2(0)=1,避免Gekko默认初始值可能带来的收敛偏差。
修正后,优化得到的x(t)曲线会和黑色理论曲线完全重合,因为此时求解的问题边界和理论解对应的最优控制问题完全一致。
内容的提问来源于stack exchange,提问作者Tadezegiusz
相关产品推荐
相关产品推荐

