Gekko,根据区间动态限制变量的下限

Gekko, dynamically limit lower bound of variables based on intervals

例如,如果我有一个变量 f 我希望下限为

我已尝试以下方法无济于事

limit1 = m.if3(f-0.25, 0.1, 0.25)
limit2 = m.if3(f-1,limit1, 0.75)
limit3 = m.if3(f-1.5, limit2, 1.7)
f.lower = limit3.value
f.upper = 3

这似乎能够正确设置下限,但是当我这样做时

print(f.lower,"<", f.value,"<", f.upper)

我得到[0.1] < [constant value independent of lower bound] < 3

现在,我在一个数组中有多个像 f 这样的变量,它们具有不同的下限可能性,并且都具有完全相同的值,就好像下限根本不重要一样

写作时

f.lower=f1

然后当我打印 f.lower.value 我得到

[correct lower bound] < [upper bound] < upper bound

我可能处理问题的方式不对,所以我希望得到一些帮助。

Gekko 变量的 .lower.upper 值只有一个值,在迭代过程中优化程序无法调整。

您可以使用分段线性 pwl 函数生成任意关系(如阶跃函数),如 Model Building Methods 中所示。在您的情况下,您希望 lower 绑定随着 f 的值更改而更改。这是一个仅用于显示 lower 函数的实现,因为它取决于 f:

from gekko import GEKKO
import numpy as np
m = GEKKO()
f = m.Param(np.linspace(0,2,200))
lower = m.Var()

d=1e-5
x_data = [-1e5,0.25,0.25+d,1,1+d,1.5,1.5+d,1e5]
y_data = [0.1,0.1,0.75,0.75,1.25,1.25,1.7,1.7]

m.pwl(f,lower,x_data,y_data)
#m.Equation(f>=lower)

m.options.IMODE = 2
m.solve()

import matplotlib.pyplot as plt
plt.plot(f,lower,'b--')
plt.plot(x_data,y_data,'ro')
plt.xlim([0,2])
plt.show()

我注释掉了等式 m.Equation(f>=lower),因为我的 f 值低于 0.1,这创建了一个不可行的解决方案。解决此问题的另一种方法是使用二进制变量,如 discussion of logical conditions in optimization. There is also an example in APMonitor of solving piecewise discontinuous functions with binary variables.

所示