diff --git a/matlab/perfect-foresight-models/sim1_linear.m b/matlab/perfect-foresight-models/sim1_linear.m index 2a68ac0b5..6f63ca1fa 100644 --- a/matlab/perfect-foresight-models/sim1_linear.m +++ b/matlab/perfect-foresight-models/sim1_linear.m @@ -120,9 +120,13 @@ if max(abs(d1))>options.solve_tolf error('Jacobian is not evaluated at the steady state!') end +% current variables [r0,c0,v0] = find(jacobian(:,jc)); +% current and predetermined [rT,cT,vT] = find(jacobian(:,jpc)); +% current and jump variables [r1,c1,v1] = find(jacobian(:,jcn)); +% all endogenous variables [rr,cc,vv] = find(jacobian(:,jendo)); iv0 = 1:length(v0); @@ -155,9 +159,16 @@ for it = (maximum_lag+1):(maximum_lag+periods) nv = length(vv); iA(iv+m,:) = [i_rows(rr),i_cols_A(cc),vv]; end - z(jendo) = Y(i_cols); - z(jexog) = transpose(exogenousvariables(it,:)); - res(i_rows) = jacobian*z; + if M.maximum_exo_lag > 0 + % needed as jacobian for lagged exogenous variables is wrong + % in current version of Dynare + zz = Y(i_cols); + res(i_rows) = dynamicmodel(zz, exogenousvariables, params, steadystate_y, it); + else + z(jendo) = Y(i_cols); + z(jexog) = transpose(exogenousvariables(it,:)); + res(i_rows) = jacobian*z; + end m = m + nv; i_rows = i_rows + ny; i_cols = i_cols + ny; diff --git a/matlab/perfect-foresight-models/sim1_purely_backward.m b/matlab/perfect-foresight-models/sim1_purely_backward.m index b3d88a712..689d4f310 100644 --- a/matlab/perfect-foresight-models/sim1_purely_backward.m +++ b/matlab/perfect-foresight-models/sim1_purely_backward.m @@ -38,13 +38,13 @@ dynamicmodel = str2func([M.fname,'.dynamic']); info.status = 1; -for it = 2:options.periods+1 +for it = M.maximum_lag + (1:options.periods) yb = endogenousvariables(:,it-1); % Values at previous period, also used as guess value for current period yb1 = yb(iyb); [tmp, check] = solve1(dynamicmodel, [yb1; yb], 1:M.endo_nbr, nyb+1:nyb+M.endo_nbr, ... 1, options.gstep, options.dynatol.f, options.dynatol.x, ... options.simul.maxit, options.debug, exogenousvariables, ... - M.params, steadystate, it+M.maximum_lag-1); + M.params, steadystate, it); if check info.status = 0; end