首页 > 解决方案 > 在 Gekko 的方程中将负值设置为零?

问题描述

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

标签: pythonoptimizationgekko

解决方案


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

tanh 函数

另一种选择是连续解决具有较高值的​​问题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()

最大功能


推荐阅读