Page 1 of 2

### logical equations & binary variables

Posted: Fri Mar 16, 2018 7:34 pm
Hey guys,

I got another question on logical equations or rather binary variables. This is again a beginner question.

So right now I'm trying to understand how to set the value of binary variables with conditions.

Consider the binary variable x and variable m.
If i would write the code in other language synthex, what I'm trying to do would look like:

if m > 0
x = True
else
x = False
end

So I'm trying to set the value of x to 1, when the variable m is greater than zero.

How do I model this in GAMS? Do I need to use logical equations for it?
I can't find a solution for this.

Cheers
Max

### Re: logical equations & binary variables

Posted: Fri Mar 16, 2018 9:12 pm
Just include the following constraint:

m-Mx <=0

where M is an upper bound for m.

### Re: logical equations & binary variables

Posted: Fri Mar 16, 2018 10:00 pm
Hi, try these equations

eq1.. m =g= m.lo*x;
eq2.. m =l= m.up*x;

m.lo (lower bound)
m.up (upper bound)

if x=1
m greater than m.lo*1;
m lower than m.up*1
if x=0
m greater than m.lo*0;
m lower than m.up*0;
so, m = 0

Bye!

### Re: logical equations & binary variables

Posted: Sat Mar 17, 2018 8:53 am
You are really helping me with my project.

I got another question:
I actually explained wrong, what I want to have. I need the binary variable x to equal 1, when the variable m equals zero.
So basically the opposite of the problem I stated before. Is there any good way to do it?
Unfortunately with your solution of the problem I can't think of a similar solution for this topic.

Cheers

### Re: logical equations & binary variables

Posted: Sat Mar 17, 2018 1:01 pm
Hi, It's similar

eq1.. m =g= m.lo*(1-x);
eq2.. m =l= m.up*(1-x)

Bye!

### Re: logical equations & binary variables

Posted: Sat Mar 17, 2018 1:33 pm
I could have got to this myself. I apologize for not thinking enough, before asking the question.

### Re: logical equations & binary variables

Posted: Sat Mar 17, 2018 3:53 pm
Hi guys,

I got another problem, that's based in this here.

So coming back to my model, I still want to set the binary variable nrc to 1, when the mass flows m_rc_ts and m_rc_pb both equal to zero.
That's why I implemented the following equations:

e_nrc_lo(i+1) .. m_rc_ts(i+1)+m_rc_pb(i+1) =g= (1-nrc(i+1));
e_nrc_up(i+1) .. m_rc_ts(i+1)+m_rc_pb(i+1) =l= m_rcmax*(1-nrc(i+1));

So if I get this right mathemetically, if the mass fows equal to zero, it should look like this:

0 + 0 >= 1 - nrc
0 + 0 <= 282 * (1-nrc)

nrc >= 1 and nrc <= 1, which leads to the only solution nrc = 1.

I implemented the variable, so these are the only equations were it is in. The inital value is 1.

If I run it now, I get the following from the equation list:

Code: Select all

``````e_nrc_lo(1)..  m_rc_ts(1) + m_rc_pb(1) + nrc(1) =G= 1 ; (LHS = 1)

e_nrc_lo(2)..  m_rc_ts(2) + m_rc_pb(2) + nrc(2) =G= 1 ; (LHS = 0
, INFES = 1 ****)

e_nrc_lo(3)..  m_rc_ts(3) + m_rc_pb(3) + nrc(3) =G= 1 ; (LHS = 0
, INFES = 1 ****)

e_nrc_up(1)..  m_rc_ts(1) + m_rc_pb(1) + 282*nrc(1) =L= 282 ; (LHS = 282)

e_nrc_up(2)..  m_rc_ts(2) + m_rc_pb(2) + 282*nrc(2) =L= 282 ; (LHS = 0)

e_nrc_up(3)..  m_rc_ts(3) + m_rc_pb(3) + 282*nrc(3) =L= 282 ; (LHS = 0)

*The column list gives the following:

nrc(1)
(.LO, .L, .UP, .M = 0, 1, 1, 0)
1       e_nrc_lo(1)
282       e_nrc_up(1)

nrc(2)
(.LO, .L, .UP, .M = 0, 0, 1, 0)
1       e_nrc_lo(2)
282       e_nrc_up(2)

nrc(3)
(.LO, .L, .UP, .M = 0, 0, 1, 0)
1       e_nrc_lo(3)
282       e_nrc_up(3)

m_rc_ts(1)
(.LO, .L, .UP, .M = 0, 0, 282, 0)
1       e_nrc_lo(1)
1       e_nrc_up(1)
(0)      e_nts(1)
1       e_m_rc_same(1)
1       e_ts_rc_same(1)
(0)      e_charge(1)
-5.8864  e_Re(1)
-0.0001  e_U(1)
(-12.5642) e_h(1)

m_rc_ts(2)
(.LO, .L, .UP, .M = 0, 0, 282, 0)
1       e_nrc_lo(2)
1       e_nrc_up(2)
(0)      e_nts(2)
1       e_m_rc_same(2)
1       e_ts_rc_same(2)
(0)      e_charge(2)
-5.8864  e_Re(2)
-0.0001  e_U(2)

m_rc_ts(3)
(.LO, .L, .UP, .M = 0, 0, 282, 0)
1       e_nrc_lo(3)
1       e_nrc_up(3)
(0)      e_nts(3)
1       e_m_rc_same(3)
1       e_ts_rc_same(3)
(0)      e_charge(3)
-5.8864  e_Re(3)
-0.0001  e_U(3)

m_rc_pb(1)
(.LO, .L, .UP, .M = 0, 0, 112, 0)
1       e_nrc_lo(1)
1       e_nrc_up(1)
1       e_m_pbmax(1)
(-838)      e_T_pi(1)
1       e_m_pb_same(1)
(0)      e_T_po(1)
(0)      e_P_out(1)
1       e_m_rc_same(1)

m_rc_pb(2)
(.LO, .L, .UP, .M = 0, 0, 112, 0)
1       e_nrc_lo(2)
1       e_nrc_up(2)
1       e_m_pbmax(2)
(-839)      e_T_pi(2)
1       e_m_pb_same(2)
(-0.0597) e_T_po(2)
(30340)      e_P_out(2)
1       e_m_rc_same(2)

m_rc_pb(3)
(.LO, .L, .UP, .M = 0, 0, 112, 0)
1       e_nrc_lo(3)
1       e_nrc_up(3)
1       e_m_pbmax(3)
(-839)      e_T_pi(3)
1       e_m_pb_same(3)
(-0.0597) e_T_po(3)
(30340)      e_P_out(3)
1       e_m_rc_same(3)``````
I don't know why, the equation e_nrc_lo does not set the binary variable nrc to 1, but just says, that the equation is infeasable. I mean the whole purpose of the equation is to set the variable to 1. Is there something obvious, which I can't see? Or is it maybe more complicated?

Cheers,
Max

### Re: logical equations & binary variables

Posted: Mon Mar 19, 2018 12:39 pm
Hi, the equation listing and column Listing shows the value on the initial point, not in the solution. The equations are fine.
You should review the SolEQU and SolVAR section.
Bye!

### Re: logical equations & binary variables

Posted: Tue Mar 20, 2018 9:16 am
Hi Manassaldi,

thanks again for your answer. I see, that I missunderstood the columen and the equation listing.
However I wanted to set the binary variable nrc to prevent the division by zero.

e_T_ri(i+1) .. T_ri(i+1) =e= (m_ts_rc(i+1)*T_to(i+1) + m_pb_rc(i+1)*T_po(i+1)) / (m_ts_rc(i+1) + m_pb_rc(i+1) + nrc(i+1)) + nrc(i+1)*T_ri(i);

The binary variable should set the value to one when the mass flows m_ts_rc and m_pb_rc are zero, so that a division by zero is prevented. Because of this, I can't review the solequ and solvar yet, because the model gets an execution error. Is there anyway to prevent this correctly? Or do I just have to add small numbers into the denominator to prevent the division by zero?