是否可以在 GEKKO 动态优化中定义变量的开始和结束时间?

Is it possible to define start and end time for variable in GEKKO dynamic optimization?

我有一个整体的时间框架,我想引入几个变量沿着那个时间框架进行优化,但它们在不同的时间间隔内是活跃的。假设我有:

总体时间范围: m.time = np.linspace(0,100,101)

变量 1 时间范围: m.time = np.linspace(20,50,31)

变量 2 时间范围: m.time = np.linspace(40,80,41)

我如何在同一优化中使用这两个变量并传达它们应该在整个时间范围内以特定时间间隔开始和结束?最后,我希望能够优化每个时间步长的变量之和。

GEKKO 中是否有任何选项可以告诉变量可以在哪些时间间隔内被优化器修改?例如,上面的变量 1 应该不可能在时间间隔 0-19 和 51-100 中更改。

一种方法是定义一个特定的 window,其中 objective 函数处于活动状态,例如 xobj 在 20-50 区间内为 1,否则为 0。

from gekko import GEKKO
import numpy as np
m = GEKKO()
m.time = np.linspace(0,100,101)
x = m.Var(2)
x_on = np.zeros(101); x_on[20:51]=1
xobj = m.Param(x_on)
m.Minimize(xobj*(x-3)**2)
m.options.IMODE=6
m.solve()

import matplotlib.pyplot as plt
plt.plot(m.time,x.value,'bo')
plt.show()

优化器识别出没有 objective 函数改进来改变 x 活动区域之外。如果有一个 objective 功能好处但变量不应该移动然后尝试使用 m.fix(var,val,pos).

from gekko import GEKKO
import numpy as np
m = GEKKO()
m.time = np.linspace(0,100,101)
x = m.Var(2)
for i in range(1,21):
    m.fix(x,val=2,pos=i)
for i in range(51,101):
    m.fix(x,val=2,pos=i)
    
m.Minimize((x-3)**2)
m.options.IMODE=6
m.solve()

import matplotlib.pyplot as plt
plt.plot(m.time,x.value,'bo')
plt.show()

这给出了相同的结果。