scarfexpend.gms : Scarf's Activity Analysis Example

Description

Scarf's Activity Analysis Example

Scarf, H, and Hansen, T, The Computation of Economic Equilibria.
Yale University Press, 1973.

Rather than form the MCP explicitly (as in the GAMSLIB model scarfmcp),
we instead
   max_p  sum (h, i(h) * log(expend_h(p))) - p'*sum(h, endow(.,h))
   s.t    A'p <= 0, p >= 0

Here expend_h is the expenditure function defined by:
   expend_h(p)  = min_x  p'*x   s.t.  u_h(x) >= 1, x >= 0
(or equivalently:
   expend_h(p)  = min_x  p'*x   s.t.  log(u_h(x)) >= 0, x >=0
)

The EMPLIB model uses a closed form of the expenditure function.  In
this model we use the definition of the expenditure model in terms of
the utility function to generate the MCP model using an NLP with KKT
conditions in it.

ie replace the expenditure function by its KKT conditions (utillev, dedp)
in the defn of the max_p problem above.

Contributor: Michael Ferris, October 2010


Small Model of Type : EQUIL


Category : GAMS EMP library


Main file : scarfexpend.gms

$title  Scarf's Activity Analysis Example (SCARFEXPEND,SEQ=55)

$onText

Scarf's Activity Analysis Example

Scarf, H, and Hansen, T, The Computation of Economic Equilibria.
Yale University Press, 1973.

Rather than form the MCP explicitly (as in the GAMSLIB model scarfmcp),
we instead
   max_p  sum (h, i(h) * log(expend_h(p))) - p'*sum(h, endow(.,h))
   s.t    A'p <= 0, p >= 0

Here expend_h is the expenditure function defined by:
   expend_h(p)  = min_x  p'*x   s.t.  u_h(x) >= 1, x >= 0
(or equivalently:
   expend_h(p)  = min_x  p'*x   s.t.  log(u_h(x)) >= 0, x >=0
)

The EMPLIB model uses a closed form of the expenditure function.  In
this model we use the definition of the expenditure model in terms of
the utility function to generate the MCP model using an NLP with KKT
conditions in it.

ie replace the expenditure function by its KKT conditions (utillev, dedp)
in the defn of the max_p problem above.

Contributor: Michael Ferris, October 2010
$offText

$call gamslib -q scarfmcp
$include scarfdata.inc

option limrow = 0, limcol = 0;

positive
variables

        p(c)    commodity price,
        i(h)    income;

equations
        profit(s)       zero profit,
        income(h)       income index;

*       distinguish ces and cobb-douglas demand functions:

profit(s)..     sum(c, a(c,s) * p(c)) =l= 0;

income(h)..     i(h) =g= sum(c, p(c) * e(c,h));

positive variables x(c,h) Marshallian demand;
positive variables utilmul(h) utility multiplier;
equations utillev(h), dedp(c,h);

utillev(h)..
  ((1/rho(h))*log(sum(c$alpha(c,h), lambda(c,h)*x(c,h)**rho(h))))$(esub(h) ne 1)
  + sum(c$alpha(c,h), alpha(c,h)*log(x(c,h)))$(esub(h) eq 1)
  =e= 0;

dedp(c,h)$alpha(c,h)..
  (p(c) - utilmul(h)*lambda(c,h)*x(c,h)**(rho(h)-1))$(esub(h) ne 1)
  + (p(c) - utilmul(h)*alpha(c,h)/x(c,h))$(esub(h) eq 1) =e= 0;

variables z;
equations objdef;

* following works for Cobb Douglas functions (esub(h) = 1)

objdef..
  z =e=
  sum(h, i(h)*log(sum(c$alpha(c,h), p(c)*x(c,h))))
  - sum(c, sum(h, e(c,h))*p(c));

model scarf /objdef, profit, income, dedp, utillev /;

* Set initial values
p.l(c) = 1;
i.l(h) = sum(c, p.l(c) * e(c,h));
p.lo(c)  = 0.00001$(smax(h, alpha(c,h)));

*       fix the price of numeraire commodity:
i.fx(h)$(ord(h) eq 1) = i.l(h);

* For Cobb Douglas
* esub(h) = 1;

x.l(c,h) = 0.1;
x.lo(c,h) = 0.00001$alpha(c,h);
x.fx(c,h)$(not alpha(c,h)) = 0;
utilmul.l(h) = smax(c$alpha(c,h), p.l(c)*x.l(c,h)/alpha(c,h))$(esub(h) eq 1)
 + smax(c$alpha(c,h), p.l(c)/(lambda(c,h)*x.l(c,h)**(rho(h)-1)))$(esub(h) ne 1);

file myinfo / '%emp.info%' /;
put myinfo 'equilibrium';
put      / 'vi income i';
putclose / 'max z p utilmul x objdef profit utillev dedp';

solve scarf using emp;
parameter y(s) production;
y(s) = profit.m(s);
display y;