0001
0002
0003 function sim1
0004
0005 global M_ options_ oo_
0006 global iyp iyf ct_ M_ it_ c
0007
0008 lead_lag_incidence = M_.lead_lag_incidence;
0009
0010 ny = size(oo_.y_simul,1) ;
0011 nyp = nnz(lead_lag_incidence(1,:)) ;
0012 nyf = nnz(lead_lag_incidence(3,:)) ;
0013 nrs = ny+nyp+nyf+1 ;
0014 nrc = nyf+1 ;
0015 iyf = find(lead_lag_incidence(3,:)>0) ;
0016 iyp = find(lead_lag_incidence(1,:)>0) ;
0017 isp = [1:nyp] ;
0018 is = [nyp+1:ny+nyp] ;
0019 isf = iyf+nyp ;
0020 isf1 = [nyp+ny+1:nyf+nyp+ny+1] ;
0021 stop = 0 ;
0022 iz = [1:ny+nyp+nyf];
0023
0024 disp (['-----------------------------------------------------']) ;
0025 disp (['MODEL SIMULATION :']) ;
0026 fprintf('\n') ;
0027
0028 it_init = 2 ;
0029
0030 h1 = clock ;
0031 for iter = 1:options_.maxit
0032 h2 = clock ;
0033
0034 if ct_ == 0
0035 c = zeros(ny*options_.periods,nrc) ;
0036 else
0037 c = zeros(ny*(options_.periods+1),nrc) ;
0038 end
0039
0040 it_ = it_init ;
0041 z = [oo_.y_simul(iyp,it_-1) ; oo_.y_simul(:,it_) ; oo_.y_simul(iyf,it_+1)] ;
0042 [d1,M_.jacobia] = feval([M_.fname '_dynamic'],z,oo_.exo_simul);
0043 M_.jacobia = [M_.jacobia(:,iz) -d1] ;
0044 ic = [1:ny] ;
0045 icp = iyp ;
0046 c (ic,:) = M_.jacobia(:,is)\M_.jacobia(:,isf1) ;
0047 for it_ = it_init+1:options_.periods+1
0048 z = [oo_.y_simul(iyp,it_-1) ; oo_.y_simul(:,it_) ; oo_.y_simul(iyf,it_+1)] ;
0049 [d1,M_.jacobia] = feval([M_.fname '_dynamic'],z,oo_.exo_simul);
0050 M_.jacobia = [M_.jacobia(:,iz) -d1] ;
0051 M_.jacobia(:,[isf nrs]) = M_.jacobia(:,[isf nrs])-M_.jacobia(:,isp)*c(icp,:) ;
0052 ic = ic + ny ;
0053 icp = icp + ny ;
0054 c (ic,:) = M_.jacobia(:,is)\M_.jacobia(:,isf1) ;
0055 end
0056
0057 if ct_ == 1
0058 s = eye(ny) ;
0059 s(:,isf) = s(:,isf)+c(ic,1:nyf) ;
0060 ic = ic + ny ;
0061 c(ic,nrc) = s\c(:,nrc) ;
0062 c = bksup1(ny,nrc) ;
0063 c = reshape(c,ny,options_.periods+1) ;
0064 oo_.y_simul(:,it_init:options_.periods+2) = oo_.y_simul(:,it_init:options_.periods+2)+options_.slowc*c ;
0065 else
0066 c = bksup1(ny,nrc) ;
0067 c = reshape(c,ny,options_.periods) ;
0068 oo_.y_simul(:,it_init:options_.periods+1) = oo_.y_simul(:,it_init:options_.periods+1)+options_.slowc*c ;
0069 end
0070
0071 err = max(max(abs(c./options_.scalv')));
0072 disp([num2str(iter) ' - err = ' num2str(err)]) ;
0073 disp([' Time of iteration :' num2str(etime(clock,h2))]) ;
0074
0075 if err < options_.dynatol
0076 stop = 1 ;
0077 fprintf('\n') ;
0078 disp([' Total time of simulation :' num2str(etime(clock,h1))]) ;
0079 fprintf('\n') ;
0080 disp([' Convergency obtained.']) ;
0081 fprintf('\n') ;
0082 break
0083 end
0084 end
0085
0086 if ~ stop
0087 fprintf('\n') ;
0088 disp([' Total time of simulation :' num2str(etime(clock,h1))]) ;
0089 fprintf('\n') ;
0090 disp(['WARNING : maximum number of iterations is reached (modify options_.maxit).']) ;
0091 fprintf('\n') ;
0092 end
0093 disp (['-----------------------------------------------------']) ;
0094 return ;
0095
0096