dynare/matlab/resol1.m

69 lines
1.9 KiB
Matlab

% Copyright (C) 2001 Michel Juillard
%
function dr=resol1(ys,algo,linear,iorder)
global M_ options_ oo_ bayestopt_
global it_ means_ stderrs_ dr1_test_
dr1_test_ = zeros(2,1);
if linear == 1
iorder =1;
end
xlen = M_.maximum_lead + M_.maximum_lag + 1;
klen = M_.maximum_lag + M_.maximum_lead + 1;
iyv = M_.lead_lag_incidence';
iyv = iyv(:);
iyr0 = find(iyv) ;
it_ = M_.maximum_lag + 1 ;
if M_.exo_nbr == 0
oo_.exo_steady_state = [] ;
end
if ~ M_.lead_lag_incidence(M_.maximum_lag+1,:) > 0
error ('RESOL: Error in model specification: some variables don"t appear as current') ;
end
%if xlen > 1
% error (['RESOL: stochastic exogenous variables must appear only at the' ...
% ' current period. Use additional endogenous variables']) ;
%end
% check if ys is steady state
tempex = oo_.exo_simul;
oo_.exo_simul = repmat(transpose(oo_.exo_steady_state), M_.maximum_lag + ...
M_.maximum_lead+1,1);
fh = str2func([M_.fname '_static']);
if max(abs(feval(fh,ys,oo_.exo_simul))) > options_.dynatol
% dirty trick to call either user function or dynare_solve
[dr.ys, cheik] = feval(bayestopt_.static_solve,[M_.fname '_static'],ys,oo_.exo_simul);
if cheik
dr1_test_(1) = 1; % dynare_solve did not converge to the steady state.
resid = feval([M_.fname '_static'],dr.ys,oo_.exo_simul);
dr1_test_(2) = resid'*resid; % penalty...
disp('dynare_solve is unable to find the steady state.')
return
end
else
dr.ys = ys;
end
dr.fbias = zeros(M_.endo_nbr,1);
dr = dr11(iorder,dr,0);
if algo == 1 & iorder > 1
dr.ys = dynare_solve('dr2',ys,dr);
dr.fbias = 2*feval([M_.fname '_static'],dr.ys,oo_.exo_simul);
dr = dr11(iorder,dr,0);
end
oo_.exo_simul = tempex;
tempex = [];
% 01/01/2003 MJ added dr_algo == 1
% 08/24/2001 MJ uses Schmitt-Grohe and Uribe (2001) constant correction
% in dr.ghs2
% 05/26/2003 MJ added temporary values for oo_.exo_simul
% 01/22/2005 SA check --> cheik (to avoid confusion with the function check.m)