Kosumi Mao
Department of Economics, University of Tokyo
From Miranda and Fackler, Applied Computational Economics and Finance, 2002, Section 7.6.2
Julia
translation of the Python version
In [1]:
using QuantEcon
In [2]:
maxage = 5 # Maximum asset age
repcost = 75 # Replacement cost
beta = 0.9 # Discount factor
m = 2 # Number of actions; 1: keep, 2: replace;
In [3]:
S = [i for i in 1:maxage]
n = length(S);
In [4]:
# Reward array
R = Array{Float64}(n,m)
for i in 1:n
R[i, 1] = 50 - 2.5 * S[i] - 2.5 * S[i]^2
R[i, 2] = 50 - repcost
end
# Infeasible action
R[n,1] = -Inf;
In [5]:
R
Out[5]:
In [6]:
# (Degenerate) transition probability array
Q = zeros(n,m,n)
for i in 1:n
Q[i, 1, min(i+1, n)] = 1
Q[i, 2, 1] = 1
end
In [7]:
Q
Out[7]:
In [8]:
# Create a DiscreteDP
ddp = DiscreteDP(R, Q, beta);
In [9]:
# Solve the dynamic optimization problem (by policy iteration)
res = solve(ddp, PFI);
In [10]:
# Number of iterations
res.num_iter
Out[10]:
In [11]:
# Optimal value function
res.v
Out[11]:
In [12]:
# Optimal policy
res.sigma
Out[12]:
In [13]:
# Transition probability matrix
res.mc.p
Out[13]:
In [14]:
# Simulate the controlled Markov chain
initial_state_value = 1
nyrs = 12
spath = simulate(res.mc, nyrs+1, init=initial_state_value);
In [15]:
using PyPlot
In [16]:
import PyPlot.plt
fig, axes = plt[:subplots](1, 2, figsize=(12, 4))
axes[1][:plot]( [i for i in 1:n], res.v)
axes[1][:set_xlim](1, 5)
axes[1][:set_ylim](160, 220)
axes[1][:set_xticks](linspace(1, 5, 5))
axes[1][:set_xlabel]("Age of Machine")
axes[1][:set_ylabel]("Value")
axes[1][:set_title]("Optimal Value Function")
axes[2][:plot](spath)
axes[2][:set_xlim](0, nyrs)
axes[2][:set_ylim](1, 4)
axes[2][:set_yticks](linspace(1, 4, 4))
axes[2][:set_xlabel]("Year")
axes[2][:set_ylabel]("Age of Machine")
axes[2][:set_title]("Optimal State Path")
Out[16]:
In [ ]: