Tex*_*eer 7 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])
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壁虎基于梯度的解算器的绝对值?
这是使用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])
Run Code Online (Sandbox Code Playgroud)
回报:3.2 3.2
m.if3(condition, x1, x2)以value为条件,并返回x1if condition >= 0或x1if 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
| 归档时间: |
|
| 查看次数: |
110 次 |
| 最近记录: |