If Statement - Uncontrolled Set entered as a costant

Problems with syntax of GAMS
Post Reply
gigibotte
User
User
Posts: 4
Joined: 6 years ago

If Statement - Uncontrolled Set entered as a costant

Post by gigibotte »

Hi all!

I'm currently working on a model that use an excel file, with binary inputs for 8760 hours (1 year.) The file is structured so that in the interested column you have either a 1 or a 0. GAMS is reading correctly the file but the problem occurs later.

Practically I need to code this statement "if x(t)=1 then g(t)=A, else g(t)=B "

the why I used in GAMS is the following ( I wrote it just after the Equations description) :
if (pk(t)=e= 1,
cg(t)=36.367;
else
cg(t)=47.898;
);

However I got an error saying that an uncontrolled set is entered as a costant. (actually I got various errors but this is the first that appears and otehr mistakes are only related to this one because before using this statement everything was working).

Any Idea How?

The Full Code is:
*** SETS DEFINITION ***
***********************

Sets

*** PLANTS DEFINITION
i units /chp,pv,sto,grid/

CHP(i) /chp/
Grid(i) /grid/
Storage(i) /sto/
Power(i) /chp,grid/

*** TIME PERIODS
t time /t0001*t8760/

;

$call=xls2gms r=a1:b8760 i=PV.xls o=PV.inc

$call=xls2gms r=a1:b8760 i=PD.xls o=PD.inc

$call=xls2gms r=a1:b8760 i=HD.xls o=HD.inc

$call=xls2gms r=a1:b8760 i=Peak.xls o=Peak.inc

*** PARAMETERS DEFINITION ***
*****************************

Parameters

*** Costs Parameters

a(i) Power Production Costs [Euro\MWh] /chp 25.028/
c(i) Start-up Costs [Euro] /chp 400/

*** Production Parameters

pmin(i) Minimum Power Production [MW] /chp 0.9588, grid 0/
pmax(i) Maximum Power Production [MW] /chp 4.794/
lmin(i) Minimum Level of Storage [MWh] /sto 0/
lmax(i) Maximum Level of Storage [MWh] /sto 350/

*** Other Parameters

delta(i) Heat-To-Power ratio /chp 3.979/
***CHECK THESE VALUES
char_eff(i) Charging Efficiency of the Storage /sto 0.96/
dis_eff(i) Discharging Efficiency of the Storage /sto 0.98/

****
st_eff(i) Storage Efficciency /sto 0.9566/

;
Scalar

f_up Ramp Up Rate /1/
f_down Ramp Down Rate /0.6/
;

Parameter
*** Solar Production ***
s(t) solar production [MWh]
/

$include PV.inc

/
;
*** Demand Parameters

Parameter pd(t) power demand (MWh)
/

$include PD.inc

/
;

Parameter hd(t) heat demand (MWh)
/

$include HD.inc

/
;

Parameter pk(t) Peak Variable [-]
/
$include peak.inc
/
;


*** VARIABLES DEFINITION ***
****************************

Free Variables

*** Objective Function Variable

z Total costs [Euro]
cg(t) Power Cost from Grid [Euro\MWh]
;

Positive Variables

*** Generation Variables

p(i,t) Power Generation Level [MWh]
q(i,t) Heat Generation Level [MWh]
q_ch(i,t) Storage Charging Level [MWh]
q_dis(i,t) Storage Discharging Level [MWh]
l(i,t) Storage Level [MWh]


***Start Up Variable

v(i,t) Start-Up [-]
x(i,t) Shut-Down [-]
;
Binary Variable

*** Online Status Variable

u(i,t) Online Status [-]
;

*** EQUATIONS DEFINITION ***
****************************
Equations

Costs Total Costs
MinGenPow(i,t) Minimum Power Generation Level When Online [MW]
MaxGenPow(i,t) Maximum Power Generation Level When Online [MW]
HeatToPow(i,t) Heat To Power Ratio
*MaxGenHeat(i,t) Maximum Heat Generation Level When Online [MW]
StartUp(i,t) Start-Up Status
ShutDown(i,t) Shut Down Status
RampUp(i,t) Ramp-Up Status
RampDown(i,t) Ramp-Down Status
BalancePow(t) Balance Power Demand
BalanceHeat(t) Balance Heat Demand
StorageLevel(i,t) Balance of Storage Level
MinStorageLevel(i,t) Minimum Level of the Storage
MaxStorageLevel(i,t) Maximum Level of the Storage

;
if (pk(t)=e= 1,
cg(t)=36.367;
else
cg(t)=47.898;
);
*** Total Cost Equation, Objective Function

Costs .. z =e= sum(t,sum(i$(CHP(i)),a(i)*p(i,t)+c(i)*(v(i,t)+x(i,t)))
+ sum(i$(Grid(i)),cg*p(i,t));

*** Power Generation Level Equations h +10000000*(dslackplus(t)+dslackminus(t))

MinGenPow(i,t)$Power(i) .. p(i,t) =g= pmin(i)*u(i,t);
MaxGenPow(i,t)$CHP(i) .. p(i,t) =l= pmax(i)*u(i,t);

*** Heat Generation Level Equations

HeatToPow(i,t)$(CHP(i)) .. q(i,t) =e= delta(i)*p(i,t);


*** Start-Up and Ramp-Up Equations

StartUp(i,t)$(CHP(i)) .. u(i,t)-u(i,t--1) =l= v(i,t);
ShutDown(i,t)$(CHP(i)) .. u(i,t)-u(i,t--1) =g= x(i,t);
RampUp(i,t)$(CHP(i)) .. p(i,t)-p(i,t--1) =l= f_up*pmax(i);
RampDown(i,t)$(CHP(i)) .. p(i,t--1)-p(i,t) =l= f_down*pmax(i);

*** Demand Equations

BalancePow(t) .. sum(i$(Power(i)),p(i,t)) =e= pd(t)-s(t);
BalanceHeat(t) .. q('chp',t)+q_dis('sto',t)-q_ch('sto',t) =e= hd(t);

*** Storage Equations

StorageLevel(i,t)$(Storage(i)).. l(i,t) =e= st_eff(i)*l(i,t--1)+q_ch(i,t)*char_eff(i)-q_dis(i,t)/dis_eff(i);
MinStorageLevel(i,t)$(Storage(i)).. l(i,t) =g= lmin(i);
MaxStorageLevel(i,t)$(Storage(i)).. l(i,t) =l= lmax(i);

************************
*** END OF THE MODEL ***
************************

***********************
*** SOLVE THE MODEL ***
***********************

Model uc /all/;
Solve uc using rmip minimizing z;
Display z.l, u.l, p.l, q.l,l.l,HD,PD,s, q_ch.l, q_dis.l;
cladelpino
User
User
Posts: 108
Joined: 7 years ago

Re: If Statement - Uncontrolled Set entered as a costant

Post by cladelpino »

Hi, I understand that you want to fix the value of variable cg depending on the value of parameter pk. This code is one of the ways to accomplish this:

cg.fx(t)=47.898;
cg.fx(t)$(pk(t)=1)=36.367;

Best
Claudio
User avatar
bussieck
Moderator
Moderator
Posts: 1033
Joined: 7 years ago

Re: If Statement - Uncontrolled Set entered as a costant

Post by bussieck »

Hi,

First a few ways how to improve better readability of your posts which will improve the chance that someone looks at your question:

1) I suggest that you try to boil down your issues in a small but complete example (one that one can compile and potentially execute) rather than pasting your entire code.
2) If you think you need to include the entire code, use the attachments to do so and don't paste in the message.
3) If you attach complex code make sure it can be compiled and executed to a point that relates to your question (you did not supply various spreadsheets).

Now to your question:

Code: Select all

if (pk(t)=e= 1,
cg(t)=36.367;
else
cg(t)=47.898;
);
This is no proper GAMS code. I guess, you want to fix the variable cg(t) to a particular value based on the value of a parameter pk(t) being 1 or not. You can just use a statements to fix the cg variables as follows"

Code: Select all

cg.fx(t) = 47.898$(pk(t)<>1) + 36.367$(pk(t)=1);
If pk is read in and the value is precisely 1 this code is okay, but if pk is calculated be careful with precise comparisons (=), it is better to check "close to":

Code: Select all

cg.fx(t) = 47.898$(abs(1-pk(t))>=1e-6) + 36.367$(abs(1-pk(t))<1e-6);
-Michael
gigibotte
User
User
Posts: 4
Joined: 6 years ago

Re: If Statement - Uncontrolled Set entered as a costant

Post by gigibotte »

Thanks both Michael and Claudio for both your suggestion and your answers!

I'll try them immediately!

Cheers :D :D
Post Reply