具有平方目标的优化问题可以通过Python Gekko中的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)
(numpy版本的abs
或m.abs(x-y)
(gekko版本的abs
)时,IPOPT求解器报告失败的解决方案。绝对值逼近m.sqrt((x-y)**2)
也会失败。
失败的解决方案
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()
之外,还可以使用Python Gekko中基于梯度的求解器可靠地求解绝对值吗?
答案 0 :(得分:7)
您可以改用m.abs2,它考虑了派生问题,应该解决问题。
答案 1 :(得分:5)
这是使用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)
将值作为条件,如果x1
返回condition >= 0
,如果x1
返回condition < 0
。
文档的逻辑功能部分提供多种功能来解决此问题,包括m.abs2
,m.abs3
和m.if2
。
类型2函数使用MPCC进行求解,并将继续使用IPOPT。类型3功能将自动更改为APOPT。
https://github.com/BYU-PRISM/GEKKO/blob/master/docs/model_methods.rst https://gekko.readthedocs.io/en/latest/model_methods.html#logical-functions