Monday, July 29, 2013

Microeconomic Principles

Another model illustrating tables 3.3 and 3.4 from “Complementarity Modeling in Energy Markets”.

$ontext

  
Example from chapter 3: "Some Microeconomic Principles"

  
Reference:
     
Steven A. Gabriel, Antonio J. Conejo, J. David Fuller,
     
Benjamin F. Hobbs, Carlos Ruiz
     
Complementarity Modeling in Energy Markets
     
Springer 2012

$offtext


SETS
 i 
'firms' /i1,i2,i3/
 b 
'production process (mines)' /b1,b2/
;

TABLE c(i,b) 'variable cost'
      
b1    b2
 
i1  0.55  0.81
 
i2  0.62  1.25
 
i3  0.78  1.35
;

TABLE K(i,b) 'process capacities'
      
b1     b2
 
i1  21000  16000
 
i2  17000  22000
 
i3  18000  14000
;

parameters
   alpha
'inverse demand intercept'  / 2.5 /
   beta 
'inverse demand slope'      / 0.000016666666667 /
;


*-------------------------------------------------------------------------------
* Reporting macro
*-------------------------------------------------------------------------------

parameters Revenue(i), VarCost(i), ProdSurp, TotProdSurp, SocWel;
parameters
Price, ConsPay, ConsSurp, TotProdSurp;

Parameter
PResults(*,*,*,*);
option
PResults:3:2:2;
Parameter
CResults(*,*);
option
CResults:3:1:1;


$macro report(name)  \
  Price = alpha-beta*q.l;                                           \
  ConsPay = Price*q.l;                                              \
  ConsSurp = alpha*q.l -0.5*beta*q.l**2 - Price*q.l;                \
  Revenue(i) = Price*
sum
(b, x.l(i,b));                              \
  VarCost(i)=
sum
(b, C(i,b)*x.l(i,b));                              \
  ProdSurp(i) = Revenue(i)-VarCost(i);                              \
  TotProdSurp =
sum
(i, ProdSurp(i));                                \
  SocWel = ConsSurp + TotProdSurp;                                  \
 
display
x.l, Revenue, VarCost, ProdSurp;                          \
 
display
q.l, Price, ConsPay, ConsSurp, TotprodSurp, SocWel;       \
                                                                    \
  Presults(name,
'x'
,i,b) = x.l(i,b);                                \
  Presults(name,
'revenue',i,'b1'
) = Revenue(i);                     \
  Presults(name,
'var.cost',i,'b1'
) = VarCost(i);                    \
  Presults(name,
'surplus',i,'b1'
) = ProdSurp(i);                    \
 
display
PResults;                                                 \
                                                                    \
  Cresults(name,
'q'
) = q.l;                                         \
  Cresults(name,
'p'
) = Price;                                       \
  Cresults(name,
'ConsPay'
) = ConsPay;                               \
  Cresults(name,
'ConsSurpl'
) = ConsSurp;                            \
  Cresults(name,
'ProdSurpl'
) = TotProdSurp;                         \
  Cresults(name,
'SocWelfare'
) = SocWel;                             \
 
display
CResults;                                                 \


*-------------------------------------------------------------------------------

* Maximize Social Welfare
* NLP Model
*-------------------------------------------------------------------------------

POSITIVE VARIABLES
    x(i,b)
'production by i from process b'
    q     
'demand quantity'
;
VARIABLES
    W     
'social welfare'
;

EQUATIONS
   SocialWelDef  
'social welfare definition'
   Capacity(i,b) 
'upper limit of generating output'
   MarketClear   
'market clearing'
;

SocialWelDef..   W =e= alpha*q-0.5*beta*q**2 -
sum((i,b), C(i,b)*x(i,b));
Capacity(i,b)..  x(i,b) =l= K(i,b);
MarketClear..    q =e=
sum
((i,b), x(i,b));

MODEL SocWelMax /SocialWelDef,Capacity,MarketClear/
;
SOLVE
SocWelMax maximizing W using nlp;

report(
'PriceTakers(NLP)'
)


*-------------------------------------------------------------------------------

* Maximize Social Welfare
* MCP Model
*-------------------------------------------------------------------------------

POSITIVE VARIABLES
    gamma(i,b) 
'dual of capacity constraint'
;
FREE VARIABLES
    lambda     
'price'
;

EQUATIONS
   PriceDef       
'price definition as inverse demand'
   Mx(i,b)        
'KKT condition for derivative w.r.t. x'
   Capacity2(i,b) 
'=g= version of capacity constraint'
;

PriceDef..        lambda - (alpha-beta*q) =g= 0;
MX(i,b)..         C(i,b) - lambda + gamma(i,b) =g= 0;
Capacity2(i,b)..  - x(i,b) + K(i,b) =g= 0;


MODEL CompetComplem /PriceDef.q, Mx.x, Capacity2.gamma, MarketClear.lambda/;
solve
CompetComplem using MCP;

report(
'PriceTakers(MCP)'
)


*-------------------------------------------------------------------------------

* Monopoly
* NLP Model
*-------------------------------------------------------------------------------

VARIABLES
    TotProfit    
'total profit'
;

EQUATIONS
   TotalProfit   
'Total profit calculation'
;

TotalProfit..    TotProfit =e= (alpha-beta*q)*q -
sum((i,b), C(i,b)*x(i,b));

MODEL Monopoly /TotalProfit,Capacity,MarketClear/
;
SOLVE
Monopoly maximizing TotProfit using nlp;

report(
'Monopoly'
)

*-------------------------------------------------------------------------------

* Oligopoly (Nash-Cournot)
* MCP Model
*-------------------------------------------------------------------------------

alias (b,bb);

EQUATIONS

   Mx2(i,b)       
'KKT condition for derivative w.r.t. x'
;

MX2(i,b)..         C(i,b) - lambda + beta*
sum(bb,x(i,bb)) + gamma(i,b) =g= 0;

MODEL Oligopoly /PriceDef.q, Mx2.x, Capacity2.gamma, MarketClear.lambda/
;
solve
Oligopoly using MCP;

report(
'Cournot(MCP)'
)

*-------------------------------------------------------------------------------

* Oligopoly (Nash-Cournot)
* NLP Model
*-------------------------------------------------------------------------------

VARIABLES
    CournotObj     
'Obj for Cournot model as NLP'
;

EQUATIONS
   DefCournotObj   
'Obj for Cournot model as NLP'
;

DefCournotObj..    CournotObj =e= alpha*q-0.5*beta*q**2 -
sum((i,b), C(i,b)*x(i,b))
                                  - 0.5*
sum(i, beta*sqr(sum
(b,x(i,b))));

MODEL CournotNLP /DefCournotObj,Capacity,MarketClear/
;
SOLVE
CournotNLP maximizing CournotObj using nlp;

report(
'Cournot(NLP)'
)

*-------------------------------------------------------------------------------

* Cournot (firm1) + Price Takers (firm2+3)
* NLP Model
*-------------------------------------------------------------------------------


set
  iCournot(i)
/i1/
;

VARIABLES
   Obj            
'Obj for Cournot/Pricetaking model as NLP'
;

EQUATIONS
   DefObj         
'Obj for Cournot/Pricetaking model as NLP'
;

DefObj..    Obj =e= alpha*q-0.5*beta*q**2 -
sum((i,b), C(i,b)*x(i,b))
                                  - 0.5*
sum(iCournot,beta*sqr(sum
(b,x(iCournot,b))));

MODEL CombNLP /DefObj,Capacity,MarketClear/
;
SOLVE
CombNLP maximizing Obj using nlp;

report(
'CombA(NLP)'
)

*-------------------------------------------------------------------------------

* Cournot (firm1+firm2) + Price Takers (firm3)
* NLP Model
*-------------------------------------------------------------------------------

iCournot(
'i2') = yes;

SOLVE
CombNLP maximizing Obj using nlp;

report(
'CombB(NLP)'
)

*-------------------------------------------------------------------------------

* Cournot (firm1) + Price Takers (firm2+3)
* MCP Model
*-------------------------------------------------------------------------------

iCournot(i) =
no;
iCournot(
'i1') = yes
;

equation

   MXComb(i,b)
'First order condition';

MXComb(i,b)..     C(i,b) - lambda + (beta*
sum
(bb,x(i,bb)))$Icournot(i) + gamma(i,b) =g= 0;


MODEL Comb1MCP /PriceDef.q, MxComb.x, Capacity2.gamma, MarketClear.lambda/
;   ;
SOLVE
Comb1MCP using mcp;


report(
'CombA(MCP)'
)

*-------------------------------------------------------------------------------

* Cournot (firm1+firm2) + Price Takers (firm3)
* MCP Model
*-------------------------------------------------------------------------------

iCournot(
'i2') = yes;

SOLVE
Comb1MCP using mcp;

report(
'CombB(MCP)'
)

The interesting aspect here is that we model here a market with different combinations of players: some are price takers (perfect competition) and some follow a Nash-Cournot oligopolistic behavior. Actually in some energy market models (not discussed in the book) we have coefficient (parameter) δ indicating “Market Power” where δ=0 means perfect competitive behavior and δ=1 means Cournot behavior. The values 0<δ<1 indicate some behavior in between.