具有目标平方的优化问题可以使用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])
Run Code Online (Sandbox Code Playgroud)
但是,当我切换到绝对值目标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])
Run Code Online (Sandbox Code Playgroud)
我知道基于梯度的求解器不喜欢没有连续一阶和二阶导数的函数,因此我怀疑这种情况发生abs()在0没有连续导数的点。是否有任何的替代abs(),以可靠地解决在Python壁虎基于梯度的解算器的绝对值?