In [1]:
include("lin_int2.jl")


Out[1]:
lin_inter (generic function with 1 method)

In [2]:
#=
A first pass at solving the optimal growth problem via value function
iteration.  A more general version is provided in optgrowth.py.

@author : Spencer Lyon <spencer.lyon@nyu.edu>
=#

using Optim: optimize
using Grid: CoordInterpGrid, BCnan, InterpLinear
using Plots
pyplot()

## Primitives and grid
alpha = 0.65
bet = 0.95
grid_max = 2
grid_size = 150
grid = 1e-6:(grid_max-1e-6)/(grid_size-1):grid_max

## Exact solution
ab = alpha * bet
c1 = (log(1 - ab) + log(ab) * ab / (1 - ab)) / (1 - bet)
c2 = alpha / (1 - ab)
v_star(k) = c1 .+ c2 .* log(k)


function bellman_operator(grid, w)
    Aw = lin_inter(grid, w)

    Tw = zeros(w)

    for (i, k) in enumerate(grid)
        objective(c) = - log(c) - bet * Aw(k^alpha - c)
        res = optimize(objective, 1e-6, k^alpha)
        Tw[i] = - objective(res.minimum)
    end
    return Tw
end

function main(n::Int=35)
    w_init = 5 .* log(grid) .- 25  # An initial condition -- fairly arbitrary
    w = copy(w_init)

    ws = []
    colors = []
    for i=1:n
        w = bellman_operator(grid, w)
        push!(ws, w)
        push!(colors, RGBA(0, 0, 0, i/n))
    end

    p = plot(grid, w_init, color=:green, linewidth=2, alpha=0.6,
         label="initial condition")
    plot!(grid, ws, color=colors', label="", linewidth=2)
    plot!(grid, v_star(grid), color=:blue, linewidth=2, alpha=0.8,
         label="true value function")
    plot!(ylims=(-40, -20), xlims=(minimum(grid), maximum(grid)))

    return p
end


Out[2]:
main (generic function with 2 methods)

In [3]:
main()


Error
LoadError: MethodError: no method matching *(::Float64, ::Void)
Closest candidates are:
  *(::Any, ::Any, !Matched::Any, !Matched::Any...) at operators.jl:138
  *(::Float64, !Matched::Float64) at float.jl:244
  *(::Real, !Matched::Complex{Bool}) at complex.jl:158
  ...
while loading In[3], in expression starting on line 1

 in #optimize#73(::Float64, ::Float64, ::Int64, ::Bool, ::Bool, ::Void, ::Int64, ::Bool, ::Optim.#optimize, ::#objective#2{#func#1{FloatRange{Float64},Array{Float64,1}}}, ::Float64, ::Float64, ::Optim.Brent) at C:\Users\Ryota Tsushima\.julia\v0.5\Optim\src\brent.jl:122
 in (::Optim.#kw##optimize)(::Array{Any,1}, ::Optim.#optimize, ::Function, ::Float64, ::Float64, ::Optim.Brent) at .\<missing>:0
 in #optimize#90(::Optim.Brent, ::Float64, ::Float64, ::Int64, ::Bool, ::Bool, ::Void, ::Int64, ::Bool, ::Optim.#optimize, ::#objective#2{#func#1{FloatRange{Float64},Array{Float64,1}}}, ::Float64, ::Float64) at C:\Users\Ryota Tsushima\.julia\v0.5\Optim\src\optimize.jl:237
 in optimize(::Function, ::Float64, ::Float64) at C:\Users\Ryota Tsushima\.julia\v0.5\Optim\src\optimize.jl:230
 in bellman_operator(::FloatRange{Float64}, ::Array{Float64,1}) at .\In[2]:34
 in main(::Int64) at .\In[2]:47
 in main() at .\In[2]:41

In [ ]: