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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 13:27:04