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
相关产品推荐
相关产品推荐

