[英]Gekko if3 works differet for 0 and -0
我正在尝试在 gekko 中使用if3方法,但它的工作方式与文档中的不同:
y = m.if3(condition,x1,x2)
y = x1 when condition<0
y = x2 when condition>=0
请看下面的例子:
from gekko import GEKKO
m = GEKKO(remote=False)
p = m.Param()
y = m.if3(p,1,0)
for val, expected in [(-1, 1), (0, 0), (1, 0)]:
p.value = val
m.solve(disp=False)
print("P=", p.value, " y=",y.value, " expected=", expected)
print()
m2 = GEKKO(remote=False)
p2 = m2.Param()
y2 = m2.if3(-p2,0,1)
for val, expected in [(-1, 1), (0, 1), (1, 0)]:
p2.value = val
m2.solve(disp=False)
print("P=", p2.value, " y=",y2.value, " expected=", expected)
输出为:(我使用的是 python3.9,gekko=1.0.4)
P= [-1.0] y= [1.0] expected= 1
P= [0.0] y= [1.0] expected= 0
P= [1.0] y= [0.0] expected= 0
P= [-1.0] y= [1.0] expected= 1
P= [0.0] y= [1.0] expected= 1
P= [1.0] y= [0.0] expected= 0
对于第一种情况,对于p=0求解器应该返回 0 还是我遗漏了什么? 一般来说,如何在 gekko 中编写以下 if 语句:
if val == 0:
y=constant1
elif val > 0:
y=constant2
我发现了类似的问题( Gekko Optimization Suite for Python - if3 always <0 ),但升级 gekko 版本并没有帮助。 感谢您的任何回答
感谢您在if3() 的文档中发现该错误。 文档已更新以与算法行为一致。 在转换点, if3()
函数的解可能是x1
或x2
。 对于if2()
函数(MPCC 形式),过渡点处的解也可能是两个值的线性组合。 Gekko 使用默认为 1e-6的求解器容差计算数值解。 更严格地设置求解器容差将有助于提高过渡点的分辨率。
m.options.RTOL=1e-8
m.options.OTOL=1e-8
可以移动m.if3()
转换点以避免 0 值的问题。 一种常见的策略是将转换向左m.if3(x-0.1)
或向右m.if3(x+0.1)
少量,特别是对于x=0
具有所需输出的混合整数问题。 例如,泵的能源使用可能类似于:
energy = 2e-5*voltage**2 + 0.5*voltage + 3.0
pump_energy = m.if3(voltage-0.1,0,energy)
这确保了当电压低于 0.1 时,泵不会报告能源使用情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.