繁体   English   中英

Gekko if3 适用于 0 和 -0

[英]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()函数的解可能是x1x2 对于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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM