一个具有平方目标的优化问题在PythonGekko中使用IPOPT成功解决。
from gekko import GEKKO
import numpy as np
m = GEKKO()
x = m.Var(); y = m.Param(3.2)
m.Obj((x-y)**2)
m.solve()
print(x.value[0],y.value[0])
然而,当我切换到绝对值目标np.abs(x-y)
(abs
的numpy版本(或m.abs(x-y)
(abs
的Gekko版本(时,IPOPT解算器会报告一个失败的解决方案。绝对值近似CCD_ 5也失败。
失败的解决方案
from gekko import GEKKO
import numpy as np
m = GEKKO()
x = m.Var(); y = m.Param(3.2)
m.Obj(m.abs(x-y))
m.solve()
print(x.value[0],y.value[0])
我知道基于梯度的解算器不喜欢没有连续一阶和二阶导数的函数,所以我怀疑abs()
会发生这种情况,其中0
是一个没有连续导数的点。有没有abs()
的替代方案可以在PythonGekko中使用基于梯度的解算器可靠地求解绝对值?
您可以使用m.abs2,它考虑到了导数的问题,应该可以解决这个问题。
这里有一个使用gekko的二进制开关变量的可能解决方案:
from gekko import GEKKO
import numpy as np
m = GEKKO()
y = m.Param(3.2)
x = m.Var()
#intermediate
difference = m.Intermediate(x - y)
f = m.if3(difference, -difference, difference)
m.Obj(f)
m.solve()
print(x.value[0],y.value[0])
退货:3.2 3.2
m.if3(condition, x1, x2)
以值为条件,如果condition >= 0
,则返回x1
;如果condition < 0
,返回x1
。
在文档的逻辑函数部分中,有各种函数可以解决这个问题,包括m.abs2
、m.abs3
和m.if2
。
类型2函数使用MPCC来解决,并将继续使用IPOPT。类型3功能将自动更改为APOPT。
https://github.com/BYU-PRISM/GEKKO/blob/master/docs/model_methods.rsthttps://gekko.readthedocs.io/en/latest/model_methods.html#logical-功能