Added Stochastic Extended Path method (SEP).

time-shift
Stéphane Adjemian (Charybdis) 2011-12-19 18:04:54 +01:00
parent 7ff36b680b
commit 744f3fd41b
1 changed files with 139 additions and 130 deletions

View File

@ -79,7 +79,7 @@ make_ex_;
make_y_;
% Initialize the output array.
time_series = NaN(M_.endo_nbr,sample_size+1);
time_series = zeros(M_.endo_nbr,sample_size);
% Set the covariance matrix of the structural innovations.
variances = diag(M_.Sigma_e);
@ -106,18 +106,28 @@ if options_.ep.stochastic
[r,w] = gauss_hermite_weights_and_nodes(options_.ep.number_of_nodes);
switch options_.ep.stochastic
case 1
rr = cell(1);
ww = cell(1);
for i=1:size(M_.Sigma_e,1)
rr = {r};
ww = {w};
if M_.exo_nbr>1
rr = cell(1);
ww = cell(1);
for i=1:size(M_.Sigma_e,1)
rr = {r};
ww = {w};
end
rrr = cartesian_product_of_sets(rr{:});
www = cartesian_product_of_sets(ww{:});
else
rrr = r;
www = w;
end
rrr = cartesian_product_of_sets(rr{:});
www = cartesian_product_of_sets(ww{:});
www = prod(www,2);
nnn = length(www);
otherwise
error(['Order ' int2str(options_.ep.stochastic) ' Stochastic Extended Path method is not implemented!'])
end
else
rrr = zeros(1,number_of_structural_innovations);
www = 1;
nnn = 1;
end
% Initializes some variables.
@ -158,140 +168,137 @@ while (t<sample_size)
shocks = oo_.ep.shocks(t,:);
% Put it in oo_.exo_simul (second line).
oo_.exo_simul(2,positive_var_indx) = shocks;
if options_.ep.init && t==1% Compute first order solution.
initial_path = simult_(initial_conditions,oo_.dr,oo_.exo_simul(2:end,:),1);
if options_.ep.init==1
oo_.endo_simul(:,1:end-1) = initial_path(:,1:end-1);% Last column is the steady state.
elseif options_.ep.init==2
oo_.endo_simul(:,1:end-1) = initial_path(:,1:end-1)*lambda+oo_.endo_simul(:,1:end-1)*(1-lambda);
end
end
% Solve a perfect foresight model (using bytecoded version).
increase_periods = 0;
endo_simul = oo_.endo_simul;
while 1
if ~increase_periods
t0 = tic;
[flag,tmp] = bytecode('dynamic');
ctime = toc(t0);
info.convergence = ~flag;
info.time = ctime;
end
if verbosity
if info.convergence
if t<10
disp(['Time: ' int2str(t) '. Convergence of the perfect foresight model solver!'])
elseif t<100
disp(['Time: ' int2str(t) '. Convergence of the perfect foresight model solver!'])
elseif t<1000
disp(['Time: ' int2str(t) '. Convergence of the perfect foresight model solver!'])
else
disp(['Time: ' int2str(t) '. Convergence of the perfect foresight model solver!'])
end
else
if t<10
disp(['Time: ' int2str(t) '. No convergence of the perfect foresight model solver!'])
elseif t<100
disp(['Time: ' int2str(t) '. No convergence of the perfect foresight model solver!'])
elseif t<1000
disp(['Time: ' int2str(t) '. No convergence of the perfect foresight model solver!'])
else
disp(['Time: ' int2str(t) '. No convergence of the perfect foresight model solver!'])
end
for s = 1:nnn
oo_.exo_simul(3,positive_var_indx) = rrr(s,:)*covariance_matrix_upper_cholesky;
if options_.ep.init && s==1% Compute first order solution. t==1 &&
initial_path = simult_(initial_conditions,oo_.dr,oo_.exo_simul(2:end,:),1);
if options_.ep.init==1
oo_.endo_simul(:,1:end-1) = initial_path(:,1:end-1);% Last column is the steady state.
elseif options_.ep.init==2
oo_.endo_simul(:,1:end-1) = initial_path(:,1:end-1)*lambda+oo_.endo_simul(:,1:end-1)*(1-lambda);
end
end
% Test if periods is big enough.
if ~increase_periods && max(max(abs(tmp(idx,end-options_.ep.lp:end)./tmp(idx,end-options_.ep.lp-1:end-1)-1)))<options_.dynatol.x
break
else
options_.periods = options_.periods + options_.ep.step;
options_.minimal_solving_period = options_.periods;
increase_periods = increase_periods + 1;
if verbosity
if t<10
disp(['Time: ' int2str(t) '. I increase the number of periods to ' int2str(options_.periods) '.'])
elseif t<100
disp(['Time: ' int2str(t) '. I increase the number of periods to ' int2str(options_.periods) '.'])
elseif t<1000
disp(['Time: ' int2str(t) '. I increase the number of periods to ' int2str(options_.periods) '.'])
else
disp(['Time: ' int2str(t) '. I increase the number of periods to ' int2str(options_.periods) '.'])
end
end
if info.convergence
oo_.endo_simul = [ tmp , repmat(oo_.steady_state,1,options_.ep.step) ];
oo_.exo_simul = [ oo_.exo_simul ; zeros(options_.ep.step,size(shocks,2)) ];
tmp_old = tmp;
else
oo_.endo_simul = [ oo_.endo_simul , repmat(oo_.steady_state,1,options_.ep.step) ];
oo_.exo_simul = [ oo_.exo_simul ; zeros(options_.ep.step,size(shocks,2)) ];
end
t0 = tic;
[flag,tmp] = bytecode('dynamic');
ctime = toc(t0);
info.time = info.time+ctime;
if info.convergence
maxdiff = max(max(abs(tmp(:,2:options_.ep.fp)-tmp_old(:,2:options_.ep.fp))));
if maxdiff<options_.dynatol.x
options_.periods = options_.ep.periods;
options_.minimal_solving_period = options_.periods;
oo_.exo_simul = oo_.exo_simul(1:(options_.periods+2),:);
break
end
else
% Solve a perfect foresight model (using bytecoded version).
increase_periods = 0;
endo_simul = oo_.endo_simul;
while 1
if ~increase_periods
t0 = tic;
[flag,tmp] = bytecode('dynamic');
ctime = toc(t0);
info.convergence = ~flag;
info.time = ctime;
end
if verbosity
if info.convergence
continue
if t<10
disp(['Time: ' int2str(t) '. Convergence of the perfect foresight model solver!'])
elseif t<100
disp(['Time: ' int2str(t) '. Convergence of the perfect foresight model solver!'])
elseif t<1000
disp(['Time: ' int2str(t) '. Convergence of the perfect foresight model solver!'])
else
disp(['Time: ' int2str(t) '. Convergence of the perfect foresight model solver!'])
end
else
if increase_periods==10;
if verbosity
if t<10
disp(['Time: ' int2str(t) '. Even with ' int2str(options_.periods) ', I am not able to solve the perfect foresight model. Use homotopy instead...'])
elseif t<100
disp(['Time: ' int2str(t) '. Even with ' int2str(options_.periods) ', I am not able to solve the perfect foresight model. Use homotopy instead...'])
elseif t<1000
disp(['Time: ' int2str(t) '. Even with ' int2str(options_.periods) ', I am not able to solve the perfect foresight model. Use homotopy instead...'])
else
disp(['Time: ' int2str(t) '. Even with ' int2str(options_.periods) ', I am not able to solve the perfect foresight model. Use homotopy instead...'])
end
end
if t<10
disp(['Time: ' int2str(t) '. No convergence of the perfect foresight model solver!'])
elseif t<100
disp(['Time: ' int2str(t) '. No convergence of the perfect foresight model solver!'])
elseif t<1000
disp(['Time: ' int2str(t) '. No convergence of the perfect foresight model solver!'])
else
disp(['Time: ' int2str(t) '. No convergence of the perfect foresight model solver!'])
end
end
end
% Test if periods is big enough.
if ~increase_periods && max(max(abs(tmp(idx,end-options_.ep.lp:end)./tmp(idx,end-options_.ep.lp-1:end-1)-1)))<options_.dynatol.x
break
else
options_.periods = options_.periods + options_.ep.step;
options_.minimal_solving_period = options_.periods;
increase_periods = increase_periods + 1;
if verbosity
if t<10
disp(['Time: ' int2str(t) '. I increase the number of periods to ' int2str(options_.periods) '.'])
elseif t<100
disp(['Time: ' int2str(t) '. I increase the number of periods to ' int2str(options_.periods) '.'])
elseif t<1000
disp(['Time: ' int2str(t) '. I increase the number of periods to ' int2str(options_.periods) '.'])
else
disp(['Time: ' int2str(t) '. I increase the number of periods to ' int2str(options_.periods) '.'])
end
end
if info.convergence
oo_.endo_simul = [ tmp , repmat(oo_.steady_state,1,options_.ep.step) ];
oo_.exo_simul = [ oo_.exo_simul ; zeros(options_.ep.step,size(shocks,2)) ];
tmp_old = tmp;
else
oo_.endo_simul = [ oo_.endo_simul , repmat(oo_.steady_state,1,options_.ep.step) ];
oo_.exo_simul = [ oo_.exo_simul ; zeros(options_.ep.step,size(shocks,2)) ];
end
t0 = tic;
[flag,tmp] = bytecode('dynamic');
ctime = toc(t0);
info.time = info.time+ctime;
if info.convergence
maxdiff = max(max(abs(tmp(:,2:options_.ep.fp)-tmp_old(:,2:options_.ep.fp))));
if maxdiff<options_.dynatol.x
options_.periods = options_.ep.periods;
options_.minimal_solving_period = options_.periods;
oo_.exo_simul = oo_.exo_simul(1:(options_.periods+2),:);
break
end
else
info.convergence = ~flag;
if info.convergence
continue
else
if increase_periods==10;
if verbosity
if t<10
disp(['Time: ' int2str(t) '. Even with ' int2str(options_.periods) ', I am not able to solve the perfect foresight model. Use homotopy instead...'])
elseif t<100
disp(['Time: ' int2str(t) '. Even with ' int2str(options_.periods) ', I am not able to solve the perfect foresight model. Use homotopy instead...'])
elseif t<1000
disp(['Time: ' int2str(t) '. Even with ' int2str(options_.periods) ', I am not able to solve the perfect foresight model. Use homotopy instead...'])
else
disp(['Time: ' int2str(t) '. Even with ' int2str(options_.periods) ', I am not able to solve the perfect foresight model. Use homotopy instead...'])
end
end
break
end
end
end
end
end
end
if ~info.convergence% If the previous step was unsuccesfull, use an homotopic approach
[INFO,tmp] = homotopic_steps(.5,.01,t);
% Cumulate time.
info.time = ctime+INFO.time;
if (~isstruct(INFO) && isnan(INFO)) || ~INFO.convergence
disp('Homotopy:: No convergence of the perfect foresight model solver!')
error('I am not able to simulate this model!');
else
info.convergence = 1;
oo_.endo_simul = tmp;
if verbosity && info.convergence
disp('Homotopy:: Convergence of the perfect foresight model solver!')
if ~info.convergence% If the previous step was unsuccesfull, use an homotopic approach
[INFO,tmp] = homotopic_steps(.5,.01,t);
% Cumulate time.
info.time = ctime+INFO.time;
if (~isstruct(INFO) && isnan(INFO)) || ~INFO.convergence
disp('Homotopy:: No convergence of the perfect foresight model solver!')
error('I am not able to simulate this model!');
else
info.convergence = 1;
oo_.endo_simul = tmp;
if verbosity && info.convergence
disp('Homotopy:: Convergence of the perfect foresight model solver!')
end
end
else
oo_.endo_simul = tmp;
end
else
oo_.endo_simul = tmp;
% Save results of the perfect foresight model solver.
time_series(:,t) = time_series(:,t)+ www(s)*oo_.endo_simul(:,2);
%save('simulated_paths.mat','time_series');
% Set initial condition for the nex round.
%initial_conditions = oo_.endo_simul(:,2);
end
if nargin==6
zlb_periods = find(oo_.endo_simul(zlb_idx,:)<=1+1e-12);
zlb_number_of_periods = length(zlb_periods);
if zlb_number_of_periods
count_zlb = [count_zlb ; [t, zlb_number_of_periods, zlb_periods(1) , zlb_periods(end)] ];
end
end
% Save results of the perfect foresight model solver.
time_series(:,t) = oo_.endo_simul(:,2);
save('simulated_paths.mat','time_series');
% Set initial condition for the nex round.
%initial_conditions = oo_.endo_simul(:,2);
oo_.endo_simul = oo_.endo_simul(:,1:options_.periods+2);
oo_.endo_simul(:,1:end-1) = oo_.endo_simul(:,2:end);
%oo_.endo_simul = oo_.endo_simul(:,1:options_.periods+M_.maximum_endo_lag+M_.maximum_endo_lead);
oo_.endo_simul(:,1:end-1) = oo_.endo_simul(:,2:end);
oo_.endo_simul(:,1) = time_series(:,t);
oo_.endo_simul(:,end) = oo_.steady_state;
end
@ -301,4 +308,6 @@ else
if ~exist('OCTAVE_VERSION')
fprintf(back);
end
end
end
oo_.endo_simul = oo_.steady_state;