Gekko,根据区间动态限制变量的下限
Gekko, dynamically limit lower bound of variables based on intervals
例如,如果我有一个变量 f
我希望下限为
- 0.1 如果 f < 0.25
- 0.75 如果 f < 1
- 1.25 如果 f < 1.5
- 1.7 如果 f >= 1.5
我已尝试以下方法无济于事
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.
所示
例如,如果我有一个变量 f 我希望下限为
- 0.1 如果 f < 0.25
- 0.75 如果 f < 1
- 1.25 如果 f < 1.5
- 1.7 如果 f >= 1.5
我已尝试以下方法无济于事
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.