微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Gekko的方程式中将负值设置为零?

如何解决在Gekko的方程式中将负值设置为零?

如何在方程式中将变量的所有负值设置为零。我尝试使用m.max2(0,W),所以当W为负数时我会得到零,但当W为负数时我会得到值,但是由于W被定义为W.dt()==s*p,所以值似乎在尾随我无法设置下限零,因为我在其他地方需要负值。

解决方法

max2函数是具有互补约束(MPCC)的数学程序,有时在W=0收敛时很难,因为它是优化的鞍点。另一个选择是max3函数,但这需要一个混合整数求解器,这可能需要更多时间来计算求解。第三种选择是使用诸如w * (0.5*tanh(b*w)+0.5)之类的函数来获得与max函数的连续可微近似。您可以将b设置为较高的值,但这样会使问题更难解决。

tanh function

另一种选择是使用更高的b值来解决问题,就像内部点方法中的障碍函数一样。

这是一个具有所有三个功能的示例脚本:

import numpy as np
from gekko import GEKKO
m = GEKKO()
w = m.Param(np.linspace(-10,10,101))
x = m.Intermediate(w * 0.5*(m.tanh(10*w)+1))
y = m.max2(w,0)
z = m.max3(w,0)

m.options.IMODE=2
m.solve()

import matplotlib.pyplot as plt
plt.plot(w,x,'ko',label='x=0.5 w (tanh(10w)+1)')
plt.plot(w,y,'b-',label='y=min2(w,0)')
plt.plot(w,z,'r--',label='z=min3(w,0)')
plt.legend()
plt.show()

max functions

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。