## logical equations & binary variables

Problems with syntax of GAMS
M.Walde
User Posts: 16
Joined: 1 year ago

### logical equations & binary variables

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.

Thanks again for your help.

Cheers
Max

msci
User Posts: 2
Joined: 1 year ago

### Re: logical equations & binary variables

Just include the following constraint:

m-Mx <=0

where M is an upper bound for m.

Manassaldi
User Posts: 83
Joined: 2 years ago
Location: Rosario - Argentina

### Re: logical equations & binary variables

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!

M.Walde
User Posts: 16
Joined: 1 year ago

### Re: logical equations & binary variables

Thanks for your fast reply again, Manassaldi.
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

Manassaldi
User Posts: 83
Joined: 2 years ago
Location: Rosario - Argentina

### Re: logical equations & binary variables

Hi, It's similar

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

Bye!

M.Walde
User Posts: 16
Joined: 1 year ago

### Re: logical equations & binary variables

Thanks a lot for your fast reply.
I could have got to this myself. I apologize for not thinking enough, before asking the question.

M.Walde
User Posts: 16
Joined: 1 year ago

### Re: logical equations & binary variables

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?

Thanks in advance, guys!

Cheers,
Max

Manassaldi
User Posts: 83
Joined: 2 years ago
Location: Rosario - Argentina

### Re: logical equations & binary variables

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!

M.Walde
User Posts: 16
Joined: 1 year ago

### Re: logical equations & binary variables

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?

Cheers

Manassaldi
User Posts: 83
Joined: 2 years ago
Location: Rosario - Argentina

### Re: logical equations & binary variables

Hi, In another post I suggested this equation

e_T_pi(i+1) .. T_pi(i+1)*(m_rc_pb(i+1)+m_ts_pb(i+1)) =e= (m_rc_pb(i+1)*T_ro + m_ts_pb(i+1)*T_to(i+1));