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;
If Statement - Uncontrolled Set entered as a costant
-
- User
- Posts: 108
- Joined: 7 years ago
Re: If Statement - Uncontrolled Set entered as a costant
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
cg.fx(t)=47.898;
cg.fx(t)$(pk(t)=1)=36.367;
Best
Claudio
Re: If Statement - Uncontrolled Set entered as a costant
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:
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"
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":
-Michael
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;
);
Code: Select all
cg.fx(t) = 47.898$(pk(t)<>1) + 36.367$(pk(t)=1);
Code: Select all
cg.fx(t) = 47.898$(abs(1-pk(t))>=1e-6) + 36.367$(abs(1-pk(t))<1e-6);
Re: If Statement - Uncontrolled Set entered as a costant
Thanks both Michael and Claudio for both your suggestion and your answers!
I'll try them immediately!
Cheers
I'll try them immediately!
Cheers