Home > . > simk.m

simk

PURPOSE ^

Copyright (C) 2001 Michel Juillard

SYNOPSIS ^

function simk

DESCRIPTION ^

 Copyright (C) 2001 Michel Juillard

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 % Copyright (C) 2001 Michel Juillard
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) ;            % indices of variables at each lead or lag
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,:)') ; % indices of columns for
0038                                 % triangularization
0039                 % as many rows as lags in model
0040 
0041 if isempty(jwc)
0042   jwc = 0 ;
0043   ljwc = 0 ;
0044   temp = icc1 ;
0045 else
0046   ljwc = size(jwc,1) ;          % length of each row in jwc
0047   temp = union(jwc,icc1) ;      % prepares next iteration
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       %d1_ = -feval(fh,oo_.y_simul(iyr));
0112       d1 = -feval([M_.fname '_dynamic'],oo_.y_simul(iyr),z,oo_.exo_simul);
0113     else
0114       %jacob(func_name,oo_.y_simul(iyr)) ;
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 %      else
0181 %        jwci = [] ;
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       %d1_ = -feval(fh,oo_.y_simul(iyr));
0205        d1 = -feval([M_.fname '_dynamic'],oo_.y_simul(iyr),z,oo_.exo_simul);
0206     else
0207       %jacob(func_name,oo_.y_simul(iyr)) ;
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 % 2/11/99 MJ took out reshapel
0318 
0319 
0320 
0321 
0322 
0323

Generated on Fri 16-Jun-2006 09:09:06 by m2html © 2003