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

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()

关键修改说明

  1. 添加终端约束:通过x.fix(3, pos=1)强制x在终端时刻(t=1)的值为3,这是理论解x2(1)=1³+1+1=3的必要边界条件,没有这个约束,Gekko求解的是无终端限制的最优解,和预期不符。
  2. 显式设置初始值:给x设置初始值value=1,匹配理论解的初始值x2(0)=1,避免Gekko默认初始值可能带来的收敛偏差。

修正后,优化得到的x(t)曲线会和黑色理论曲线完全重合,因为此时求解的问题边界和理论解对应的最优控制问题完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 11:26:34