5

使用 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()where 0is a point 没有连续导数的情况下。有没有其他方法可以abs()在 Python Gekko 中使用基于梯度的求解器可靠地求解绝对值?

4

2 回答 2

10

您可以改用 m.abs2,它考虑了导数的问题,应该可以解决问题。

于 2019-10-31T17:53:40.387 回答
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)将 value 作为条件,并返回x1ifcondition >= 0x1if condition < 0

在文档的逻辑函数部分有多种函数可以解决这个问题,包括m.abs2m.abs3m.if2

类型 2 函数使用 MPCC 求解并将继续使用 IPOPT。类型 3 功能将自动更改为 APPT。

https://github.com/BYU-PRISM/GEKKO/blob/master/docs/model_methods.rst https://gekko.readthedocs.io/en/latest/model_methods.html#logical-functions

于 2019-10-31T18:11:44.413 回答