如何确保GEKKO积分针对正确变量?附代码示例
GEKKO积分问题解决方案
核心问题修正说明
当前代码的关键问题是z1被定义为单个m.Var,并非随时间维度变化的变量,而GEKKO的m.integral()默认对m.time维度积分,需将z1设为时间相关变量;同时实际场景中x是周期数组,要正确定义为时间维度的变量数组。
修正后的代码示例
import numpy as np from gekko import GEKKO m = GEKKO() T = 100 m.time = np.linspace(0.7, 1.7, T) # z1定义为随时间变化的变量数组,每个时间步独立取值 z1 = m.Array(m.Var, T, lb=0.7) # x定义为T周期的变量数组,每个时间步可由求解器调整 x = m.Array(m.Var, T, lb=1) # 构造每个时间步的被积表达式,再传入integral完成时间维度积分 integrand = [(z1[i] * 4.67 + x[i]**0.27)**11.03 / (x[i]**3) for i in range(T)] Z = m.Intermediate(m.integral(integrand)) m.Obj(Z) m.options.IMODE = 6 # 动态优化模式适配离散时间场景 m.solve(disp=True)
关键实现要点
- 时间变量定义:用
m.Array(m.Var, T)创建与m.time长度匹配的变量数组,确保每个时间步的z1和x都能被求解器独立优化。 - 积分逻辑:GEKKO的
m.integral()会自动根据m.time的步长对输入的时间序列表达式完成数值积分,无需手动计算步长权重。 - 模式适配:保持
IMODE=6(动态优化模式),契合离散时间优化的需求,求解器会同步优化全周期的变量值。
内容的提问来源于stack exchange,提问作者GaL
相关产品推荐
相关产品推荐

