在 Gekko 的方程式中将负值设置为零?
Set negative value to zero in equation in Gekko?
如何在方程式中将变量的所有负值设置为零。我试过使用 m.max2(0,W)
所以当 W 为负时我得到零但当它为正时我得到值但是由于 W 被定义为 W.dt()==s*p
该值似乎落后我不能'设置下限为零,因为我在其他地方需要负值。
max2
函数是一个具有互补约束的数学程序 (MPCC),有时在 W=0
时很难收敛,因为它是优化的鞍点。另一种选择是 max3
函数,但这需要混合整数求解器,这可能需要更多时间来计算解决方案。第三种选择是使用 w * (0.5*tanh(b*w)+0.5)
之类的函数来获得对 max 函数的连续可微分逼近。您可以将 b
设置为更高的值,但这会使问题更难解决。
另一种选择是连续求解 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()
如何在方程式中将变量的所有负值设置为零。我试过使用 m.max2(0,W)
所以当 W 为负时我得到零但当它为正时我得到值但是由于 W 被定义为 W.dt()==s*p
该值似乎落后我不能'设置下限为零,因为我在其他地方需要负值。
max2
函数是一个具有互补约束的数学程序 (MPCC),有时在 W=0
时很难收敛,因为它是优化的鞍点。另一种选择是 max3
函数,但这需要混合整数求解器,这可能需要更多时间来计算解决方案。第三种选择是使用 w * (0.5*tanh(b*w)+0.5)
之类的函数来获得对 max 函数的连续可微分逼近。您可以将 b
设置为更高的值,但这会使问题更难解决。
另一种选择是连续求解 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()