GEKKO动态优化中是否可为变量设置生效的起止时间区间?
GEKKO多变量分时间区间生效优化实现方案
GEKKO没有直接指定变量可优化时间区间的内置配置项,你可以通过以下方案实现需求,无需为每个变量单独设置时间轴,统一使用全局时间范围即可:
方案1:固定非生效区间的变量值(推荐)
通过逐点设置变量的上下限相等,让优化器无法修改非生效区间的变量值,示例代码如下:
import numpy as np from gekko import GEKKO m = GEKKO() # 全局统一时间轴 m.time = np.linspace(0,100,101) # 定义变量1:仅20-50区间可调整 var1 = m.MV(value=0, lb=0, ub=100) # 上下限可根据你的业务需求修改 var1.STATUS = 1 # 锁定非生效区间的变量值为固定值(示例为0,可按需调整) for i, t in enumerate(m.time): if t < 20 or t > 50: var1.LOWER[i] = 0 var1.UPPER[i] = 0 # 定义变量2:仅40-80区间可调整 var2 = m.MV(value=0, lb=0, ub=100) var2.STATUS = 1 for i, t in enumerate(m.time): if t < 40 or t > 80: var2.LOWER[i] = 0 var2.UPPER[i] = 0 # 计算各时间步的变量总和 sum_per_step = m.Intermediate(var1 + var2) # 示例优化目标:最小化所有时间步总和的积分,可按需修改为你的目标 m.Minimize(m.integral(sum_per_step)) # 求解配置 m.options.IMODE = 6 # 动态优化模式 m.solve(disp=True)
该方案逻辑简单直观,所有变量在统一时间轴上运算,后续汇总统计无需额外处理,求解效率也更高。
方案2:条件截断变量贡献
如果非生效区间的变量值不需要固定,只是不参与最终总和计算,可以用m.if3条件函数做截断:
# 仅做截断示例,非生效区间变量仍可被优化器调整,不会影响目标 var1_eff = m.if3(m.time-20, 0, m.if3(50-m.time, 0, var1)) var2_eff = m.if3(m.time-40, 0, m.if3(80-m.time, 0, var2)) sum_per_step = m.Intermediate(var1_eff + var2_eff)
该方案不会锁定非生效区间的变量值,可能会引入无意义的求解开销,仅适用于特殊场景。
注意事项
- 所有变量的时间轴需要和全局
m.time保持一致,不要单独为某个变量修改m.time配置,否则会出现维度不匹配报错。 - 非生效区间的固定值可按需调整,比如需要维持某个初始值的话,直接把上下限设置为对应初始值即可。
内容的提问来源于stack exchange,提问作者Hampus Alfredsson
相关产品推荐
相关产品推荐

