如何使用Python Gekko解决绝对值abs()目标?

时间:2019-10-31 15:12:40

标签: python numpy mathematical-optimization ipopt gekko

具有平方目标的优化问题可以通过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版本的absm.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中基于梯度的求解器可靠地求解绝对值吗?

2 个答案:

答案 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.abs2m.abs3m.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