0001 function sim1
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 global M_ options_ oo_
0036
0037 lead_lag_incidence = M_.lead_lag_incidence;
0038
0039 ny = size(oo_.endo_simul,1) ;
0040 nyp = nnz(lead_lag_incidence(1,:)) ;
0041 nyf = nnz(lead_lag_incidence(3,:)) ;
0042 nrs = ny+nyp+nyf+1 ;
0043 nrc = nyf+1 ;
0044 iyf = find(lead_lag_incidence(3,:)>0) ;
0045 iyp = find(lead_lag_incidence(1,:)>0) ;
0046 isp = [1:nyp] ;
0047 is = [nyp+1:ny+nyp] ;
0048 isf = iyf+nyp ;
0049 isf1 = [nyp+ny+1:nyf+nyp+ny+1] ;
0050 stop = 0 ;
0051 iz = [1:ny+nyp+nyf];
0052
0053 disp (['-----------------------------------------------------']) ;
0054 disp (['MODEL SIMULATION :']) ;
0055 fprintf('\n') ;
0056
0057 it_init = M_.maximum_lag+1 ;
0058
0059 h1 = clock ;
0060 for iter = 1:options_.maxit_
0061 h2 = clock ;
0062
0063 if options_.terminal_condition == 0
0064 c = zeros(ny*options_.periods,nrc) ;
0065 else
0066 c = zeros(ny*(options_.periods+1),nrc) ;
0067 end
0068
0069 it_ = it_init ;
0070 z = [oo_.endo_simul(iyp,it_-1) ; oo_.endo_simul(:,it_) ; oo_.endo_simul(iyf,it_+1)] ;
0071 [d1,jacobian] = feval([M_.fname '_dynamic'],z,oo_.exo_simul, M_.params, oo_.steady_state,it_);
0072 jacobian = [jacobian(:,iz) -d1] ;
0073 ic = [1:ny] ;
0074 icp = iyp ;
0075 c (ic,:) = jacobian(:,is)\jacobian(:,isf1) ;
0076 for it_ = it_init+(1:options_.periods-1)
0077 z = [oo_.endo_simul(iyp,it_-1) ; oo_.endo_simul(:,it_) ; oo_.endo_simul(iyf,it_+1)] ;
0078 [d1,jacobian] = feval([M_.fname '_dynamic'],z,oo_.exo_simul, ...
0079 M_.params, oo_.steady_state, it_);
0080 jacobian = [jacobian(:,iz) -d1] ;
0081 jacobian(:,[isf nrs]) = jacobian(:,[isf nrs])-jacobian(:,isp)*c(icp,:) ;
0082 ic = ic + ny ;
0083 icp = icp + ny ;
0084 c (ic,:) = jacobian(:,is)\jacobian(:,isf1) ;
0085 end
0086
0087 if options_.terminal_condition == 1
0088 s = eye(ny) ;
0089 s(:,isf) = s(:,isf)+c(ic,1:nyf) ;
0090 ic = ic + ny ;
0091 c(ic,nrc) = s\c(ic,nrc) ;
0092 c = bksup1(c,ny,nrc,iyf,options_.periods) ;
0093 c = reshape(c,ny,options_.periods+1) ;
0094 oo_.endo_simul(:,it_init+(0:options_.periods)) = oo_.endo_simul(:,it_init+(0:options_.periods))+options_.slowc*c ;
0095 else
0096 c = bksup1(c,ny,nrc,iyf,options_.periods) ;
0097 c = reshape(c,ny,options_.periods) ;
0098 oo_.endo_simul(:,it_init+(0:options_.periods-1)) = oo_.endo_simul(:,it_init+(0:options_.periods-1))+options_.slowc*c ;
0099 end
0100
0101 err = max(max(abs(c./options_.scalv')));
0102 disp([num2str(iter) ' - err = ' num2str(err)]) ;
0103 disp([' Time of iteration :' num2str(etime(clock,h2))]) ;
0104
0105 if err < options_.dynatol.f
0106 stop = 1 ;
0107 fprintf('\n') ;
0108 disp([' Total time of simulation :' num2str(etime(clock,h1))]) ;
0109 fprintf('\n') ;
0110 disp([' Convergency obtained.']) ;
0111 fprintf('\n') ;
0112 oo_.deterministic_simulation.status = 1;
0113 oo_.deterministic_simulation.error = err;
0114 oo_.deterministic_simulation.iterations = iter;
0115 break
0116 end
0117 end
0118
0119 if ~stop
0120 fprintf('\n') ;
0121 disp([' Total time of simulation :' num2str(etime(clock,h1))]) ;
0122 fprintf('\n') ;
0123 disp(['WARNING : maximum number of iterations is reached (modify options_.maxit_).']) ;
0124 fprintf('\n') ;
0125 oo_.deterministic_simulation.status = 0;
0126 oo_.deterministic_simulation.error = err;
0127 oo_.deterministic_simulation.errors = c/abs(err);
0128 oo_.deterministic_simulation.iterations = options_.maxit_;
0129 end
0130 disp (['-----------------------------------------------------']) ;
0131