%%%%% Problem set 4, Question 2 Discrete-state value function iteration for %%%%% stochastic growth model clear all tic %%%%% Parameter values alpha = 0.33; beta = 0.95; delta = 0.04; sigma = 2.00; %%%%% Technology zl = 0.97; zh = 1.03; %%%%% Transition matrix P = [0.95,0.05;0.05,0.95]; %%%%% Solve for kbarh kbarl = ((alpha*zl*beta)/(1-beta+delta*beta))^(1/(1-alpha)) kbarh = ((alpha*zh*beta)/(1-beta+delta*beta))^(1/(1-alpha)) %%%%% Set up discrete state space NK = 1000; Kgrid = linspace(0.01,5*kbarh,NK)'; %%%%% Set up return matrices Rl = zeros(NK,NK); Rh = zeros(NK,NK); Cl = zeros(NK,NK); Ch = zeros(NK,NK); for i = 1:NK, ki = Kgrid(i); for h = 1:NK, kh = Kgrid(h); cl = zl*ki^alpha+(1-delta)*zl*ki-kh; ch = zh*ki^alpha+(1-delta)*zh*ki-kh; Cl(i,h) = max(0,cl); Ch(i,h) = max(0,ch); %% Imposes consumption non-negative end end Rl = (1/(1-sigma))*(Cl.^(1-sigma)); Rh = (1/(1-sigma))*(Ch.^(1-sigma)); %%%%% Begin value function iteration iter = 0; error = 100; V0 = zeros(NK,2); while error>10^-6 & iter<400 Vl = V0(:,1); Vh = V0(:,2); TVl0 = max((Rl+beta*P(1,1)*ones(NK,1)*Vl'+beta*P(1,2)*ones(NK,1)*Vh')'); TVh0 = max((Rh+beta*P(2,1)*ones(NK,1)*Vl'+beta*P(2,2)*ones(NK,1)*Vh')'); %% Bellman operations TV0 = [TVl0',TVh0']; error = max(max(abs(V0-TV0))) V0 = TV0; iter = iter+1 end V = TV0; time = toc/60; if error<10^6 & iter<300 display('Congratulations, you found a fixed point!') display(['Time taken = ' ,num2str(time),' minutes']) end figure(1) plot(Kgrid,V(:,1),'b',Kgrid,V(:,2),'r') legend('V(k,zL)','V(k,zH)',2) title('Value functions') xlabel('Capital stock') ylabel('Lifetime utility') %%%%% Compute policy function display('Now computing policy functions') gl = zeros(NK,1); gh = zeros(NK,1); [vl,il] = max((Rl+beta*P(1,1)*ones(NK,1)*V(:,1)'+beta*P(1,2)*ones(NK,1)*V(:,2)')'); [vh,ih] = max((Rh+beta*P(1,1)*ones(NK,1)*V(:,1)'+beta*P(1,2)*ones(NK,1)*V(:,2)')'); for i = 1:NK, gl(i) = Kgrid(il(i)); gh(i) = Kgrid(ih(i)); end figure(2) plot(Kgrid,Kgrid,'k--',Kgrid,gl,'b',Kgrid,gh,'r') legend('45-degree','k_{t+1}=g(k_{t},zL)','k_{t+1}=g(k_{t},zH)',2) title('Policy functions') xlabel('Capital stock') ylabel('Optimal policy') %break %%%%% Compute transition matrix for (k,z) pairs display('Now computing transition matrix') Igl = zeros(NK,NK); %% indicator functions Igh = zeros(NK,NK); for i = 1:NK, Igl(i,il(i)) = 1; %% if z=zl,k=ki, then Igl(i) = 1 for best response, zero o/w Igh(i,ih(i)) = 1; %% if z=zh,k=ki, then Igh(i) = 1 for best response, zero o/w end QLL = P(1,1)*Igl; QHL = P(1,2)*Igl; QLH = P(2,1)*Igh; QHH = P(2,2)*Igh; Q = [QLL,QHL;QLH,QHH]; display('Now computing stationary distribution...') [VV,DD] = eig(Q'); dd = diag(DD); %% check how many unit eigenvalues there are!! %% if kmin = 0, there are 2 (one trivial, only relevant if initial capital is zero) %% if kmin > 0, there is 1 [smallest,index] = min(abs(dd-1)); %% find a unit eigenvalue vv = VV(:,index); Qbar = (vv/sum(vv))'; Qbarl = Qbar(1:NK); Qbarh = Qbar(NK+1:2*NK); display('...done!') figure(3) plot(Kgrid,Qbarl,'b',Kgrid,Qbarh,'r') legend('conditional on zL','conditional on zH',2) title('Stationary distribution') xlabel('Capital stock') ylabel('Probability mass') figure(4) plot(Kgrid,cumsum(Qbarl),'b',Kgrid,cumsum(Qbarh),'r') legend('conditional on zL','conditional on zH',2) title('Cumulative stationary distribution') xlabel('Capital stock') ylabel('Cumulative probability')