0001 function info = perfect_foresight_simulation(compute_linear_solution,steady_state)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038 global M_ options_ it_ oo_
0039
0040 persistent lead_lag_incidence dynamic_model ny nyp nyf nrs nrc iyf iyp isp is isf isf1 iz icf ghx iflag
0041
0042 if ~nargin && isempty(iflag)
0043 lead_lag_incidence = M_.lead_lag_incidence;
0044 dynamic_model = [M_.fname '_dynamic'];
0045 ny = size(oo_.endo_simul,1);
0046 nyp = nnz(lead_lag_incidence(1,:));
0047 nyf = nnz(lead_lag_incidence(3,:));
0048 nrs = ny+nyp+nyf+1;
0049 nrc = nyf+1;
0050 iyf = find(lead_lag_incidence(3,:)>0);
0051 iyp = find(lead_lag_incidence(1,:)>0);
0052 isp = 1:nyp;
0053 is = (nyp+1):(nyp+ny);
0054 isf = iyf+nyp;
0055 isf1 = (nyp+ny+1):(nyf+nyp+ny+1);
0056 iz = 1:(ny+nyp+nyf);
0057 icf = 1:size(iyf,2);
0058 info = [];
0059 iflag = 1;
0060 return
0061 end
0062
0063 initial_endo_simul = oo_.endo_simul;
0064
0065 warning_old_state = warning;
0066 warning off all
0067
0068 if nargin<1
0069 compute_linear_solution = 0;
0070 else
0071 if nargin<2
0072 error('The steady state (second input argument) is missing!');
0073 end
0074 end
0075
0076 if ~isstruct(compute_linear_solution) && compute_linear_solution
0077 [dr,info,M_,options_,oo_] = resol(0,M_,options_,oo_);
0078 elseif isstruct(compute_linear_solution)
0079 dr = compute_linear_solution;
0080 compute_linear_solution = 1;
0081 end
0082
0083 if compute_linear_solution
0084 ghx(dr.order_var,:) = dr.ghx;
0085 ghx = ghx(iyf,:);
0086 end
0087
0088 periods = options_.periods;
0089
0090 stop = 0 ;
0091 it_init = M_.maximum_lag+1;
0092
0093 info.convergence = 1;
0094 info.time = 0;
0095 info.error = 0;
0096 info.iterations.time = zeros(options_.maxit_,1);
0097 info.iterations.error = info.iterations.time;
0098
0099 last_line = options_.maxit_;
0100 error_growth = 0;
0101
0102 h1 = clock;
0103 for iter = 1:options_.maxit_
0104 h2 = clock;
0105 if options_.terminal_condition
0106 c = zeros(ny*(periods+1),nrc);
0107 else
0108 c = zeros(ny*periods,nrc);
0109 end
0110 it_ = it_init;
0111 z = [ oo_.endo_simul(iyp,it_-1) ; oo_.endo_simul(:,it_) ; oo_.endo_simul(iyf,it_+1) ];
0112 [d1,jacobian] = feval(dynamic_model,z,oo_.exo_simul, M_.params, it_);
0113 jacobian = [jacobian(:,iz) , -d1];
0114 ic = 1:ny;
0115 icp = iyp;
0116 c(ic,:) = jacobian(:,is)\jacobian(:,isf1) ;
0117 for it_ = it_init+(1:periods-1-(options_.terminal_condition==2))
0118 z = [ oo_.endo_simul(iyp,it_-1) ; oo_.endo_simul(:,it_) ; oo_.endo_simul(iyf,it_+1)];
0119 [d1,jacobian] = feval(dynamic_model,z,oo_.exo_simul, M_.params, it_);
0120 jacobian = [jacobian(:,iz) , -d1];
0121 jacobian(:,[isf nrs]) = jacobian(:,[isf nrs])-jacobian(:,isp)*c(icp,:);
0122 ic = ic + ny;
0123 icp = icp + ny;
0124 c(ic,:) = jacobian(:,is)\jacobian(:,isf1);
0125 end
0126 if options_.terminal_condition
0127 if options_.terminal_condition==1
0128 s = eye(ny);
0129 s(:,isf) = s(:,isf)+c(ic,1:nyf);
0130 ic = ic + ny;
0131 c(ic,nrc) = s\c(ic,nrc);
0132 else
0133 it_ = it_+1;
0134 z = [ oo_.endo_simul(iyp,it_-1) ; oo_.endo_simul(:,it_) ; oo_.endo_simul(iyf,it_+1) ] ;
0135 [d1,jacobian] = feval(dynamic_model,z,oo_.exo_simul, M_.params, it_);
0136 jacobian = [jacobian(:,iz) -d1];
0137 jacobian(:,[isf nrs]) = jacobian(:,[isf nrs])-jacobian(:,isp)*c(icp,:) ;
0138 ic = ic + ny;
0139 icp = icp + ny;
0140 s = jacobian(:,is);
0141 s(:,iyp) = s(:,iyp)+jacobian(:,isf)*ghx;
0142 c (ic,:) = s\jacobian(:,isf1);
0143 end
0144 c = bksup0(c,ny,nrc,iyf,icf,periods);
0145 c = reshape(c,ny,periods+1);
0146 oo_.endo_simul(:,it_init+(0:periods)) = oo_.endo_simul(:,it_init+(0:periods))+options_.slowc*c;
0147 else
0148 c = bksup0(c,ny,nrc,iyf,icf,periods);
0149 c = reshape(c,ny,periods);
0150 oo_.endo_simul(:,it_init+(0:periods-1)) = oo_.endo_simul(:,it_init+(0:periods-1))+options_.slowc*c;
0151 end
0152 err = max(max(abs(c)));
0153 info.iterations.time(iter) = etime(clock,h2);
0154 info.iterations.error(iter) = err;
0155 if iter>1
0156 error_growth = error_growth + (info.iterations.error(iter)>info.iterations.error(iter-1));
0157 end
0158 if isnan(err) || error_growth>3
0159 last_line = iter;
0160 break
0161 end
0162 if err < options_.dynatol.f
0163 stop = 1;
0164 info.time = etime(clock,h1);
0165 info.error = err;
0166 info.iterations.time = info.iterations.time(1:iter);
0167 info.iterations.error = info.iterations.error(1:iter);
0168 break
0169 end
0170 end
0171
0172 if stop && options_.terminal_condition==2
0173
0174
0175 idx = find(abs(oo_.steady_state)>0);
0176 distance_to_steady_state = abs(((oo_.endo_simul(idx,end)-oo_.steady_state(idx))./oo_.steady_state(idx)))*100;
0177 disp(['(max) Distance to steady state at the end is (in percentage):' num2str(max(distance_to_steady_state))])
0178 end
0179
0180 if ~stop
0181 info.time = etime(clock,h1);
0182 info.error = err;
0183 info.convergence = 0;
0184 info.iterations.time = info.iterations.time(1:last_line);
0185 info.iterations.error = info.iterations.error(1:last_line);
0186 oo_.endo_simul = initial_endo_simul;
0187 end
0188
0189 warning(warning_old_state);