diff --git a/matlab/stochastic_solver/dyn_second_order_solver.m b/matlab/stochastic_solver/dyn_second_order_solver.m index 18c62f6f50ac41bd50f7cb78b5d87bd92a8f4f64..b80d2ceec3016c08656579799283608bee8c84fc 100644 --- a/matlab/stochastic_solver/dyn_second_order_solver.m +++ b/matlab/stochastic_solver/dyn_second_order_solver.m @@ -58,34 +58,36 @@ dr.ghuu = []; dr.ghxu = []; dr.ghs2 = []; -[~,cols_b] = find(M_.lead_lag_incidence(2, dr.order_var)); -icurr = M_.endo_nbr + dr.order_var(cols_b); -ilead = 2*M_.endo_nbr + dr.order_var(M_.nstatic+M_.npred+(1:M_.nsfwrd)); +% Indices in the DR-reordered variables +klag = M_.nstatic+(1:M_.nspred); +[~, kcurr] = find(M_.lead_lag_incidence(2, dr.order_var)); +klead = M_.nstatic+M_.npred+(1:M_.nsfwrd); -kk1 = [dr.order_var(M_.nstatic+(1:M_.nspred)); icurr; ilead; +% Indices in the g1 columns that map to DR-order +ilag = dr.order_var(klag); +icurr = M_.endo_nbr + dr.order_var(kcurr); +ilead = 2*M_.endo_nbr + dr.order_var(klead); + +kk1 = [ilag; icurr; ilead; 3*M_.endo_nbr+(1:M_.exo_nbr+M_.exo_det_nbr)']; nk = size(g1, 2); kk2 = reshape(1:nk^2,nk,nk); -ic = [ M_.nstatic+(1:M_.nspred) ]'; -kcurr = M_.lead_lag_incidence(2,dr.order_var); %columns are in DR order -klead = M_.lead_lag_incidence(3,dr.order_var); %columns are in DR order - %% ghxx A = zeros(M_.endo_nbr,M_.endo_nbr); -A(:,kcurr~=0) = g1(:, icurr); -A(:,ic) = A(:,ic) + g1(:, ilead)*dr.ghx(klead~=0,:); +A(:,kcurr) = g1(:,icurr); +A(:,klag) = A(:,klag) + g1(:,ilead)*dr.ghx(klead,:); B = zeros(M_.endo_nbr,M_.endo_nbr); B(:,M_.nstatic+M_.npred+1:end) = g1(:, ilead); -C = dr.ghx(ic,:); -zx = [eye(length(ic)); - dr.ghx(kcurr~=0,:); - dr.ghx(klead~=0,:)*dr.ghx(ic,:); - zeros(M_.exo_nbr,length(ic)); - zeros(M_.exo_det_nbr,length(ic))]; -zu = [zeros(length(ic),M_.exo_nbr); - dr.ghu(kcurr~=0,:); - dr.ghx(klead~=0,:)*dr.ghu(ic,:); +C = dr.ghx(klag,:); +zx = [eye(M_.nspred); + dr.ghx(kcurr,:); + dr.ghx(klead,:)*dr.ghx(klag,:); + zeros(M_.exo_nbr,M_.nspred); + zeros(M_.exo_det_nbr,M_.nspred)]; +zu = [zeros(M_.nspred,M_.exo_nbr); + dr.ghu(kcurr,:); + dr.ghx(klead,:)*dr.ghu(klag,:); eye(M_.exo_nbr); zeros(M_.exo_det_nbr,M_.exo_nbr)]; rhs = sparse_hessian_times_B_kronecker_C(g2(:,kk2(kk1,kk1)), zx, threads_BC); % g2: reordering to DR order @@ -96,7 +98,7 @@ dr.ghxx = gensylv(2,A,B,C,rhs); %% ghxu %rhs rhs = sparse_hessian_times_B_kronecker_C(g2(:,kk2(kk1,kk1)), zx, zu, threads_BC); % g2: reordering to DR order -abcOut = A_times_B_kronecker_C(dr.ghxx, dr.ghx(ic,:), dr.ghu(ic,:)); +abcOut = A_times_B_kronecker_C(dr.ghxx, dr.ghx(klag,:), dr.ghu(klag,:)); rhs = -rhs-B*abcOut; %lhs dr.ghxu = A\rhs; @@ -104,7 +106,7 @@ dr.ghxu = A\rhs; %% ghuu %rhs rhs = sparse_hessian_times_B_kronecker_C(g2(:,kk2(kk1,kk1)), zu, threads_BC); % g2: reordering to DR order -B1 = A_times_B_kronecker_C(B*dr.ghxx,dr.ghu(ic,:)); +B1 = A_times_B_kronecker_C(B*dr.ghxx,dr.ghu(klag,:)); rhs = -rhs-B1; %lhs dr.ghuu = A\rhs; @@ -114,13 +116,13 @@ dr.ghuu = A\rhs; O1 = zeros(M_.endo_nbr,M_.nstatic); O2 = zeros(M_.endo_nbr,M_.nfwrd); LHS = zeros(M_.endo_nbr,M_.endo_nbr); -LHS(:,kcurr~=0) = g1(:, icurr); +LHS(:,kcurr) = g1(:,icurr); RHS = zeros(M_.endo_nbr,M_.exo_nbr^2); E = eye(M_.endo_nbr); -B1 = sparse_hessian_times_B_kronecker_C(g2(:,kk2(ilead,ilead)), dr.ghu(klead~=0,:), threads_BC); % g2: focus only on forward variables and reorder to DR order -RHS = RHS + g1(:, ilead)*dr.ghuu(klead~=0,:)+B1; +B1 = sparse_hessian_times_B_kronecker_C(g2(:,kk2(ilead,ilead)), dr.ghu(klead,:), threads_BC); % g2: focus only on forward variables and reorder to DR order +RHS = RHS + g1(:,ilead)*dr.ghuu(klead,:)+B1; % LHS -LHS = LHS + g1(:, ilead)*(E(klead~=0,:)+[O1(klead~=0,:) dr.ghx(klead~=0,:) O2(klead~=0,:)]); +LHS = LHS + g1(:,ilead)*(E(klead,:)+[O1(klead,:) dr.ghx(klead,:) O2(klead,:)]); RHS = RHS*M_.Sigma_e(:); dr.fuu = RHS; RHS = -RHS;