pindyck.gms : Optimal Pricing and Extraction for OPEC

Description

This model finds the optimal pricing and extraction of oil for
the OPEC cartel.


Reference

  • Pindyck, R S, Gains to Producers from the Cartelization of Exhaustible Resources. The Review of Economics and Statistics 60, 2 (1978), 238-251.

Small Model of Type : NLP


Category : GAMS Model library


Main file : pindyck.gms

$title Optimal Pricing and Extraction for OPEC (PINDYCK,SEQ=28)

$onText
This model finds the optimal pricing and extraction of oil for
the OPEC cartel.


Pindyck, R S, Gains to Producers from the Cartelization of
Exhaustible Resources. Review of Economics and Statistics 60
(1978), 238-251.

Keywords: nonlinear programming, oil extraction, price setting
$offText

Set
   t       'overall time horizon'  / 1974*1990 /
   to(t)   'optimization period'   / 1975*1990 /;

Parameter demand(t) 'equilibrium world demand for fixed prices';
demand(to) = 1. + 2.3*1.015**(ord(to)-1);

Variable
   p(t)    'world price of oil'
   td(t)   'total demand for oil'
   s(t)    'supply of oil by non-opec countries'
   cs(t)   'cumulative supply by non-opec countries'
   d(t)    'demand for opec-oil'
   r(t)    'opec reserves'
   rev(t)  'revenues in each period'
   profit;

Positive Variable  p, td, s, cs, d, r;

Equation
   tdeq(t) 'total demand equation'
   seq(t)  'supply equation for non-opec countries'
   cseq(t) 'accounting equation for cumulative supply'
   deq(t)  'demand equation for opec'
   req(t)  'accounting equation for opec reserves'
   drev(t) 'yearly objective function value'
   tprofit 'total objective function';

tdeq(t-1)..   td(t)   =e= 0.87*td(t-1) - 0.13*p(t) + demand(t);

seq(t-1)..    s(t)    =e= 0.75*s(t-1) + (1.1+0.1*p(t))*1.02**(-cs(t)/7);

cseq(t-1)..   cs(t)   =e= cs(t-1) + s(t);

deq(to)..     d(to)   =e= td(to) - s(to);

req(t-1)..    r(t)    =e= r(t-1) - d(t);

drev(to)..    rev(to) =e= d(to)*(p(to)-250/r(to));

tprofit..     profit  =e= sum(to,rev(to)*1.05**(1-ord(to)));

*  fixed initial conditions
td.fx("1974") =  18;
s.fx ("1974") = 6.5;
r.fx ("1974") = 500;
cs.fx("1974") = 0.0;

td.l(to) = 18;
s.l(to)  = 7;
cs.l(to) = 7*ord(to);
d.l (to) = td.l(to)-s.l(to);
p.l(to)  = 14;

loop(t$to(t), r.l(t) = r.l(t-1)-d.l(t));

display td.l, s.l, cs.l, d.l, r.l;

Model robert / all /;

solve robert maximizing profit using nlp;