GAMS:在逻辑条件下使用变量

时间:2018-03-13 18:42:30

标签: dollar-sign gams-math

我有一个关于GAMS的问题。我是GAMS的初学者。 我使用minlp和scip solver。

我正在尝试为集中式太阳能发电厂的热能存储系统建模。 我现在正忙着为坦克操作策略建模方程式,所以无论是在放电模式还是充电模式下。我正在对一个温跃层坦克进行建模,在这里,从热水箱顶部进入充满热量的htf并从底部推出冷htf。对于放电过程,它是相反的。

操作策略取决于来自接收器或功率块的质量流量,它们是决策变量。对于不同的操作策略,热能存储器的入口和出口温度改变。因此,有些方程在逻辑上取决于决策变量的值。

问题是,如果我尝试使用逻辑条件(使用if运算符或$运算符)及其中的变量来定义方程式,我会得到错误52或53"内生$ - 不允许控制操作"。这似乎是使用solve语句得到的错误,因为不可能将决策变量置于逻辑条件中。在互联网上做了一些研究之后,我发现了这些威胁,它的解释非常好:

https://forum.gamsworld.org/viewtopic.php?f=13&t=6795

Use variable in GAMS dollar

因此,我遇到了一些问题:

有没有人知道一种可能的方法,我可以在哪里建模方程式,这在逻辑上取决于决策变量?或者这对GAMS来说是不可能的,所以我需要切换到另一种语言来解决这个问题?

这些将是重要的等式:

e_charge(i+1)$(m_rc_ts(i+1) > 0) .. dec(i+1) =e= 1;

e_discharge(i+1)$(m_pb_ts(i+1)) .. dec(i+1) =e= 2;

e_no_use(i+1)$(m_rc_ts(i+1) = 0 and m_pb_ts(i+1) = 0) .. dec(i+1) =e= dec(i);

e_m_rc_ts_restrict(i+1)$(dec(i+1) = 2) .. m_rc_ts(i+1) =e= 0;

e_m_pb_ts_restrict(i+1)$(dec(i+1) = 1) .. m_pb_ts(i+1) =e= 0;

e_T_ti_charge(nfirst,i+1)$(dec(i+1)= 1) .. T_fl(nfirst,i+1) =e= T_ro;

e_T_ti_discharge(nfirst,i+1)$(dec(i+1)= 2) .. T_fl(nfirst,i+1) =e= T_po(i+1);

感谢您的帮助!

干杯

1 个答案:

答案 0 :(得分:0)

您不能使用变量本身,但您可以使用其属性: 所以你不能写

$(dec(i+1))

$(dec.l(i+1))

有效(它是变量的级别)。