python - 在 Gekko 的方程中将负值设置为零?
问题描述
如何在方程式中将变量的所有负值设置为零。我尝试过使用m.max2(0,W)
,所以当 W 为负时我得到零,但当它为正时我得到值,但由于 W 被定义为W.dt()==s*p
值似乎是尾随我不能将下限设置为零,因为我需要其他地方的负值。
解决方案
该max2
函数是具有互补约束 (MPCC) 的数学程序,有时在 at 时难以收敛,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()
推荐阅读
- python - 将python脚本及其依赖脚本转换为exe
- c++ - 使用与主代码不同的标志编译库
- io - 保存许多不同形状的张量的最佳方法?
- bash - 通过脚本在环境变量范围内的 PowerShell 灵活性
- python - 我的 CNN 心电图数据有 loss=nan 和 accruacy=0
- python - Python - 基于日期合并两个数据集 - 一个具有每日日期,另一个具有时间戳
- google-oauth - 如何使用 CDAP http 插件通过 OAUTH 2.0 获取 google cloud api?
- java - 如何使我的代码成为同步 POST volley 请求?
- python - Telegram Bot SendDocument pdf
- c - 使用单指针访问结构元素?