From 0391dbbeb1446467e8087cf4f3c80f4edb69d52d Mon Sep 17 00:00:00 2001
From: MichelJuillard <michel.juillard@mjui.fr>
Date: Fri, 4 Sep 2020 14:02:04 +0000
Subject: [PATCH] fix bug with lag on exogenous variables on more than one
 period

(cherry picked from commit 492124ce9886e6aef4f4cefef302241d7edfe024)
---
 matlab/perfect-foresight-models/sim1_linear.m   | 17 ++++++++++++++---
 .../sim1_purely_backward.m                      |  4 ++--
 2 files changed, 16 insertions(+), 5 deletions(-)

diff --git a/matlab/perfect-foresight-models/sim1_linear.m b/matlab/perfect-foresight-models/sim1_linear.m
index 2a68ac0b57..6f63ca1fa1 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 b3d88a7123..689d4f310d 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
-- 
GitLab