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