0001
0002
0003 function simk
0004
0005 global M_ options_ oo_
0006 global it_ iyr0 ct_ broyden_
0007
0008 func_name = [M_.fname '_static'];
0009 nk = M_.maximum_lag + M_.maximum_lead + 1 ;
0010 ny = size(M_.lead_lag_incidence,2) ;
0011 icc1 = M_.lead_lag_incidence(nk,:) > 0;
0012
0013 for i = 1:M_.maximum_lead -1
0014 icc1 = [M_.lead_lag_incidence(nk-i,:) | icc1(1,:); icc1] ;
0015 end
0016
0017 icc1 = find(icc1') ;
0018 iy = M_.lead_lag_incidence > 0 ;
0019 isc = cumsum(sum(iy',1))' ;
0020 iyr0 = find(M_.lead_lag_incidence') ;
0021 ncc1 = size(icc1,1) ;
0022 ncc = ncc1 + 1 ;
0023 ncs = size(iyr0,1) ;
0024
0025 ky = zeros(ny,nk) ;
0026 lky = zeros(nk,1) ;
0027 for i = 1:nk
0028 j = find(M_.lead_lag_incidence(i,:))' ;
0029 if isempty(j)
0030 lky(i) = 0;
0031 else
0032 lky(i) = size(j,1) ;
0033 ky(1:lky(i),i) = j ;
0034 end
0035 end
0036
0037 jwc = find(iy(2:M_.maximum_lead+1,:)') ;
0038
0039
0040
0041 if isempty(jwc)
0042 jwc = 0 ;
0043 ljwc = 0 ;
0044 temp = icc1 ;
0045 else
0046 ljwc = size(jwc,1) ;
0047 temp = union(jwc,icc1) ;
0048 end
0049
0050 j1 = ky(1:lky(1),1) ;
0051 lj1 = lky(1) ;
0052
0053 for i = 2:M_.maximum_lag
0054 [j1,lj1] = ffill(j1,lj1,selif(temp+(i-1)*ny,temp <= ny)) ;
0055 if M_.maximum_lead == 1
0056 if lky(i+M_.maximum_lead) > 0
0057 [jwc,ljwc] = ffill(jwc,ljwc, ky(1:lky(i+M_.maximum_lead),i+M_.maximum_lead)+(M_.maximum_lead-1)*ny) ;
0058 if ljwc(i) == 0
0059 temp = icc1;
0060 else
0061 temp = union(jwc(1:ljwc(i),i),icc1) ;
0062 end
0063 else
0064 [jwc,ljwc] = ffill(jwc,ljwc,[]) ;
0065 temp = icc1 ;
0066 end
0067 else
0068 temp = temp(lj1(i)+1:size(temp,1),:) - ny ;
0069 if lky(i+M_.maximum_lead) > 0
0070 [jwc,ljwc] = ffill(jwc,ljwc,[temp;ky(1:lky(i+M_.maximum_lead),i+M_.maximum_lead)+(M_.maximum_lead-1)*ny]);
0071 else
0072 [jwc,ljwc] = ffill(jwc,ljwc,temp) ;
0073 end
0074 temp = union(jwc(1:ljwc(i),i),icc1) ;
0075 end
0076 end
0077
0078 [j1,lj1] = ffill(j1,lj1,selif(temp+M_.maximum_lag*ny, temp <= ny)) ;
0079 ltemp = zeros(M_.maximum_lag,1) ;
0080 jwc1 = zeros(ncc1,M_.maximum_lag) ;
0081
0082 for i = 1:M_.maximum_lag
0083 temp = union(jwc(1:ljwc(i),i),icc1) ;
0084 ltemp(i) = size(temp,1) ;
0085 if ljwc(i) > 0
0086 jwc(1:ljwc(i),i) = indnv(jwc(1:ljwc(i),i),temp) ;
0087 end
0088 jwc1(:,i) = indnv(icc1,temp) ;
0089 end
0090
0091 h1 = clock ;
0092
0093 disp (['-----------------------------------------------------']) ;
0094 disp ('MODEL SIMULATION') ;
0095 fprintf ('\n') ;
0096
0097 for iter = 1:options_.maxit
0098 h2 = clock ;
0099 oo_.y_simul = oo_.y_simul(:);
0100 err_f = 0;
0101
0102 fid = fopen('dynare.swp','w+') ;
0103
0104 it_ = 1+M_.maximum_lag ;
0105 ic = [1:ny] ;
0106 iyr = iyr0 ;
0107 i = M_.maximum_lag+1 ;
0108 while (i>1) & (it_<=options_.periods+M_.maximum_lag)
0109 h3 = clock ;
0110 if broyden_ & iter > 1
0111
0112 d1 = -feval([M_.fname '_dynamic'],oo_.y_simul(iyr),z,oo_.exo_simul);
0113 else
0114
0115 [d1,M_.jacobia] = feval([M_.fname '_dynamic'],oo_.y_simul(iyr),oo_.exo_simul);
0116 d1 = -d1 ;
0117 end
0118 err_f = max(err_f,max(abs(d1)));
0119 if lky(i) ~= 0
0120 j1i = ky(1:lky(i),i) ;
0121 w0 = M_.jacobia(:,isc(i-1)+1:isc(i)) ;
0122 else
0123 w0 = [];
0124 end
0125 ttemp = iy(i+1:i+M_.maximum_lead,:)' ;
0126 jwci = find(ttemp) ;
0127 if ~ isempty(jwci)
0128 w = M_.jacobia(:,isc(i)+1:isc(i+M_.maximum_lead)) ;
0129 end
0130 j = i ;
0131 while j <= M_.maximum_lag
0132 if ~isempty(w0)
0133
0134 ofs = ((it_-M_.maximum_lag-M_.maximum_lag+j-2)*ny)*ncc*8 ;
0135 junk = fseek(fid,ofs,-1) ;
0136 c = fread(fid,[ncc,ny],'float64') ;
0137
0138 if isempty(jwci)
0139 w = -w0*c(j1i,1:ncc1) ;
0140 jwci = icc1 ;
0141 else
0142 iz = union(jwci,icc1) ;
0143 ix = indnv(jwci,iz) ;
0144 iy__ = indnv(icc1,iz) ;
0145 temp = zeros(size(w,1),size(iz,1)) ;
0146 temp(:,ix) = w ;
0147 temp(:,iy__) = temp(:,iy__)-w0*c(j1i,1:ncc1) ;
0148 w = temp ;
0149 jwci = iz ;
0150 clear temp iz ix iy__ ;
0151 end
0152 d1 = d1-w0*c(j1i,ncc) ;
0153 clear c ;
0154 end
0155 j = j + 1 ;
0156 if isempty(jwci)
0157 j1i = [];
0158 if lky(j+M_.maximum_lead) ~= 0
0159 jwci = ky(1:lky(j+M_.maximum_lead),j+M_.maximum_lead) + (M_.maximum_lead-1)*ny ;
0160 w = M_.jacobia(:,isc(j+M_.maximum_lead-1)+1:isc(j+M_.maximum_lead)) ;
0161 else
0162 jwci = [] ;
0163 end
0164 else
0165 j1i = selif(jwci,jwci<(ny+1)) ;
0166 w0 = w(:,1:size(j1i,1)) ;
0167 if size(jwci,1) == size(j1i,1)
0168 if lky(j+M_.maximum_lead) ~= 0
0169 jwci = ky(1:lky(j+M_.maximum_lead),j+M_.maximum_lead)+(M_.maximum_lead-1)*ny ;
0170 w = M_.jacobia(:,isc(j+M_.maximum_lead-1)+1:isc(j+M_.maximum_lead)) ;
0171 else
0172 jwci = [] ;
0173 end
0174 else
0175 jwci = jwci(size(j1i,1)+1:size(jwci,1),:)-ny ;
0176 w = w(:,size(j1i,1)+1:size(w,2)) ;
0177 if lky(j+M_.maximum_lead) ~= 0
0178 jwci = [ jwci; ky(1: lky(j+M_.maximum_lead),j+M_.maximum_lead)+(M_.maximum_lead-1)*ny] ;
0179 w = [w M_.jacobia(:,isc(j+M_.maximum_lead-1)+1:isc(j+M_.maximum_lead))] ;
0180
0181
0182 end
0183 end
0184 end
0185 end
0186 jwci = [indnv(jwci,icc1);ncc] ;
0187 w = [w d1] ;
0188 c = zeros(ny,ncc) ;
0189 c(:,jwci) = w0\w ;
0190 clear w w0 ;
0191
0192 junk = fseek(fid,0,1) ;
0193 fwrite(fid,c,'float64') ;
0194 clear c ;
0195
0196 it_ = it_ + 1;
0197 ic = ic + ny ;
0198 iyr = iyr + ny ;
0199 i = i - 1 ;
0200 end
0201 icr0 = (it_-M_.maximum_lag-M_.maximum_lag -1)*ny ;
0202 while it_ <= options_.periods+M_.maximum_lag
0203 if broyden_
0204
0205 d1 = -feval([M_.fname '_dynamic'],oo_.y_simul(iyr),z,oo_.exo_simul);
0206 else
0207
0208 [d1,M_.jacobia] = feval([M_.fname '_dynamic'],oo_.y_simul(iyr),oo_.exo_simul);
0209 d1 = -d1 ;
0210 end
0211 err_f = max(err_f,max(abs(d1)));
0212 w0 = M_.jacobia(:,1:isc(1)) ;
0213 w = M_.jacobia(:,isc(1)+1:isc(1+M_.maximum_lead)) ;
0214 j = 1 ;
0215 while j <= M_.maximum_lag
0216 icr = j1(1:lj1(j),j)-(j-1)*ny ;
0217
0218 ofs = ((icr0+(j-1)*ny+1)-1)*ncc*8 ;
0219 junk = fseek(fid,ofs,-1) ;
0220 c = fread(fid,[ncc,ny],'float64') ;
0221
0222 temp = zeros(ny,ltemp(j)) ;
0223 if ljwc(j) > 0
0224 temp(:,jwc(1:ljwc(j),j)) = w ;
0225 end
0226 temp(:,jwc1(:,j))=temp(:,jwc1(:,j))-w0*c(icr,1:ncc1) ;
0227 w = temp ;
0228 clear temp ;
0229 d1 = d1-w0*c(icr,ncc) ;
0230 clear c ;
0231 j = j + 1 ;
0232 w0 = w(:,1:lj1(j)) ;
0233 if M_.maximum_lead == 1
0234 w = M_.jacobia(:,isc(j+M_.maximum_lead-1)+1:isc(j+M_.maximum_lead)) ;
0235 else
0236 w = w(:,lj1(j)+1:size(w,2)) ;
0237
0238 if lky(j+M_.maximum_lead) > 0
0239 w = [w M_.jacobia(:,isc(j+M_.maximum_lead-1)+1:isc(j+M_.maximum_lead))] ;
0240 end
0241 end
0242 end
0243 c = w0\[w d1] ;
0244 d1 = [] ;
0245 clear w w0 ;
0246 junk = fseek(fid,0,1) ;
0247 fwrite(fid,c,'float64') ;
0248 clear c ;
0249 it_ = it_ + 1 ;
0250 ic = ic + ny ;
0251 iyr = iyr + ny ;
0252 icr0 = icr0 + ny ;
0253 end
0254 if ct_ == 1
0255
0256 ofs = (((it_-M_.maximum_lag-2)*ny+1)-1)*ncc*8 ;
0257 junk = fseek(fid,ofs,-1) ;
0258 c = fread(fid,[ncc,ny],'float64') ;
0259
0260 for i = 1:M_.maximum_lead
0261 w = tril(triu(ones(ny,ny+ncc1))) ;
0262 w(:,jwc1(:,M_.maximum_lag)) = w(:,jwc1(:,M_.maximum_lag))+c(:,1:ncc1) ;
0263 c = [w(:,ny+1:size(w,2))' c(:,ncc)]/w(:,1:ny) ;
0264
0265 junk = fseek(fid,0,1) ;
0266 fwrite(fid,c,'float64') ;
0267
0268 it_ = it_+1 ;
0269 ic = ic + ny ;
0270
0271 end
0272 end
0273 oo_.y_simul = reshape(oo_.y_simul,ny,options_.periods+M_.maximum_lag+M_.maximum_lead) ;
0274 if ct_ == 1
0275 hbacsup = clock ;
0276 c = bksupk(ny,fid,ncc,icc1) ;
0277 hbacsup = etime(clock,hbacsup) ;
0278 c = reshape(c,ny,options_.periods+M_.maximum_lead)' ;
0279 y(:,1+M_.maximum_lag:(options_.periods+M_.maximum_lead+M_.maximum_lag)) = y(:,1+M_.maximum_lag:(options_.periods+M_.maximum_lead+M_.maximum_lag))+options_.slowc*c' ;
0280 else
0281 hbacsup = clock ;
0282 c = bksupk(ny,fid,ncc,icc1) ;
0283 hbacsup = etime(clock,hbacsup) ;
0284 c = reshape(c,ny,options_.periods)' ;
0285 oo_.y_simul(:,1+M_.maximum_lag:(options_.periods+M_.maximum_lag)) = oo_.y_simul(:,1+M_.maximum_lag:(options_.periods+M_.maximum_lag))+options_.slowc*c' ;
0286 end
0287
0288 fclose(fid) ;
0289
0290 h2 = etime(clock,h2) ;
0291 [junk,i1] = max(abs(c));
0292 [junk,i2] = max(junk);
0293 disp(['variable ' M_.endo_names(i2,:) ' period ' num2str(i1(i2))])
0294 err = max(max(abs(c./options_.scalv'))) ;
0295 disp ([num2str(iter) '- err = ' num2str(err)]) ;
0296 disp (['err_f = ' num2str(err_f)])
0297 disp ([' Time of this iteration : ' num2str(h2)]) ;
0298 if options_.timing
0299 disp ([' Back substitution : ' num2str(hbacsup)]) ;
0300 end
0301 if err < options_.dynatol
0302 h1 = etime(clock,h1) ;
0303 fprintf ('\n') ;
0304 disp ([' Total time of simulation : ' num2str(h1)]) ;
0305 fprintf ('\n') ;
0306 disp ([' Convergence achieved.']) ;
0307 disp (['-----------------------------------------------------']) ;
0308 fprintf ('\n') ;
0309 return ;
0310 end
0311 end
0312 disp(['WARNING : the maximum number of iterations is reached.']) ;
0313 fprintf ('\n') ;
0314 disp (['-----------------------------------------------------']) ;
0315 return ;
0316
0317
0318
0319
0320
0321
0322
0323