The Ramsey Model of Economic Growth

Mathematica's extensive numerical and graphical capabilities are used to create a working version of the the standard model for analyzing questions in macro-economics.

by Alexander Tabarrok

The Ramsey model of economic growth is a workhorse of contemporary macro-economics.  It's the starting point not only for growth theory but also for modern business cycle theory.  Ask an economist how the economy will react to an increase in government purchases or to a change in the tax rate on capital and the first model he or she will reach for in a search for answers is the Ramsey model.  In this paper I briefly explain the Ramsey model and put the model through its paces using Mathematica's extensive numerical and graphical abilities.  
	The model requires that we solve two paired differential equations with a boundary condition.  The solution methods used, the shooting and time elimination method, are of wide applicability and may be of interest to researchers in fields other than economics. 
	Since the Ramsey model is well known I will focus on how Mathematica can be used to solve the model.  Introductions to the Ramsey model can be found in the texts of Romer (1996), Barro and Sala-i-Martin (1995), and Blanchard and Fischer (1989) and of course the original articles by Ramsey (1928), Cass (1965), and Koopmans (1965).  My notation will follow that of Romer's most closely.

We assume that there are a large number of identical firms.  Each firm uses capital, K, and labor, L to produce output Y, according to the production function Y=F[K,A×L].  The parameter A measures the state of "technology."  Technology allows L workers to produce as if there were actually A×L workers.  We will assume that A grows exogenously at the rate g, and simply designate the parametrized labor variable by AL.  
	Profit-maximizing firms hire capital and labor in competitive markets which they use to produce output.  The price of output is normalized to 1 which implies that  a firm's profit function can be written as below where w is the wage rate of effective labor, r is the interest rate and δ the depreciation rate on capital.  To be competitive with other assets capital must pay its owners a return of r+δ which is therefore the rental rate or interest rate on capital.

Off[General::spell]

profit = F[K, AL] -  w AL  -  (r + δ) K

To maximize profit the firm hires capital and labor until the first derivatives of the profit function with respect to capital and labor respectively are zero.

D[profit, K] == 0

D[profit, AL] == 0

We will also assume that the production function F is linearly homogeneous or in economic terms that it exhibits constant returns to scale (CRS).The CRS assumption means that if inputs increase by a factor of c, output will also increase by a factor of c, F[cK, cAL] =  cF[K, AL].  A theorem by Euler says that if F[K,AL] is linearly homogeneous, then Y = (Subscript[F, K]) K + (Subscript[F, AL]) AL.  Using the above first-order conditions, Euler's theorem implies that factor payments exhaust the product, Y = (r + δ ) K + w AL.  Setting c = 1/AL allows us to write the production function in terms of one variable, capital per unit of effective labor k = K/AL.  Thus, output per unit of effective labor can be written Y/AL = y = f[k].  Rewriting the first-order condition for capital we have
1)  r + δ = f'[k]
and using (1) and Euler's theorem
2) w = f[k] - kf'[k].

Household behavior is more complicated.  There are a large number, H, of identical households.  Each member of the household supplies 1 unit of labor at every point in time.  Households own the capital stock, which they rent to firms.  Each household begins with capital holdings of K[0]/H where K[t] is the amount of capital at time t.  At each moment in time the household chooses how to divide its income - from wages and the renting of capital - between consumption and savings in order to maximize lifetime utility.  The household's lifetime utility is written;

U=(∫_0^∞) (e^(-ρt)) u(
            C[t]) L[t]/H dt

where C[t] is the consumption of each household member at time t. u[C[t]] is the instantaneous utility created by the consumption of C[t] at time t.  L[t] is the total population of the economy and L[t]/H the number of members of the household at time t.  ρ > 0 is the household's discount rate (assumed the same for all households).  The higher is ρ the more the household discounts future consumption relative to current consumption.  It is common to assume that instantaneous utility is of the form \(TraditionalForm\`u(C[t]) = 
        C[t]\^\(1 - θ\)\/\(1 - θ\), \ 
      with\ θ > 0\ and\ ρ - n - \((1 - θ)\) g > 0\).  θ governs how willing individuals are to substitute consumption from one time period into another.  A lower θ implies a greater willingness to substitute consumption tomorrow for consumption today.   The condition ρ - n - (1 - θ) g > 0 is a technical condition needed to ensure that utility is bounded below infinity.  It's convenient to write the budget constraint in terms of consumption per unit of effective labor.  After some algebraic manipulations and taking into account the fact that L and A are growing we have (see Romer (1996) for the derivation).

U=\(TraditionalForm
      \`B \(∫\+0\%∞\( e\^\(-βt\)\) 
            c[t]\^\(1 - θ\)\/\(1 - θ\)\ dt\)\)

where B = A[0]^(1 - θ) 
          L[0]/H and β = ρ - 
          n - (1 - θ) g.

B is an unimportant constant and will be normalized to 1 in what follows.

The household faces two constraints when maximizing utility.

1)  k'[t]=r[t] k[t] + (e^((n + g) t))(w[t]-c[t])

2)  (Underscript[Lim, t⟶∞]) (e^(-R[t])) (e^((n + g) t)) k[t]≥0,

where R[t]=(∫_0^t)r[τ]dτ.

The first constraint is closer to an accounting identity than a constraint it that it says that the growth in the household's capital stock (per unit of effective labor) is equal to the interest earnings on the current capital stock plus the difference between the household's wages in period t and its consumption in period t (the exponential term adjusts for growth in effective labor).   Notice that 1) does not forbid the household from consuming more than its wages by borrowing (creating a negative capital stock).  It follows that the optimal solution to the household's problem is to borrow an infinite amount and live it up!  Since the latter strategy is unrealistic, we need constraint 2, which says that the household's capital stock (adjusted per unit of effective labor) cannot be negative in the limit.  In other words, the household must live within its means, if not on any given day then in the limit.

The household's problem has been set up as a standard problem in optimal control theory that can be solved using the method of Hamiltonians (see the references cited above or Kamien and Schwartz  (1981) for an introduction to optimal control theory).  Write the Hamiltonian as:

H=(E^(-β t))\(c[t]\^\(1 - θ\)\/\(1 - θ\)\)+λ[t](r[t] k[t]+ (E^((n + g) t))(w[t] - c[t]))

Optimal control theory tells us that the solution to our maximization problem must satisfy (Subscript[H, c]) = 0,  
      (Subscript[H, k]) = -∂((λ(t))/∂)t and the transversality condition (Subscript[Lim, t -> ∞])λ(t)k(t)->0.  (It can be shown that the transversality condition implies that the no infinite debt constraint of the household's problem will be satisfied in equilibrium, see Barro and Salai-i-Martin, 1995).

(Subscript[H, c]) = D[H, c[t]] == 0

(Subscript[H, k]) = D[H, k[t]] == -D[λ[t], t]

We now rearrange the first-order conditions to find a particularly convenient representation.  First solve (Subscript[H, c]) for λ(t) then differentiate with respect to t.

sol1 = Solve[(Subscript[H, c]), λ[t]]  // Simplify

sol2 = D[sol1, t]

Now divide sol2 by sol1 and simplify.

tmp = 
      sol2[[1, 1, 1]]/sol1[[1, 1, 1]] == 
          sol2[[1, 1, 2]]/sol1[[1, 1, 2]]  // Simplify

From the first-order condition for (Subscript[H, k ])we can make the substitution ((λ'(t))/(λ(t)))->-r[t]and from the definition of β we can make the substitution β->ρ-n-(1-θ)g.

tmp=tmp/.((λ'(t))/(λ(
                t)))->-r[t]

Solve[tmp, c'[t]]

% /. {β -> ρ - n - (1 - θ) g}  // Simplify

Rearranging we have:

tmp=c'[t]/c[t]==((( r(t) - ρ - g θ))/(θ ))

Using the fact that in equilibrium, r[t]==f'[k[t]]-δ we have:

tmp = tmp /. r[t] -> f'[k[t]] - δ

The dynamics of k are determined from the accounting identity that changes in the capital stock equal production minus consumption minus depreciation (with suitable adjustments for changes in the stock of effective labor).

k'[t] == f[k[t]] - c[t] - (n + g + δ) k[t]

The two key equations of the Ramsey model are thus:
		
	    1.  c'(t)=c(t)(((f'(k(t))-δ-ρ-g ϕ)/ϕ))   and 
		2.  k'(t)==f(k(t)) - c(t) - (g + n + δ) k(t)

Numerically Solving the Model

We now turn to numerically solving the model for steady states and transition paths.  To do so we specify that the production function is of the Cobb–Douglas form, f(k(t)) = ((k(t))^α).  Now define CPrime and KPrime as follows:

CPrime[α_, δ_, g_, ρ_, θ_] := 
      c[t] (α k[t]^(α - 1) - δ - ρ - 
              g θ)/θ

KPrime[α_, δ_, g_, n_] := 
      k[t]^α  - c[t] - (g + n + δ) k[t]

We initially set α=1/3, δ=.05, g=.02, n=0.01, ρ=.02, and  θ=1.75.  We now solve for the steady state, the levels of c and k such that c'[t]=k'[t]=0.

kbar1 = 
      k[t] /. Flatten @ 
          Solve[CPrime[1/3, 0.05, 0.02, 0.02, 1.75] == 0.0, k[t]]

cfunct = 
      c[t] /. Flatten @ 
          Solve[KPrime[1/3, 0.05, 0.02, 0.01] == 0.0, c[t]]

cbar1 = cfunct /. k[t] -> kbar1

p1 = 
        Plot[cfunct /. k[t] -> k,  {k,  0.01, 10}, 
          DisplayFunction -> Identity];

The next figure shows the steady state levels of capital and consumption.

SS = 
        Show[p1, Graphics @ { Line[{{kbar1, 0}, {kbar1, 1.7}}] } , 
          AxesLabel -> {"K Stock", "Consumption"}, 
          DisplayFunction -> $DisplayFunction];

Transition Dynamics

Suppose that we start off with a capital stock less than the steady state capital stock.  How does the economy evolve through time?  Mathematica's PlotVectorField in the Standard package Graphics`PlotField` plots a vector field.   An equivalent but prettier picture can be generated using Dan Schwalbe and Stan Wagon's VisualDSolve package (Schwalbe and Wagon 1997).  [See Endnote 1.]

<< "VisualDSolve`"

pPlot = 
        PhasePlot[{k'[t] == KPrime[1/3,  .05,  .02,  .01], c'[t] == 
              CPrime[1/3, 0.05,  .02,  .02, 1.75]}, {k[t], c[t]}, {k, 0.1, 
            40}, {c, 0.1, 1.8}, Nullclines -> True, FlowField -> True, 
          ShowEquilibria -> True, FieldLength -> 2, 
          FieldLogScale -> 1.5];

The "fish field" tells us both the direction and strength of the flow.  Notice that the flow is stronger the farther the system is from the k'[t]=0 or c'[t]=0 lines and in particular that the flow is slowest nearest the equilibrium point.  The field also tells us something interesting about the solution to the consumer's maximization problem.  Suppose that the capital stock starts at 1.  If consumption is too low then according to the dynamics, households begin to add to their capital stock.  They keep adding to the capital stock even as consumption begins to fall.  Eventually consumption approaches zero and the capital stock approaches a large constant (the k where k'[t]=0 intersects the x axis).  Intuitively, this path cannot be optimal.  Households could attain higher utility by consuming some of their capital horde!  (More technically, it can be shown that capital hoarding violates the transversality condition).  If consumption starts too high, however, the dynamics indicate increasing consumption financed with a falling capital stock.  Eventually the capital stock is fully consumed and consumption crashes to zero.  But this too cannot be optimal.  Even if it were optimal for the households to consume all of their capital stock they would never do it in a way which requires a consumption crash—they would seek to smooth consumption instead.  We can rule out any solution, therefore, that does not converge to the steady state.  To understand what happens when the capital stock starts away from the steady state we must solve for a level of consumption such that the dynamics of the model lead exactly to the steady state.  We demonstrate two methods for solving this problem.  First, the trial and error or shooting method and then the more elegant time elimination method due to Mulligan and Salai-i-Martin (1991).

Suppose k[0]=1, the shooting method picks an arbitrary initial consumption level, c[0]=a and asks whether given k[0]=1 and c[0]=a the solution path converges to the steady state.  Below we solve the model given two possible initial levels of consumption c[0]=0.6 and c[0]=0.7.

sol1 = 
      NDSolve[{c'[t] == CPrime[1/3, 0.05, 0.02, 0.02, 1.75], k'[t] == 
            KPrime[1/3, 0.05, 0.02, 0.01], c[0] == 0.55, k[0] == 1}, {c[t], 
          k[t]},  {t, 0, 150}]

sol2 = 
      NDSolve[{c'[t] == CPrime[1/3, 0.05,  .02,  .02, 1.75], k'[t] == 
            KPrime[1/3,  .05,  .02,  .01], c[0] == 0.65, k[0] == 1}, {c[t], 
          k[t]},  {t, 0, 150}]

p1 = 
        ParametricPlot[Evaluate[{k[t], c[t]} /. sol1], {t, 0, 25}, 
          DisplayFunction -> Identity];

p2 = 
        ParametricPlot[Evaluate[{k[t], c[t]} /. sol2], {t, 0, 7.8}, 
          DisplayFunction -> Identity];

Show[SS, p1, p2];

Neither candidate solution converges to the steady state.  The first implies capital hoarding and eventually zero consumption.  The second implies that the capital stock goes to zero and that consumption crashes.  From the phase plot, however, it appears that a solution exists somewhere in between c[0]=0.55 and c[0]=0.65 which will converge exactly (or arbitrarily closely) to the steady state.  The following code uses FindRoot to arrive at an approximate solution.

system[
        a_]:=NDSolve[{c'[t] == 
            CPrime[1/3, 0.05, 0.02, 0.02, 1.75], k'[t] == 
            KPrime[1/3, 0.05, 0.02, 0.01], c[0] == a, k[0] == 1}, {c, 
          k},  {t, 0, 100}]

gun := 
      c[system[#1][[1, 1, 2, 1, 1, 2]]] /. system[#1][[1, 
              1]]  &

init = 
      a /. FindRoot[gun[a] == cbar1, {a, 0.55, 0.65}, AccuracyGoal -> 4, 
          MaxIterations -> 35]

p3 = 
        ParametricPlot[Evaluate[{k[t], c[t]} /. system[init]], {t, 0, 50}, 
          PlotStyle -> Hue[0], DisplayFunction -> Identity];

Show[SS, p1, p2, p3];

The shooting method has found a good approximation to the true policy function, c[k].

The Time Elimination Method

A more elegant way to solve these types of problems is the time elimination method (Mulligan and Sala-i-Martin, 1991).  With this method we solve for the c[k] function directly.  Notice that \(TraditionalForm\`\(∂c\/∂t\)/\(∂k\/∂t\) = ∂c\/∂k\) and recall that we already know one point on the c[k] function, the steady state point, \(TraditionalForm\`c\&_ = c[k\&_]\).  With these two pieces of information we can use NDSolve to find the entire c[k] function.  First we define the derivative ∂(c/∂)k.

deriv[k_] := 
      CPrime[1/3, 0.05,  .02,  .02, 1.75]/
          KPrime[1/3, 0.05,  .02,  .01] /. {c[t] -> c[k], 
          k[t] -> k}

At the steady state, the derivative is undefined, since by definition \(TraditionalForm\`∂c\/∂t = \(∂k\/∂t = 0\)\).  To get around this problem we give NDSolve an initial condition which is just slightly different from the true steady state. [See Endnote 2.]

sol1 = 
      NDSolve[{c'[k] == deriv[k], c[kbar1] == cbar1 -  .00001}, 
        c, {k, 0.01, kbar1}]

PolicyF1 = c /. sol1[[1]]

p1 = 
      Plot[PolicyF1[k], {k, 0.01, kbar1}, PlotStyle -> Hue[0], 
        DisplayFunction -> Identity]

Show[SS, p1]

If we are interested in the finding the function c[k] when k starts out above the initial state we solve:

sol2 = 
      NDSolve[{c'[k] == deriv[k], c[kbar1] == cbar1 +  .001}, 
        c, {k, kbar1, 10}]

PolicyF2 = c /. sol2[[1]]

p2 = 
      Plot[PolicyF2[k], {k, kbar1, 10}, PlotStyle -> Hue[0], 
        DisplayFunction -> Identity]

Show[SS, p1, p2]

It will be convenient to collect both parts of c[k] into one function.

Clear[PolicyFunction]

PolicyFunction[k_] := If[k < kbar1, PolicyF1[k], PolicyF2[k]]

Time Paths

Often we are more interested in time paths than the "policy function" c[k].  We can solve for time paths using the time elimination method as an intermediate step.  Consider the function \(TraditionalForm
      \`∂k\/∂t = 
        \(-\(c(t)\)\) - 0.08`\ \(k(t)\) + \@\(k(t)\)\%3\),  although we do not know the function c[t] we just solved for c[k[t]].  If we substitute c[k[t]] into ∂(k/∂)t then with an arbitrary initial condition c[x]==y we can numerically solve for the function k[t].

First define f=c[k[t]] using the solution found earlier.

f = c /. sol1[[1]]

Then in ∂(k/∂)t substitute f[k[t]]  for c[t] and solve using the initial condition k[0]=1.

sol3 = 
      NDSolve[{k'[t] == KPrime[1/3, 0.05,  .02,  .01] /. c[t] -> f[k[t]], 
          k[0] == 1}, k, {t, 0, 65}]

KPath = k /. sol3[[1]]

KPlot = 
        Plot[KPath[t], {t, 0, 65}, DisplayFunction -> Identity];

The figure below shows how the capital stock approaches its steady state value as a function of time.

Show[KPlot, Graphics @ {Hue[0], Line[{{0, kbar1}, {80, kbar1}}]}, 
      DisplayFunction -> $DisplayFunction]

Suppose that a war cuts a nation's capital stock in half.  Figures such as the previous one can be used to answer questions like "How long will it take a nation to recover from the war" and "How fast will the economy grow along the transition path?"  (See for example King and Rebelo (1993).)

Since Y/L = Ay=Af[k] we can calculate the behavior of output per unit of effective labor along the transition path.

yPath = KPath[t]^(1/3)

yPlot = 
        Plot[yPath, {t, 0, 65}, 
          AxesLabel -> {"Time", "y"}];

The economy's growth rate along the transition path is:

yGrowth = D[yPath, t]/yPath

Plot[yGrowth, {t, 0,  65}, 
        AxesLabel -> {"Time",  "y Growth Rate"}];

Notice from above that the economy initially grows very quickly but then the growth rate slows as the economy approaches the steady state.  We can  calculate half-life's and related data by using Mathematica's findroot function.  (To get the functions in appropriate form for FindRoot we define an intermediate function z).

z[x_] = yPath /. {t -> x}

Taking z[65] as the steady state y and noting that y starts out at level 1 we find that it takes 6.1 years for output to recover 1/2 of the war time loss.

FindRoot[z[t] == 1 + (z[65] - 1)/2, {t, 2}]

To solve for the time path of consumption, recall that ∂(c/∂)t = 
        0.571428571428571352` c(
            t) ((1/(3 ((k(t))^(2/3)))) - 
              0.105000000000000004`).  We can, therefore, substitute k[t] using the function we have just found and then solve with an initial point.  We choose the initial point for consumption to be c[k[1]] so our consumption path will correspond to the capital path derived above.

sol4 = 
      NDSolve[{c'[t] == CPrime[1/3, 0.05,  .02,  .02, 1.75] /. 
            k[t] -> KPath[t], c[0] == PolicyFunction[1]}, 
        c, {t, 0, 65}]

CPath =  c /. sol4[[1]]

CPlot = 
        Plot[CPath[t], {t, 0, 65}, 
          AxesLabel -> {"Time", "Consumption"}];

If we have proceeded correctly then in the steady state we should find that the difference between output and consumption is just enough to keep the effective capital stock constant.  Recall that to keep the effective capital stock constant it must be increased by 8% every period.  Using the values at t=65 as an approximation to the steady state we can check this as follows:

(yPath /. {t -> 65})  -  CPath[65]

KPath[65]*0.08

Thus we see that in the steady state savings are just equal to what is necessary to keep the effective capital stock constant.

Taxation of Investment Income in the Ramsey Model

Once we have the basics of the model programmed, it's easy to do quite sophisticated analyses of how the economy will adjust to changes in government policy.  Let's analyze, for example, how the economy will adjust to an unexpected increase in capital income taxation.  We will find the new steady-state capital stock and then we will show how the economy moves to the new steady state.  First we redefine CPrime to take into account taxation of capital income.  Let the rate of capital income taxation be denoted τ.

Clear[CPrime,  KPrime]

CPrime[α_, δ_, g_, ρ_, θ_, τ_] := 
      c[t] ((1 - τ) α k[t]^(α - 1) - 
              δ - ρ - g θ)/θ

KPrime[α_, δ_, g_, n_] := 
      k[t]^α  - c[t] - (g + n + δ) k[t]

We initially set α=1/3, δ=.05, g=.02, n=0.01, ρ=.02, θ=1.75 just as before, and we set τ=.2 which corresponds with a 20% tax rate on capital income.  We now solve for the steady state.

kbar2 = 
      k[t] /. Flatten @ 
          Solve[CPrime[1/3, 0.05,  .02,  .02, 1.75,  .2] == 0, 
            k[t]]

cfunct = 
        c[t] /. Flatten @ 
            Solve[KPrime[1/3,  .05,  .02,  .01] == 0, c[t]];

cbar2 = cfunct /. k[t] -> kbar2

p1 = 
      Plot[cfunct /. k[t] -> k,  {k,  0.01, 8}, 
        DisplayFunction -> Identity]

The next figure shows the new steady state level of capital in red and the old steady state in black.  Notice that the steady state level of capital falls with a tax on capital income.  We are interested in discovering how the economy will move from the old to the new steady state.

SS = 
        Show[p1, 
          Graphics @ {{Hue[0],  Line[{{kbar2, 0}, {kbar2, 1.7}}]},  
              Line[{{kbar1, 0}, {kbar1, 1.8}}] } , 
          AxesLabel -> {"K Stock", "Consumption"}, 
          DisplayFunction -> $DisplayFunction];

Redefine the derivative c'[k] and applying the time elimination technique.

Clear[deriv]

deriv[k_] = 
      CPrime[1/3, 0.05,  .02,  .02, 1.75,  .2]/
          KPrime[1/3, 0.05,  .02,  .01] /. {c[t] -> c[k], 
          k[t] -> k}

sol1 = 
      NDSolve[{c'[k] == deriv[k], c[kbar2] == cbar2 +  .00001}, 
        c, {k, kbar2, kbar1}]

PolicyF1 = c /. sol1[[1]];

p2 = 
        Plot[PolicyF1[k], {k, kbar2, kbar1}, PlotStyle -> Hue[0], 
          DisplayFunction -> Identity];

Show[SS, p1, p2];

The phase plot tells us that at the moment the tax is introduced consumption jumps up discontinuously.  The intuition is that when consumers hear about the new tax they realize that the current capital stock is larger than optimal (now that capital income will be taxed).  Consumers were using much of their capital income to replace the old capital stock as it depreciated; that capital income is now freed up for consumption.  For a short time consumers enjoy a consumption boom as the capital stock is allowed to depreciate towards its new steady state level.  At the new steady state, however, the capital stock is lower and so is consumption.  The time path of the capital stock can be computed just as above.

f = c /. sol1[[1]]

sol3 = 
      NDSolve[{k'[t] == KPrime[1/3, 0.05,  .02,  .01] /. c[t] -> f[k[t]], 
          k[0] == kbar1}, k, {t, 0, 65}]

KPath = k /. sol3[[1]]

KPlot = Plot[KPath[t], {t, 0, 65}, DisplayFunction -> Identity]

The figure below shows how the capital stock approaches its steady state value as a function of time.

Show[KPlot, Graphics @ {Hue[0], Line[{{0, kbar2}, {65, kbar2}}]}, 
      DisplayFunction -> $DisplayFunction]

Conclusion

The Ramsey model is the standard model for analyzing questions in macro-economics.  When the model is extended to include uncertainty and a household labor/leisure decision it becomes the standard model for analyzing business cycles.  Mathematica's extensive numerical and graphical capabilities make it quite easy to create a working version of the model which can be used to analyze how the economy will react to changes in government policy.

EndNotes

1) To use Mathematica's PlotVectorField command evaluate the following immediately after evaluating the commands in the relevant portion of the text:

<< Graphics`PlotField`

VField = 
      PlotVectorField[{KPrime[1/3,  .05,  .02,  .01], 
          CPrime[1/3, 0.05,  .02,  .02, 1.75]}, {k[t], 0.1, 10}, {c[t],  .01, 
          2}, PlotPoints -> 15]

Show[SS, VField]

2) The policy function c[k] actually has two arms, the stable arm where the dynamics push the system towards the steady state, and the unstable arm which crosses the steady state from the NW to the SE.  (One can see the stability properties of the arms by consulting the "fish flow" diagram.)  Starting the process off at an initial state which "catches" the right arm can take a little guesswork.  

3)	Alternatively one can use L'Hopital's rule to solve for the slope of the derivative at the steady state.  One should then be able to define a new derivative function which is everywhere the same as deriv[k] except at the steady state where it takes on the value necessary to create the appropriate slope.  I experimented with this approach but writing the new derivative function in a way which was acceptable to NDSolve proved more difficult than expected.  Perhaps someone would like to take up this challenge?
	Below I use L'Hopital's rule to solve for the slopes of both arms of the derivative function.  As can be seen, at the steady state the stable arm has slope 0.110256 and the unstable arm slope -0.0852561.

hop = D[Numerator[deriv[k]], k]/D[Denominator[deriv[k]], k]

slopes = Solve[c'[k] == hop, c'[k]]

slopes /. {c[k] -> cbar1, k -> kbar1}

{{c'(5.65632`)->-0.0852561},{c'(5.65632`)->0.110256`}}

References

Barro, R. J. and X. Sala-i-Martin (1995). Economic Growth. New York: McGraw-Hill.

Blanchard, O. J., and S. Fischer. 1989. Lectures On Macroeconomics. Cambridge, Mass.: The MIT Press.

Cass, D. 1965. Optimum Growth in an Aggregative Model of Capital Accumulation. Review of Economic Studies 32:233-40.

Kamien, M. I., and N. L. Schwartz. 1991. Dynamic Optimization: The Calculus of Variations and Optimal Control in Economics and Management. 2nd ed. Amsterdam: North-Holland.

King, R. G. and S.T. Rebelo. 1993. Transitional Dynamics and Economic Growth in the Neoclassical model. American Economic Review 4:908-931.

Koopmans, T. C. 1965. On the concept of opitmal economic growth. In: The Econometric Approach to Development Planning. Amsterdam: North Holland.

Mulligan, C.B. and X. Sala-i-Martin. 1991. A note on the time elimination method for solving recursive dynamic economic problems. NBER Working Paper No. 116, Nov.

Ramsey, F. P. 1928. A Mathematical Theory of Saving. The Economic Journal 38 (December):543-59.

Romer, D. 1996. Advanced MacroEconomics. New York: McGraw Hill.

Schwalbe, D. and Wagon, S. 1997. VisualDSolve. Visualizing Differential Equations with Mathematica. New York: TELOS-Springer Verlag.

ABOUT THE AUTHOR

Alexander Tabarrok is Research Director for the Independent Institute, a non-profit think-tank which conducts research on public policy and is
based in Oakland, CA. He received his Ph.D. in economics from George Mason University, and he has taught at the University of Virginia and Ball State University. Papers by Dr. Tabarrok have appeared in The Journal of Law and Economics, Public Choice, Economic Inquiry, The Journal of Health Economics, The Journal of Theoretical Politics, and many other journals.

Dr. Alexander Tabarrok
Director of Research
The Independent Institute
100 Swan Way
Oakland, CA, 94621-1428
Tel. 510-632-1366
Email: ATabarrok@Independent.org

ELECTRONIC SUBSCRIPTIONS

Included in the distribution for each electronic subscription is the file Ramsey.nb containing Mathematica code for the material described in this article.