python - 将 Gekko 方程中的负值设置为零?

标签 python optimization 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 设置为更高的值,但这会使问题更难解决。

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

关于python - 将 Gekko 方程中的负值设置为零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64545345/

相关文章:

python - SQS : How can I read the sent time of an SQS message using Python's boto library

sql - MySQL 不使用带有 WHERE IN 子句的索引?

gekko - Gekko 中的 Step 函数实现

python - Pandas MultiIndex 的简单用例

python - 如何在django中设置excel文件的路径

python - 将数组分为两部分。需要更好的解决方案

c - 这样的优化有意义吗?

python - 在 Python 的 GEKKO 中实现宏观经济模型

python - 如何根据先前的解决方案在 Python Gekko 中重新初始化优化

Python MagicMock assert_used_once_with 不考虑参数?