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

GEKKO动态优化:目标函数含滞后变量的Python实现与错误排查

GEKKO动态优化问题代码修正

原代码存在的问题

  • 变量名拼写错误:定义G(t)参数数组时使用的变量名是g_init,但赋值给Param时误写为gs_init,会直接触发名称报错
  • 索引与语法错误:目标函数中sum函数括号位置错误,且如果求和起始索引为0会出现yo[-1]的越界问题,和需求的计算逻辑不匹配
  • 约束值不匹配:问题明确要求Y(10)=3,但原代码中终点约束写为3.1,不符合需求
  • 求解模式选择错误:原代码设置IMODE=6(连续动态优化模式),但你是离散时段的优化问题,且自行为每个时段创建了独立决策变量,不需要定义m.time,使用稳态优化模式IMODE=3即可
  • 时间点数量不匹配:需求是t从0到10共11个时间点,原代码设置nt=10只有10个节点,缺少t=10的对应变量

修正后可运行的完整代码

from gekko import GEKKO
import numpy as np

# 初始化模型
m = GEKKO()

# 定义时间节点总数:t=0到t=10共11个节点
nt = 11
# 创建每个时段的决策变量Y(t),初始值设为5.64
y_init = np.array([5.64]*nt)
yo = [m.Var(value=y_init[i]) for i in range(nt)]

# 定义已知参数G(t),共10个值对应t=1到t=10的G值
g_init = np.array([-0.025751073, -0.026431718, -0.027149321, -0.025581395,
                   -0.026252983, -0.022058824, -0.020050125, -0.015345269,
                   -0.015584416, -0.01055409])
g = [m.Param(value=g_init[i]) for i in range(nt-1)]

# 添加约束条件
m.Equation(yo[0] == 5.64) # t=0的初始值约束
m.Equation(yo[-1] == 3) # t=10的终点值约束

# 定义目标函数:t从1到10求和[(Y(t)/Y(t-1) - G(t))]^2
m.Obj(sum( ((yo[i]/yo[i-1]) - g[i-1])**2 for i in range(1, nt) ))

# 设置为稳态优化模式
m.options.IMODE = 3
# 启动求解
m.solve(disp=True)

# 输出求解结果
print("各时段Y的最优值:")
for i in range(nt):
    print(f"t={i}, Y={yo[i].value[0]:.4f}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 00:06:11