From f4dc2ee74388cec4d0d423ca8c191434a87a81c9 Mon Sep 17 00:00:00 2001 From: Willi Mutschler Date: Fri, 14 Feb 2020 13:56:36 +0100 Subject: [PATCH 1/2] :bug: Fix wrong third-order computation in pruned state space system Related to #1706 :white_check_mark: Add unit test for pruned state space up to order 3 // Changed tolerance in new test --- matlab/Q6_plication.m | 65 +- matlab/bivmom.m | 33 +- matlab/commutation.m | 19 +- matlab/get_identification_jacobians.m | 180 +- matlab/get_perturbation_params_derivs.m | 11 + matlab/identification_analysis.m | 5 +- matlab/identification_numerical_objective.m | 71 +- matlab/prodmom_deriv.m | 156 +- matlab/pruned_state_space_system.m | 1834 ++++++++++------- matlab/quadruplication.m | 77 +- matlab/uperm.m | 1 + tests/.gitignore | 1 + tests/Makefile.am | 6 + .../AnSchorfheide_pruned_state_space.mod | 193 ++ ...ndreasen_et_al_2018_Dynare44Pruning_v2.mat | Bin 0 -> 2982862 bytes 15 files changed, 1656 insertions(+), 996 deletions(-) create mode 100644 tests/pruning/AnSchorfheide_pruned_state_space.mod create mode 100644 tests/pruning/Andreasen_et_al_2018_Dynare44Pruning_v2.mat diff --git a/matlab/Q6_plication.m b/matlab/Q6_plication.m index c08e861f3..0692364f1 100644 --- a/matlab/Q6_plication.m +++ b/matlab/Q6_plication.m @@ -1,33 +1,54 @@ -% By Willi Mutschler, September 26, 2016. Email: willi@mutschler.eu -% Quadruplication Matrix as defined by -% Meijer (2005) - Matrix algebra for higher order moments. Linear Algebra and its Applications, 410,pp. 112–134 +function [DP6,DP6inv] = Q6_plication(p) +% Computes the 6-way duplication Matrix DP6 (and its Moore-Penrose inverse) +% such that for any p-dimensional vector x: +% y=kron(kron(kron(kron(kron(x,x),x,x),x),x)=DP6*z +% where z is of dimension np=p*(p+1)*(p+2)*(p+3)*(p+4)*(p+5)/(1*2*3*4*5*6) +% and is obtained from y by removing each second and later occurence of the +% same element. This is a generalization of the Duplication matrix. +% Reference: Meijer (2005) - Matrix algebra for higher order moments. +% Linear Algebra and its Applications, 410,pp. 112-134 +% ========================================================================= +% INPUTS +% * p [integer] size of vector +% ------------------------------------------------------------------------- +% OUTPUTS +% * DP6 [p^6 by np] 6-way duplication matrix +% * DP6inv [np by np] Moore-Penrose inverse of DP6 +% ------------------------------------------------------------------------- +% This function is called by +% * pruned_state_space_system.m +% ------------------------------------------------------------------------- +% This function calls +% * binom_coef (embedded) +% * mue (embedded) +% * uperm +% ========================================================================= +% Copyright (C) 2020 Dynare Team % -% Inputs: -% p: size of vector -% Outputs: -% QP: quadruplication matrix -% QPinv: Moore-Penrose inverse of QP +% This file is part of Dynare. % - -function [DP6,DP6inv] = Q6_plication(p,progress) -if nargin <2 - progress =0; -end -reverseStr = ''; counti=1; +% Dynare is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% Dynare is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with Dynare. If not, see . +% ========================================================================= np = p*(p+1)*(p+2)*(p+3)*(p+4)*(p+5)/(1*2*3*4*5*6); -DP6 = spalloc(p^6,p*(p+1)*(p+2)*(p+3)*(p+4)*(p+5)/(1*2*3*4*5*6),p^6); - +DP6 = spalloc(p^6,np,p^6); +counti=1; for i1=1:p for i2=i1:p for i3=i2:p for i4=i3:p for i5=i4:p for i6=i5:p - if progress && (rem(counti,100)== 0) - msg = sprintf(' Q6-plication Matrix Processed %d/%d', counti, np); fprintf([reverseStr, msg]); reverseStr = repmat(sprintf('\b'), 1, length(msg)); - elseif progress && (counti==np) - msg = sprintf(' Q6-plication Matrix Processed %d/%d\n', counti, np); fprintf([reverseStr, msg]); reverseStr = repmat(sprintf('\b'), 1, length(msg)); - end idx = uperm([i6 i5 i4 i3 i2 i1]); for r = 1:size(idx,1) ii1 = idx(r,1); ii2= idx(r,2); ii3=idx(r,3); ii4=idx(r,4); ii5=idx(r,5); ii6=idx(r,6); @@ -45,11 +66,13 @@ end DP6inv = (transpose(DP6)*DP6)\transpose(DP6); function m = mue(p,i1,i2,i3,i4,i5,i6) +% Auxiliary expression, see page 122 of Meijer (2005) m = binom_coef(p,6,1) - binom_coef(p,1,i1+1) - binom_coef(p,2,i2+1) - binom_coef(p,3,i3+1) - binom_coef(p,4,i4+1) - binom_coef(p,5,i5+1) - binom_coef(p,6,i6+1); m = round(m); end function N = binom_coef(p,q,i) +% Auxiliary expression for binomial coefficients, see page 119 of Meijer (2005) t = q; r =p+q-i; if t==0 N=1; diff --git a/matlab/bivmom.m b/matlab/bivmom.m index f759a7f9d..f850fe1c2 100644 --- a/matlab/bivmom.m +++ b/matlab/bivmom.m @@ -1,19 +1,27 @@ -% -% bivmom.m Date: 1/11/2004 -% This Matlab program computes the product moment of X_1^{p_1}X_2^{p_2}, -% where X_1 and X_2 are standard bivariate normally distributed. +function [y,dy] = bivmom(p,rho) +% Computes the product moment (and its derivative with respect to standard +% errors and correlation parameters) of X_1^{p_1}X_2^{p_2}, where X_1 and X_2 +% are standard bivariate normally distributed. % n : dimension of X % rho: correlation coefficient between X_1 and X_2 -% Reference: Kotz, Balakrishnan, and Johnson (2000), Continuous Multivariate -% Distributions, Vol. 1, p.261 -% Note that there is a typo in Eq.(46.25), there should be an extra rho in front -% of the equation. -% Usage: bivmom(p,rho) -% -% Retrieved from http://www-2.rotman.utoronto.ca/~kan/papers/prodmom.zip -% This function is part of replication codes of the following paper: +% ========================================================================= +% INPUTS +% p [2 by 1] powers of X_{1} and X_{2} +% rho [1 by 1] correlation coefficient between X_1 and X_2 +% ------------------------------------------------------------------------- +% OUTPUTS +% y [1 by 1] product moment E[X_1^{p_1}X_2^{p_2}] +% dy [1 by 1] derivative of y wrt to rho +% ------------------------------------------------------------------------- +% This function is based upon bivmom.m which is part of replication codes +% of the following paper: % Kan, R.: "From moments of sum to moments of product." Journal of % Multivariate Analysis, 2008, vol. 99, issue 3, pages 542-554. +% bivmom.m can be retrieved from http://www-2.rotman.utoronto.ca/~kan/papers/prodmom.zip +% Further references: +% Kotz, Balakrishnan, and Johnson (2000), Continuous Multivariate Distributions, Vol. 1, p.261 +% Note that there is a typo in Eq.(46.25), there should be an extra rho in front +% of the equation. % ========================================================================= % Copyright (C) 2008-2015 Raymond Kan % Copyright (C) 2019-2020 Dynare Team @@ -33,7 +41,6 @@ % You should have received a copy of the GNU General Public License % along with Dynare. If not, see . % ========================================================================= -function [y,dy] = bivmom(p,rho) s1 = p(1); s2 = p(2); rho2 = rho^2; diff --git a/matlab/commutation.m b/matlab/commutation.m index c03bf9a0e..a87017e9b 100644 --- a/matlab/commutation.m +++ b/matlab/commutation.m @@ -15,12 +15,13 @@ function k = commutation(n, m, sparseflag) % This function is called by % * get_perturbation_params_derivs.m (previously getH.m) % * get_identification_jacobians.m (previously getJJ.m) +% * pruned_state_space_system.m % ------------------------------------------------------------------------- % This function calls % * vec (embedded) % ========================================================================= % Copyright (C) 1997 Tom Minka -% Copyright (C) 2019 Dynare Team +% Copyright (C) 2019-2020 Dynare Team % % This file is part of Dynare. % @@ -47,24 +48,12 @@ if nargin < 3 sparseflag = 0; end -if 0 - % first method - i = 1:(n*m); - a = reshape(i, n, m); - j = vec(transpose(a)); - k = zeros(n*m,n*m); - for r = i - k(r, j(r)) = 1; - end +if sparseflag + k = reshape(kron(vec(speye(n)), speye(m)), n*m, n*m); else - % second method k = reshape(kron(vec(eye(n)), eye(m)), n*m, n*m); end -if sparseflag ~= 0 - k = sparse(k); -end - function V = vec(A) V = A(:); end diff --git a/matlab/get_identification_jacobians.m b/matlab/get_identification_jacobians.m index 0620b7f48..7e7443bfd 100644 --- a/matlab/get_identification_jacobians.m +++ b/matlab/get_identification_jacobians.m @@ -1,4 +1,4 @@ -function [MEAN, dMEAN, REDUCEDFORM, dREDUCEDFORM, DYNAMIC, dDYNAMIC, MOMENTS, dMOMENTS, dSPECTRUM, dMINIMAL, derivatives_info] = get_identification_jacobians(estim_params, M, oo, options, options_ident, indpmodel, indpstderr, indpcorr, indvobs) +function [MEAN, dMEAN, REDUCEDFORM, dREDUCEDFORM, DYNAMIC, dDYNAMIC, MOMENTS, dMOMENTS, dSPECTRUM, dSPECTRUM_NO_MEAN, dMINIMAL, derivatives_info] = get_identification_jacobians(estim_params, M, oo, options, options_ident, indpmodel, indpstderr, indpcorr, indvobs) % function [MEAN, dMEAN, REDUCEDFORM, dREDUCEDFORM, DYNAMIC, dDYNAMIC, MOMENTS, dMOMENTS, dSPECTRUM, dMINIMAL, derivatives_info] = get_identification_jacobians(estim_params, M, oo, options, options_ident, indpmodel, indpstderr, indpcorr, indvobs) % previously getJJ.m in Dynare 4.5 % Sets up the Jacobians needed for identification analysis @@ -54,7 +54,14 @@ function [MEAN, dMEAN, REDUCEDFORM, dREDUCEDFORM, DYNAMIC, dDYNAMIC, MOMENTS, dM % * order==1: corresponds to Iskrev (2010)'s J matrix % * order==2: corresponds to Mutschler (2015)'s \bar{M}_2 matrix, i.e. theoretical moments from the pruned state space system % -% dSPECTRUM: [totparam_nbr by totparam_nbr] in DR order. Gram matrix of Jacobian (wrt all params) of spectral density for VAROBS variables, where +% dSPECTRUM: [totparam_nbr by totparam_nbr] in DR order. Gram matrix of Jacobian (wrt all params) of mean and of spectral density for VAROBS variables, where +% spectral density at frequency w: f(w) = (2*pi)^(-1)*H(exp(-i*w))*E[Inov*Inov']*ctranspose(H(exp(-i*w)) with H being the Transfer function +% dSPECTRUM = dMEAN*dMEAN + int_{-\pi}^\pi transpose(df(w)/dp')*(df(w)/dp') dw +% * order==1: corresponds to Qu and Tkachenko (2012)'s G matrix, where Inov and H are computed from linear state space system +% * order==2: corresponds to Mutschler (2015)'s G_2 matrix, where Inov and H are computed from second-order pruned state space system +% * order==3: Inov and H are computed from third-order pruned state space system +% +% dSPECTRUM_NO_MEAN:[totparam_nbr by totparam_nbr] in DR order. Gram matrix of Jacobian (wrt all params) of spectral density for VAROBS variables, where % spectral density at frequency w: f(w) = (2*pi)^(-1)*H(exp(-i*w))*E[Inov*Inov']*ctranspose(H(exp(-i*w)) with H being the Transfer function % dSPECTRUM = int_{-\pi}^\pi transpose(df(w)/dp')*(df(w)/dp') dw % * order==1: corresponds to Qu and Tkachenko (2012)'s G matrix, where Inov and H are computed from linear state space system @@ -81,11 +88,11 @@ function [MEAN, dMEAN, REDUCEDFORM, dREDUCEDFORM, DYNAMIC, dDYNAMIC, MOMENTS, dM % * get_minimal_state_representation % * duplication % * dyn_vech +% * fjaco % * get_perturbation_params_derivs (previously getH) % * get_all_parameters -% * fjaco -% * lyapunov_symm % * identification_numerical_objective (previously thet2tau) +% * pruned_state_space_system % * vec % ========================================================================= % Copyright (C) 2010-2020 Dynare Team @@ -220,22 +227,9 @@ elseif order == 3 end % Get (pruned) state space representation: -options.options_ident.indvobs = indvobs; -options.options_ident.indpmodel = indpmodel; -options.options_ident.indpstderr = indpstderr; -options.options_ident.indpcorr = indpcorr; -oo.dr = pruned_state_space_system(M, options, oo.dr); -MEAN = oo.dr.pruned.E_y; dMEAN = oo.dr.pruned.dE_y; -A = oo.dr.pruned.A; dA = oo.dr.pruned.dA; -B = oo.dr.pruned.B; dB = oo.dr.pruned.dB; -C = oo.dr.pruned.C; dC = oo.dr.pruned.dC; -D = oo.dr.pruned.D; dD = oo.dr.pruned.dD; -c = oo.dr.pruned.c; dc = oo.dr.pruned.dc; -d = oo.dr.pruned.d; dd = oo.dr.pruned.dd; -Varinov = oo.dr.pruned.Varinov; dVarinov = oo.dr.pruned.dVarinov; -Om_z = oo.dr.pruned.Om_z; dOm_z = oo.dr.pruned.dOm_z; -Om_y = oo.dr.pruned.Om_y; dOm_y = oo.dr.pruned.dOm_y; - +pruned = pruned_state_space_system(M, options, oo.dr, indvobs, nlags, useautocorr, 1); +MEAN = pruned.E_y; +dMEAN = pruned.dE_y; %storage for Jacobians used in dsge_likelihood.m for analytical Gradient and Hession of likelihood (only at order=1) derivatives_info = struct(); if order == 1 @@ -247,12 +241,19 @@ if order == 1 end %% Compute dMOMENTS -%Note that our state space system for computing second moments is the following: -% zhat = A*zhat(-1) + B*xi, where zhat = z - E(z) -% yhat = C*zhat(-1) + D*xi, where yhat = y - E(y) -if ~no_identification_moments - MOMENTS = identification_numerical_objective(xparam1, 1, estim_params, M, oo, options, indpmodel, indpstderr, indpcorr, indvobs, useautocorr, nlags, grid_nbr); %[outputflag=1] - MOMENTS = [MEAN; MOMENTS]; +if ~no_identification_moments + if useautocorr + E_yy = pruned.Corr_y; dE_yy = pruned.dCorr_y; + E_yyi = pruned.Corr_yi; dE_yyi = pruned.dCorr_yi; + else + E_yy = pruned.Var_y; dE_yy = pruned.dVar_y; + E_yyi = pruned.Var_yi; dE_yyi = pruned.dVar_yi; + end + MOMENTS = [MEAN; dyn_vech(E_yy)]; + for i=1:nlags + MOMENTS = [MOMENTS; vec(E_yyi(:,:,i))]; + end + if kronflag == -1 %numerical derivative of autocovariogram dMOMENTS = fjaco(str2func('identification_numerical_objective'), xparam1, 1, estim_params, M, oo, options, indpmodel, indpstderr, indpcorr, indvobs, useautocorr, nlags, grid_nbr); %[outputflag=1] @@ -260,58 +261,10 @@ if ~no_identification_moments else dMOMENTS = zeros(obs_nbr + obs_nbr*(obs_nbr+1)/2 + nlags*obs_nbr^2 , totparam_nbr); dMOMENTS(1:obs_nbr,:) = dMEAN; %add Jacobian of first moments of VAROBS variables - % Denote Ezz0 = E[zhat*zhat'], then the following Lyapunov equation defines the autocovariagram: Ezz0 -A*Ezz0*A' = B*Sig_xi*B' = Om_z - [Ezz0,u] = lyapunov_symm(A, Om_z, options.lyapunov_fixed_point_tol, options.qz_criterium, options.lyapunov_complex_threshold, 1, options.debug); - stationary_vars = (1:length(indvobs))'; - if ~isempty(u) - x = abs(C*u); - stationary_vars = find(all(x < options.Schur_vec_tol,2)); - end - Eyy0 = NaN*ones(obs_nbr,obs_nbr); - Eyy0(stationary_vars,stationary_vars) = C(stationary_vars,:)*Ezz0*C(stationary_vars,:)' + Om_y(stationary_vars,stationary_vars); - %here method=1 is used, whereas all other calls of lyapunov_symm use method=2. The reason is that T and U are persistent, and input matrix A is the same, so using option 2 for all the rest of iterations spares a lot of computing time while not repeating Schur every time - indzeros = find(abs(Eyy0) < 1e-12); %find values that are numerical zero - Eyy0(indzeros) = 0; - if useautocorr - sdy = sqrt(diag(Eyy0)); %theoretical standard deviation - sdy = sdy(stationary_vars); - sy = sdy*sdy'; %cross products of standard deviations - end - for jp = 1:totparam_nbr - if jp <= (stderrparam_nbr+corrparam_nbr) - %Note that for stderr and corr parameters, the derivatives of the system matrices are zero, i.e. dA=dB=dC=dD=0 - dEzz0 = lyapunov_symm(A,dOm_z(:,:,jp),options.lyapunov_fixed_point_tol,options.qz_criterium,options.lyapunov_complex_threshold,2,options.debug); %here method=2 is used to spare a lot of computing time while not repeating Schur every time - dEyy0 = C*dEzz0*C' + dOm_y(:,:,jp); - else %model parameters - dEzz0 = lyapunov_symm(A,dOm_z(:,:,jp)+dA(:,:,jp)*Ezz0*A'+A*Ezz0*dA(:,:,jp)',options.lyapunov_fixed_point_tol,options.qz_criterium,options.lyapunov_complex_threshold,2,options.debug); %here method=2 is used to spare a lot of computing time while not repeating Schur every time - dEyy0 = dC(:,:,jp)*Ezz0*C' + C*dEzz0*C' + C*Ezz0*dC(:,:,jp)' + dOm_y(:,:,jp); - end - %indzeros = find(abs(dEyy0) < 1e-12); - %dEyy0(indzeros) = 0; - if useautocorr - dsy = 1/2./sdy.*diag(dEyy0); - dsy = dsy*sdy'+sdy*dsy'; - dEyy0corr = (dEyy0.*sy-dsy.*Eyy0)./(sy.*sy); - dEyy0corr = dEyy0corr-diag(diag(dEyy0corr))+diag(diag(dEyy0)); - dMOMENTS(obs_nbr+1 : obs_nbr+obs_nbr*(obs_nbr+1)/2 , jp) = dyn_vech(dEyy0corr); %focus only on VAROBS variables - else - dMOMENTS(obs_nbr+1 : obs_nbr+obs_nbr*(obs_nbr+1)/2 , jp) = dyn_vech(dEyy0); %focus only on VAROBS variables - end - tmpEyyi = A*Ezz0*C(stationary_vars,:)' + B*Varinov*D(stationary_vars,:)'; - %we could distinguish between stderr and corr params, but this has no real speed effect as we multipliy with zeros - dtmpEyyi = dA(:,:,jp)*Ezz0*C' + A*dEzz0*C' + A*Ezz0*dC(:,:,jp)' + dB(:,:,jp)*Varinov*D' + B*dVarinov(:,:,jp)*D' + B*Varinov*dD(:,:,jp)'; - Ai = eye(size(A,1)); %this is A^0 - dAi = zeros(size(A,1),size(A,1)); %this is d(A^0) + dMOMENTS(obs_nbr+1 : obs_nbr+obs_nbr*(obs_nbr+1)/2 , jp) = dyn_vech(dE_yy(:,:,jp)); for i = 1:nlags - Eyyi = C(stationary_vars,:)*Ai*tmpEyyi; - dEyyi = dC(:,:,jp)*Ai*tmpEyyi + C*dAi*tmpEyyi + C*Ai*dtmpEyyi; - if useautocorr - dEyyi = (dEyyi.*sy-dsy.*Eyyi)./(sy.*sy); - end - dMOMENTS(obs_nbr + obs_nbr*(obs_nbr+1)/2 + (i-1)*obs_nbr^2 + 1 : obs_nbr + obs_nbr*(obs_nbr+1)/2 + i*obs_nbr^2, jp) = vec(dEyyi); %focus only on VAROBS variables - dAi = dAi*A + Ai*dA(:,:,jp); %note that this is d(A^(i-1)) - Ai = Ai*A; %note that this is A^(i-1) + dMOMENTS(obs_nbr + obs_nbr*(obs_nbr+1)/2 + (i-1)*obs_nbr^2 + 1 : obs_nbr + obs_nbr*(obs_nbr+1)/2 + i*obs_nbr^2, jp) = vec(dE_yyi(:,:,i,jp)); end end end @@ -357,7 +310,7 @@ if ~no_identification_spectrum freqs = (0 : pi/(grid_nbr/2):pi); % we focus only on positive frequencies tpos = exp( sqrt(-1)*freqs); %positive Fourier frequencies tneg = exp(-sqrt(-1)*freqs); %negative Fourier frequencies - IA = eye(size(A,1)); + IA = eye(size(pruned.A,1)); if kronflag == -1 %numerical derivative of spectral density dOmega_tmp = fjaco(str2func('identification_numerical_objective'), xparam1, 2, estim_params, M, oo, options, indpmodel, indpstderr, indpcorr, indvobs, useautocorr, nlags, grid_nbr); %[outputflag=2] @@ -366,68 +319,63 @@ if ~no_identification_spectrum kk = kk+1; dOmega = dOmega_tmp(1 + (kk-1)*obs_nbr^2 : kk*obs_nbr^2,:); if ig == 1 % add zero frequency once - dSPECTRUM = dOmega'*dOmega; + dSPECTRUM_NO_MEAN = dOmega'*dOmega; else % due to symmetry to negative frequencies we can add positive frequencies twice - dSPECTRUM = dSPECTRUM + 2*(dOmega'*dOmega); + dSPECTRUM_NO_MEAN = dSPECTRUM_NO_MEAN + 2*(dOmega'*dOmega); end end elseif kronflag == 1 %use Kronecker products - dA = reshape(dA,size(dA,1)*size(dA,2),size(dA,3)); - dB = reshape(dB,size(dB,1)*size(dB,2),size(dB,3)); - dC = reshape(dC,size(dC,1)*size(dC,2),size(dC,3)); - dD = reshape(dD,size(dD,1)*size(dD,2),size(dD,3)); - dVarinov = reshape(dVarinov,size(dVarinov,1)*size(dVarinov,2),size(dVarinov,3)); - K_obs_exo = commutation(obs_nbr,size(Varinov,1)); + dA = reshape(pruned.dA,size(pruned.dA,1)*size(pruned.dA,2),size(pruned.dA,3)); + dB = reshape(pruned.dB,size(pruned.dB,1)*size(pruned.dB,2),size(pruned.dB,3)); + dC = reshape(pruned.dC,size(pruned.dC,1)*size(pruned.dC,2),size(pruned.dC,3)); + dD = reshape(pruned.dD,size(pruned.dD,1)*size(pruned.dD,2),size(pruned.dD,3)); + dVarinov = reshape(pruned.dVarinov,size(pruned.dVarinov,1)*size(pruned.dVarinov,2),size(pruned.dVarinov,3)); + K_obs_exo = commutation(obs_nbr,size(pruned.Varinov,1)); for ig=1:length(freqs) z = tneg(ig); - zIminusA = (z*IA - A); + zIminusA = (z*IA - pruned.A); zIminusAinv = zIminusA\IA; - Transferfct = D + C*zIminusAinv*B; % Transfer function + Transferfct = pruned.D + pruned.C*zIminusAinv*pruned.B; % Transfer function dzIminusA = -dA; dzIminusAinv = kron(-(transpose(zIminusA)\IA),zIminusAinv)*dzIminusA; %this takes long - dTransferfct = dD + DerivABCD(C,dC,zIminusAinv,dzIminusAinv,B,dB); %also long + dTransferfct = dD + DerivABCD(pruned.C,dC,zIminusAinv,dzIminusAinv,pruned.B,dB); %this takes long dTransferfct_conjt = K_obs_exo*conj(dTransferfct); - dOmega = (1/(2*pi))*DerivABCD(Transferfct,dTransferfct,Varinov,dVarinov,Transferfct',dTransferfct_conjt); %also long + dOmega = (1/(2*pi))*DerivABCD(Transferfct,dTransferfct,pruned.Varinov,dVarinov,Transferfct',dTransferfct_conjt); %also long if ig == 1 % add zero frequency once - dSPECTRUM = dOmega'*dOmega; + dSPECTRUM_NO_MEAN = dOmega'*dOmega; else % due to symmetry to negative frequencies we can add positive frequencies twice - dSPECTRUM = dSPECTRUM + 2*(dOmega'*dOmega); + dSPECTRUM_NO_MEAN = dSPECTRUM_NO_MEAN + 2*(dOmega'*dOmega); end end - %put back into tensor notation - dA = reshape(dA,size(A,1),size(A,2),totparam_nbr); - dB = reshape(dB,size(B,1),size(B,2),totparam_nbr); - dC = reshape(dC,size(C,1),size(C,2),totparam_nbr); - dD = reshape(dD,size(D,1),size(D,2),totparam_nbr); - dVarinov = reshape(dVarinov,size(Varinov,1),size(Varinov,2),totparam_nbr); elseif (kronflag==0) || (kronflag==-2) for ig = 1:length(freqs) - IzminusA = tpos(ig)*IA - A; - invIzminusA = IzminusA\eye(size(A,1)); - Transferfct = D + C*invIzminusA*B; + IzminusA = tpos(ig)*IA - pruned.A; + invIzminusA = IzminusA\eye(size(pruned.A,1)); + Transferfct = pruned.D + pruned.C*invIzminusA*pruned.B; dOmega = zeros(obs_nbr^2,totparam_nbr); for j = 1:totparam_nbr if j <= stderrparam_nbr+corrparam_nbr %stderr and corr parameters: only dSig is nonzero - dOmega_tmp = Transferfct*dVarinov(:,:,j)*Transferfct'; + dOmega_tmp = Transferfct*pruned.dVarinov(:,:,j)*Transferfct'; else %model parameters - dinvIzminusA = -invIzminusA*(-dA(:,:,j))*invIzminusA; - dTransferfct = dD(:,:,j) + dC(:,:,j)*invIzminusA*B + C*dinvIzminusA*B + C*invIzminusA*dB(:,:,j); - dOmega_tmp = dTransferfct*Varinov*Transferfct' + Transferfct*dVarinov(:,:,j)*Transferfct' + Transferfct*Varinov*dTransferfct'; + dinvIzminusA = -invIzminusA*(-pruned.dA(:,:,j))*invIzminusA; + dTransferfct = pruned.dD(:,:,j) + pruned.dC(:,:,j)*invIzminusA*pruned.B + pruned.C*dinvIzminusA*pruned.B + pruned.C*invIzminusA*pruned.dB(:,:,j); + dOmega_tmp = dTransferfct*pruned.Varinov*Transferfct' + Transferfct*pruned.dVarinov(:,:,j)*Transferfct' + Transferfct*pruned.Varinov*dTransferfct'; end dOmega(:,j) = (1/(2*pi))*dOmega_tmp(:); end if ig == 1 % add zero frequency once - dSPECTRUM = dOmega'*dOmega; + dSPECTRUM_NO_MEAN = dOmega'*dOmega; else % due to symmetry to negative frequencies we can add positive frequencies twice - dSPECTRUM = dSPECTRUM + 2*(dOmega'*dOmega); + dSPECTRUM_NO_MEAN = dSPECTRUM_NO_MEAN + 2*(dOmega'*dOmega); end end end % Normalize Matrix and add steady state Jacobian, note that G is real and symmetric by construction - dSPECTRUM = 2*pi*dSPECTRUM./(2*length(freqs)-1) + dMEAN'*dMEAN; - dSPECTRUM = real(dSPECTRUM); + dSPECTRUM_NO_MEAN = real(2*pi*dSPECTRUM_NO_MEAN./(2*length(freqs)-1)); + dSPECTRUM = dSPECTRUM_NO_MEAN + dMEAN'*dMEAN; else + dSPECTRUM_NO_MEAN = []; dSPECTRUM = []; end @@ -442,14 +390,14 @@ if ~no_identification_minimal dMINIMAL = []; else % Derive and check minimal state vector of first-order - SYS.A = oo.dr.ghx(oo.dr.pruned.indx,:); - SYS.dA = oo.dr.derivs.dghx(oo.dr.pruned.indx,:,:); - SYS.B = oo.dr.ghu(oo.dr.pruned.indx,:); - SYS.dB = oo.dr.derivs.dghu(oo.dr.pruned.indx,:,:); - SYS.C = oo.dr.ghx(oo.dr.pruned.indy,:); - SYS.dC = oo.dr.derivs.dghx(oo.dr.pruned.indy,:,:); - SYS.D = oo.dr.ghu(oo.dr.pruned.indy,:); - SYS.dD = oo.dr.derivs.dghu(oo.dr.pruned.indy,:,:); + SYS.A = oo.dr.ghx(pruned.indx,:); + SYS.dA = oo.dr.derivs.dghx(pruned.indx,:,:); + SYS.B = oo.dr.ghu(pruned.indx,:); + SYS.dB = oo.dr.derivs.dghu(pruned.indx,:,:); + SYS.C = oo.dr.ghx(pruned.indy,:); + SYS.dC = oo.dr.derivs.dghx(pruned.indy,:,:); + SYS.D = oo.dr.ghu(pruned.indy,:); + SYS.dD = oo.dr.derivs.dghu(pruned.indy,:,:); [CheckCO,minnx,SYS] = get_minimal_state_representation(SYS,1); if CheckCO == 0 diff --git a/matlab/get_perturbation_params_derivs.m b/matlab/get_perturbation_params_derivs.m index 08827e9b5..2deb29da7 100644 --- a/matlab/get_perturbation_params_derivs.m +++ b/matlab/get_perturbation_params_derivs.m @@ -145,6 +145,12 @@ analytic_derivation_mode = options.analytic_derivation_mode; % * -2: numerical two-sided finite difference method to compute numerically dYss, dg1, dg2, dg3, d2Yss and d2g1, the other output arguments are computed analytically as in kronflag=0 gstep = options.gstep; order = options.order; +if isempty(options.qz_criterium) + % set default value for qz_criterium: if there are no unit roots one can use 1.0 + % If they are possible, you may have have multiple unit roots and the accuracy + % decreases when computing the eigenvalues in lyapunov_symm. Hence, we normally use 1+1e-6 + options = select_qz_criterium_value(options); +end qz_criterium = options.qz_criterium; threads_BC = options.threads.kronecker.sparse_hessian_times_B_kronecker_C; @@ -269,6 +275,11 @@ if d2flag KalmanB = ghu; end +% Store some objects +DERIVS.indpmodel = indpmodel; +DERIVS.indpstderr = indpstderr; +DERIVS.indpcorr = indpcorr; + if analytic_derivation_mode == -1 %% numerical two-sided finite difference method using function get_perturbation_params_derivs_numerical_objective.m (previously thet2tau.m in Dynare 4.5) for % Jacobian (wrt selected stderr, corr and model parameters) of diff --git a/matlab/identification_analysis.m b/matlab/identification_analysis.m index 5c31d0135..6395a51b3 100644 --- a/matlab/identification_analysis.m +++ b/matlab/identification_analysis.m @@ -137,7 +137,7 @@ no_identification_spectrum = options_ident.no_identification_spectrum; if info(1) == 0 %no errors in solution % Compute parameter Jacobians for identification analysis - [MEAN, dMEAN, REDUCEDFORM, dREDUCEDFORM, DYNAMIC, dDYNAMIC, MOMENTS, dMOMENTS, dSPECTRUM, dMINIMAL, derivatives_info] = get_identification_jacobians(estim_params_, M_, oo_, options_, options_ident, indpmodel, indpstderr, indpcorr, indvobs); + [MEAN, dMEAN, REDUCEDFORM, dREDUCEDFORM, DYNAMIC, dDYNAMIC, MOMENTS, dMOMENTS, dSPECTRUM, dSPECTRUM_NO_MEAN, dMINIMAL, derivatives_info] = get_identification_jacobians(estim_params_, M_, oo_, options_, options_ident, indpmodel, indpstderr, indpcorr, indvobs); if isempty(dMINIMAL) % Komunjer and Ng is not computed if (1) minimality conditions are not fullfilled or (2) there are more shocks and measurement errors than observables, so we need to reset options no_identification_minimal = 1; @@ -194,7 +194,7 @@ if info(1) == 0 %no errors in solution options_ident.no_identification_spectrum = 1; %do not recompute dSPECTRUM options_ident.ar = nlags; %store new lag number options_.ar = nlags; %store new lag number - [~, ~, ~, ~, ~, ~, MOMENTS, dMOMENTS, ~, ~, ~] = get_identification_jacobians(estim_params_, M_, oo_, options_, options_ident, indpmodel, indpstderr, indpcorr, indvobs); + [~, ~, ~, ~, ~, ~, MOMENTS, dMOMENTS, ~, ~, ~, ~] = get_identification_jacobians(estim_params_, M_, oo_, options_, options_ident, indpmodel, indpstderr, indpcorr, indvobs); ind_dMOMENTS = (find(max(abs(dMOMENTS'),[],1) > tol_deriv)); %new index with non-zero rows end @@ -508,6 +508,7 @@ if info(1) == 0 %no errors in solution ide_spectrum.norm_dSPECTRUM = norm_dSPECTRUM; ide_spectrum.tilda_dSPECTRUM = tilda_dSPECTRUM; ide_spectrum.dSPECTRUM = dSPECTRUM; + ide_spectrum.dSPECTRUM_NO_MEAN = dSPECTRUM_NO_MEAN; end %% Perform identification checks, i.e. find out which parameters are involved diff --git a/matlab/identification_numerical_objective.m b/matlab/identification_numerical_objective.m index a55d4d8ee..48ba28bfc 100644 --- a/matlab/identification_numerical_objective.m +++ b/matlab/identification_numerical_objective.m @@ -30,17 +30,15 @@ function out = identification_numerical_objective(params, outputflag, estim_para % Jacobian of the dynamic model equations, and Y_t selected variables % ------------------------------------------------------------------------- % This function is called by -% * get_first_order_solution_params_deriv.m (previously getH.m) % * get_identification_jacobians.m (previously getJJ.m) % ------------------------------------------------------------------------- % This function calls % * [M.fname,'.dynamic'] -% * dynare_resolve % * dyn_vech -% * lyapunov_symm +% * resol % * vec % ========================================================================= -% Copyright (C) 2011-2019 Dynare Team +% Copyright (C) 2011-2020 Dynare Team % % This file is part of Dynare. % @@ -58,16 +56,6 @@ function out = identification_numerical_objective(params, outputflag, estim_para % along with Dynare. If not, see . % ========================================================================= -if nargin < 11 || isempty(useautocorr) - useautocorr = 0; -end -if nargin < 12 || isempty(nlags) - nlags = 3; -end -if nargin < 13 || isempty(grid_nbr) - grid_nbr = 0; -end - %% Update stderr, corr and model parameters %note that if no estimated_params_block is given, then all stderr and model parameters are selected but no corr parameters if length(params) > length(indpmodel) @@ -90,50 +78,21 @@ end %% compute Kalman transition matrices and steady state with updated parameters [~,info,M,options,oo] = resol(0,M,options,oo); options = rmfield(options,'options_ident'); -oo.dr = pruned_state_space_system(M, options, oo.dr); -A = oo.dr.pruned.A; -B = oo.dr.pruned.B; -C = oo.dr.pruned.C(indvar,:); -D = oo.dr.pruned.D(indvar,:); -Om_z = oo.dr.pruned.Om_z; -Om_y = oo.dr.pruned.Om_y(indvar,indvar); -Varinov = oo.dr.pruned.Varinov; -obs_nbr = size(C,1); +pruned = pruned_state_space_system(M, options, oo.dr, indvar, nlags, useautocorr, 0); + %% out = [vech(cov(Y_t,Y_t)); vec(cov(Y_t,Y_{t-1}); ...; vec(cov(Y_t,Y_{t-nlags})] of indvar variables, in DR order. This is Iskrev (2010)'s J matrix. -if outputflag == 1 - % Denote Ezz0 = E_t(z_t * z_t'), then the following Lyapunov equation defines the autocovariagrom: Ezz0 -A*Ezz*A' = B*Sig_e*B' - [Ezz0,u] = lyapunov_symm(A, Om_z, options.lyapunov_fixed_point_tol, options.qz_criterium, options.lyapunov_complex_threshold, 1, options.debug); - stationary_vars = (1:size(C,1))'; - if ~isempty(u) - x = abs(C*u); - stationary_vars = find(all(x < options.Schur_vec_tol,2)); - end - Eyy0 = NaN*ones(obs_nbr,obs_nbr); - Eyy0(stationary_vars,stationary_vars) = C(stationary_vars,:)*Ezz0*C(stationary_vars,:)' + Om_y(stationary_vars,stationary_vars); - indzeros = find(abs(Eyy0) < 1e-12); %find values that are numerical zero - Eyy0(indzeros) = 0; +if outputflag == 1 if useautocorr - sy = sqrt(diag(Ezz0)); %theoretical standard deviation - sy = sy(stationary_vars); - sy = sy*sy'; %cross products of standard deviations - sy0 = sy-diag(diag(sy))+eye(length(sy)); - Eyy0corr = NaN*ones(size(C,1),size(C,1)); - Eyy0corr(stationary_vars,stationary_vars) = Eyy0./sy0; - out = dyn_vech(Eyy0corr); %focus only on unique terms + out = dyn_vech(pruned.Corr_y); else - out = dyn_vech(Eyy0); %focus only on unique terms - end - % compute autocovariances/autocorrelations of lagged observed variables - tmpEyyi = A*Ezz0*C(stationary_vars,:)' + B*Varinov*D(stationary_vars,:)'; - Ai = eye(size(A,1)); %this is A^0 + out = dyn_vech(pruned.Var_y); + end for i = 1:nlags - Eyyi = NaN*ones(obs_nbr,obs_nbr); - Eyyi(stationary_vars,stationary_vars) = C(stationary_vars,:)*Ai*tmpEyyi; if useautocorr - Eyyi = Eyyi./sy; + out = [out;vec(pruned.Corr_yi(:,:,i))]; + else + out = [out;vec(pruned.Var_yi(:,:,i))]; end - out = [out;vec(Eyyi)]; - Ai = Ai*A; %note that this is A^(i-1) end end @@ -142,13 +101,13 @@ if outputflag == 2 % This computes the spectral density g_omega where the interval [-pi;\pi] is discretized by grid_nbr points freqs = (0 : pi/(grid_nbr/2):pi);% we focus only on positive values including the 0 frequency tpos = exp( sqrt(-1)*freqs); %Fourier frequencies - IA = eye(size(A,1)); - var_nbr = size(C,1); + IA = eye(size(pruned.A,1)); + var_nbr = size(pruned.C,1); out = zeros(var_nbr^2*length(freqs),1); kk = 0; for ig = 1:length(freqs) - Transferfct = D + C*((tpos(ig)*IA-A)\B); - g_omega = (1/(2*pi))*(Transferfct*Varinov*Transferfct'); % note that ' is the conjugate transpose + Transferfct = pruned.D + pruned.C*((tpos(ig)*IA-pruned.A)\pruned.B); + g_omega = (1/(2*pi))*(Transferfct*pruned.Varinov*Transferfct'); % note that ' is the conjugate transpose kk = kk+1; out(1 + (kk-1)*var_nbr^2 : kk*var_nbr^2) = g_omega(:); end diff --git a/matlab/prodmom_deriv.m b/matlab/prodmom_deriv.m index b4cd75f66..c154df8a7 100644 --- a/matlab/prodmom_deriv.m +++ b/matlab/prodmom_deriv.m @@ -1,10 +1,37 @@ -function dy = prodmom_deriv(V,ii,nu,dV,dC) -% This function builds upon and extends prodmom.m to compute the -% derivatives of product moments of normally distributed variables with -% respect to standard errors and correlation parameters. -% prodmom.m is part of replication codes of the following paper: +function [y,dy] = prodmom_deriv(V,ii,nu,dV,dC) +% Computes the product moments (and its derivatives with respect to standard +% errors and correlation parameters) of normally distributed variables, i.e. +% this function computes the product moment of +% X_{i_1}^{nu_1}X_{i_2}^{nu_2}...X_{i_m}^{nu_m}, where X_{i_j} are elements +% from X ~ N(0_n,V) and V is positive semidefinite. +% Example: To get E[X_2X_4^3X_7^2], use prodmom_deriv(V,[2 4 7],[1 3 2]) +% ========================================================================= +% INPUTS +% V [n by n] covariance matrix of X (needs to be positive semidefinite) +% ii [m by 1] vector of i_j +% nu [nu_m by 1] power of X_{i_j} +% dV [n by n by stderrparam_nbr+corrparam_nbr] derivative of V with respect +% to selected standard error (stderr) +% and correlation (corr) parameters +% dC [n by n by stderrparam_nbr+corrparam_nbr] derivative of Correlation matrix C with respect +% to selected standard error (stderr) +% and correlation (corr) parameters +% ------------------------------------------------------------------------- +% OUTPUTS +% y [1 by 1] product moment E[X_{i_1}^{nu_1}X_{i_2}^{nu_2}...X_{i_m}^{nu_m}] +% dy [1 by stderrparam_nbr+corrparam_nbr] derivatives of y wrt to selected +% standard error and corr parameters +% ------------------------------------------------------------------------- +% This function is based upon prodmom.m which is part of replication codes +% of the following paper: % Kan, R.: "From moments of sum to moments of product." Journal of % Multivariate Analysis, 2008, vol. 99, issue 3, pages 542-554. +% prodmom.m can be retrieved from http://www-2.rotman.utoronto.ca/~kan/papers/prodmom.zip +% Further references: +% Triantafyllopoulos (2003) On the Central Moments of the Multidimensional +% Gaussian Distribution, Mathematical Scientist +% Kotz, Balakrishnan, and Johnson (2000), Continuous Multivariate +% Distributions, Vol. 1, p.261 % ========================================================================= % Copyright (C) 2008-2015 Raymond Kan % Copyright (C) 2019-2020 Dynare Team @@ -25,89 +52,118 @@ function dy = prodmom_deriv(V,ii,nu,dV,dC) % along with Dynare. If not, see . % ========================================================================= if nargin<3 - nu = ones(size(ii)); + nu = ones(size(ii)); end s = sum(nu); if s==0 - dy = zeros(1,1,size(dV,3)); - return + y = 1; + if nargout > 1 + dy = zeros(1,1,size(dV,3)); + end + return end if rem(s,2)==1 - dy = zeros(1,1,size(dV,3)); - return + y = 0; + if nargout > 1 + dy = zeros(1,1,size(dV,3)); + end + return end nuz = nu==0; nu(nuz) = []; ii(nuz) = []; m = length(ii); V = V(ii,ii); -dV = dV(ii,ii,:); +if nargout > 1 + dV = dV(ii,ii,:); +end s2 = s/2; % % Use univariate normal results % if m==1 - dy = s2*V^(s2-1)*dV*prod([1:2:s-1]); - dy = reshape(dy,1,size(dV,3)); + y = V^s2*prod([1:2:s-1]); + if nargout > 1 + dy = s2*V^(s2-1)*dV*prod([1:2:s-1]); + dy = reshape(dy,1,size(dV,3)); + end return end % % Use bivariate normal results when there are only two distinct indices % if m==2 - rho = V(1,2)/sqrt(V(1,1)*V(2,2)); - drho = dC(ii(1),ii(2),:); - [tmp,dtmp] = bivmom(nu,rho); - dy = (nu(1)/2)*V(1,1)^(nu(1)/2-1)*dV(1,1,:) * V(2,2)^(nu(2)/2) * tmp... - + V(1,1)^(nu(1)/2) * (nu(2)/2)*V(2,2)^(nu(2)/2-1)*dV(2,2,:) * tmp... - + V(1,1)^(nu(1)/2) * V(2,2)^(nu(2)/2) * dtmp * drho; - dy = reshape(dy,1,size(dV,3)); - return + rho = V(1,2)/sqrt(V(1,1)*V(2,2)); + if nargout > 1 + drho = dC(ii(1),ii(2),:); + [tmp,dtmp] = bivmom(nu,rho); + dy = (nu(1)/2)*V(1,1)^(nu(1)/2-1)*dV(1,1,:) * V(2,2)^(nu(2)/2) * tmp... + + V(1,1)^(nu(1)/2) * (nu(2)/2)*V(2,2)^(nu(2)/2-1)*dV(2,2,:) * tmp... + + V(1,1)^(nu(1)/2) * V(2,2)^(nu(2)/2) * dtmp * drho; + dy = reshape(dy,1,size(dV,3)); + else + tmp = bivmom(nu,rho); + end + y = V(1,1)^(nu(1)/2)*V(2,2)^(nu(2)/2)*tmp; + return end % % Regular case % [nu,inu] = sort(nu,2,'descend'); V = V(inu,inu); % Extract only the relevant part of V -dV = dV(inu,inu,:); % Extract only the relevant part of dV x = zeros(1,m); V = V./2; -dV = dV./2; nu2 = nu./2; p = 2; q = nu2*V*nu2'; -%dq = nu2*dV*nu2'; -%dq = multiprod(multiprod(nu2,dV),nu2'); -dq = NaN(size(q,1), size(q,2), size(dV,3)); -for jp = 1:size(dV,3) - dq(:,:,jp) = nu2*dV(:,:,jp)*nu2'; +y = 0; +if nargout > 1 + dV = dV(inu,inu,:); % Extract only the relevant part of dV + dV = dV./2; + %dq = nu2*dV*nu2'; + %dq = multiprod(multiprod(nu2,dV),nu2'); + dq = NaN(size(q,1), size(q,2), size(dV,3)); + for jp = 1:size(dV,3) + dq(:,:,jp) = nu2*dV(:,:,jp)*nu2'; + end + dy = 0; end -dy = 0; for i=1:fix(prod(nu+1)/2) - dy = dy+p*s2*q^(s2-1)*dq; + y = y+p*q^s2; + if nargout > 1 + dy = dy+p*s2*q^(s2-1)*dq; + end for j=1:m if x(j) 1 + %dq = dq-2*(nu2-x)*dV(:,j,:)-dV(j,j,:); + %dq = dq-2*multiprod((nu2-x),dV(:,j,:))-dV(j,j,:); + for jp=1:size(dV,3) + dq(:,:,jp) = dq(:,:,jp)-2*(nu2-x)*dV(:,j,jp)-dV(j,j,jp); + end + end + break else - x(j) = 0; - if rem(nu(j),2)==1 - p = -p; - end - %dq = dq+2*nu(j)*multiprod((nu2-x),dV(:,j,:))-nu(j)^2*dV(j,j,:); - for jp=1:size(dV,3) - dq(:,:,jp) = dq(:,:,jp)+2*nu(j)*(nu2-x)*dV(:,j,jp)-nu(j)^2*dV(j,j,jp); - end - q = q+2*nu(j)*(nu2-x)*V(:,j)-nu(j)^2*V(j,j); + x(j) = 0; + if rem(nu(j),2)==1 + p = -p; + end + if nargout > 1 + %dq = dq+2*nu(j)*multiprod((nu2-x),dV(:,j,:))-nu(j)^2*dV(j,j,:); + for jp=1:size(dV,3) + dq(:,:,jp) = dq(:,:,jp)+2*nu(j)*(nu2-x)*dV(:,j,jp)-nu(j)^2*dV(j,j,jp); + end + end + q = q+2*nu(j)*(nu2-x)*V(:,j)-nu(j)^2*V(j,j); end end end -dy = dy/prod([1:s2]); -dy = reshape(dy,1,size(dV,3)); \ No newline at end of file +y = y/prod([1:s2]); +if nargout > 1 + dy = dy/prod([1:s2]); + dy = reshape(dy,1,size(dV,3)); +end \ No newline at end of file diff --git a/matlab/pruned_state_space_system.m b/matlab/pruned_state_space_system.m index b0c5c4f04..df5cf5ab4 100644 --- a/matlab/pruned_state_space_system.m +++ b/matlab/pruned_state_space_system.m @@ -1,763 +1,1219 @@ -function dr = pruned_state_space_system(M, options, dr) -% This can be set up into the following ABCD representation: -% z = c + A*z(-1) + B*xi -% y = ybar + d + C*z(-1) + D*xi +function pruned_state_space = pruned_state_space_system(M, options, dr, indy, nlags, useautocorr, compute_derivs) +% Set up the pruned state space ABCD representation: +% z = c + A*z(-1) + B*inov +% y = ys + d + C*z(-1) + D*inov +% References: +% - Andreasen, Martin M., Jesús Fernández-Villaverde and Juan F. Rubio-Ramírez (2018): +% "The Pruned State-Space System for Non-Linear DSGE Models: Theory and Empirical Applications", +% Review of Economic Studies, Volume 85, Issue 1, Pages 1–49. +% - Mutschler, Willi (2018): "Higher-order statistics for DSGE models", +% Econometrics and Statistics, Volume 6, Pages 44-56. +% ========================================================================= +% INPUTS +% M: [structure] storing the model information +% options: [structure] storing the options +% dr: [structure] storing the results from perturbation approximation +% indy: [vector] index of control variables in DR order +% nlags: [integer] number of lags in autocovariances and autocorrelations +% useautocorr: [boolean] true: compute autocorrelations +% ------------------------------------------------------------------------- +% OUTPUTS +% pruned_state_space: [structure] with the following fields: +% indx: [x_nbr by 1] +% index of state variables +% indy: [y_nbr by 1] +% index of control variables +% A: [z_nbr by z_nbr] +% state space transition matrix A mapping previous states to current states +% B: [z_nbr by inov_nbr] +% state space transition matrix B mapping current inovations to current states +% c: [z_nbr by 1] +% state space transition matrix c mapping constants to current states +% C: [y_nbr by z_nbr] +% state space measurement matrix C mapping previous states to current controls +% D: [y_nbr by inov_nbr] +% state space measurement matrix D mapping current inovations to current controls +% d: [y_nbr by 1] +% state space measurement matrix d mapping constants to current controls +% Var_inov [inov_nbr by inov_nbr] +% contemporenous covariance matrix of innovations, i.e. E[inov*inov'] +% Var_z [z_nbr by z_nbr] +% contemporenous covariance matrix of states z +% Var_y [y_nbr by y_nbr] +% contemporenous covariance matrix of controls y +% Var_yi [y_nbr by y_nbr by nlags] +% autocovariance matrix of controls y +% Corr_y [y_nbr by y_nbr] +% contemporenous correlation matrix of controls y +% Corr_yi [y_nbr by y_nbr by nlags] +% autocorrelation matrix of controls y +% E_y [y_nbr by 1] +% unconditional theoretical mean of control variables y +% +% if compute_derivs == 1, then the following additional fields are outputed: +% dA: [z_nbr by z_nbr by totparam_nbr] +% parameter Jacobian of A +% dB: [z_nbr by inov_nbr by totparam_nbr] +% parameter Jacobian of B +% dc: [z_nbr by totparam_nbr] +% parameter Jacobian of c +% dC: [y_nbr by z_nbr by totparam_nbr] +% parameter Jacobian of C +% dD: [y_nbr by inov_nbr by totparam_nbr] +% parameter Jacobian of D +% dd: [y_nbr by totparam_nbr] +% parameter Jacobian of d +% dVar_inov [inov_nbr by inov_nbr by totparam_nbr] +% parameter Jacobian of Var_inov +% dVar_z [z_nbr by z_nbr by totparam_nbr] +% parameter Jacobian of Var_z +% dVar_y [y_nbr by y_nbr by totparam_nbr] +% parameter Jacobian of Var_y +% dVar_yi [y_nbr by y_nbr by nlags by totparam_nbr] +% parameter Jacobian of Var_yi +% dCorr_y [y_nbr by y_nbr by totparam_nbr] +% parameter Jacobian of Corr_y +% dCorr_yi [y_nbr by y_nbr by nlags by totparam_nbr] +% parameter Jacobian of Corr_yi +% dE_y [y_nbr by totparam_nbr] +% parameter Jacobian of E_y +% ------------------------------------------------------------------------- +% This function is called by +% * get_identification_jacobians.m +% * identification_numerical_objective.m +% ------------------------------------------------------------------------- +% This function calls +% * allVL1.m +% * commutation.m +% * disclyap_fast.m +% * duplication.m +% * lyapunov_symm.m +% * prodmom +% * prodmom_deriv +% * Q6_plication +% * quadruplication.m +% * vec.m +% ========================================================================= +% Copyright (C) 2019-2020 Dynare Team +% +% This file is part of Dynare. +% +% Dynare is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% Dynare is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with Dynare. If not, see . +% ========================================================================= -% Denote -% hx = dr.ghx(indx,:); hu = dr.ghu(indx,:); -% hxx = dr.ghxx(indx,:); hxu = dr.ghxu(indx,:); huu = dr.ghuu(indx,:); hs2 = dr.ghs2(indx,:); -% gx = dr.ghx(indy,:); gu = dr.ghu(indy,:); -% gxx = dr.ghxx(indy,:); gxu = dr.ghxu(indy,:); guu = dr.ghuu(indy,:); gs2 = dr.ghs2(indy,:); -% hxss = dr.ghxss(indx,:); huss = dr.ghuss(indx,:); hxxx = dr.ghxxx(indx,:); huuu = dr.ghuuu(indx,:); hxxu = dr.ghxxu(indx,:); hxuu = dr.ghxxu(indx,:); -% gxss = dr.ghxss(indy,:); guss = dr.ghuss(indy,:); gxxx = dr.ghxxx(indy,:); guuu = dr.ghuuu(indy,:); gxxu = dr.ghxxu(indy,:); gxuu = dr.ghxxu(indy,:); -% Law of motion for first-order effects states xf and selected endogenous first-order effects variables yf: -% xf = hx*xf(-1) + hu*u -% yf = gx*xf(-1) + gu*u -% Law of motion for second-order effects states xs and selected endogenous second-order effects variables ys: -% xs = hx*xs(-1) + 1/2*hxx*kron(xf(-1),xf(-1)) + 1/2*huu*kron(u,u) + hxu*kron(xf(-1),u) + 1/2*hs2 -% ys = gx*xs(-1) + 1/2*gxx*kron(xf(-1),xf(-1)) + 1/2*guu*kron(u,u) + gxu*kron(xf(-1),u) + 1/2*gs2 -% Law of motion for third-order effects states xrd and selected endogenous second-order effects variables yrd: -% xrd = hx*xrd(-1) + hxx*kron(xf(-1),xs(-1)) + hxu*kron(xs(-1),u) + 3/6*hxss*xf(-1) + 3/6*huss*u + 1/6*hxxx*kron(xf(-1),kron(xf(-1),xf(-1))) + 1/6*huuu*kron(u,kron(u,u)) + 3/6*hxxu*kron(xf(-1),kron(xf(-1),u)) + 3/6*hxuu*kron(xf(-1),kron(u,u)) -% yrd = gx*xrd(-1) + gxx*kron(xf(-1),xs(-1)) + gxu*kron(xs(-1),u) + 3/6*gxss*xf(-1) + 3/6*guss*u + 1/6*gxxx*kron(xf(-1),kron(xf(-1),xf(-1))) + 1/6*guuu*kron(u,kron(u,u)) + 3/6*gxxu*kron(xf(-1),kron(xf(-1),u)) + 3/6*gxuu*kron(xf(-1),kron(u,u)) - % Selected variables: y = ybar + yf + ys - % Pruned state vector: z = [xf; xs; kron(xf,xf)] - % Pruned innovation vector: xi = [u; kron(u,u)-vec(Sigma_u); kron(xf(-1),u); kron(u,xf(-1))] - % Second moments of xi - % Sig_xi = E[u*u' , u*kron(u,u)' , zeros(u_nbr,x_nbr*u_nbr), zeros(u_nbr,u_nbr*x_nbr); - % kron(u,u)*u', kron(u,u)*kron(u,u)'-Sig_u(:)*Sig_u(:)', zeros(u_nbr^2,x_nbr*u_nbr), zeros(u_nbr^2,u_nbr*x_nbr); - % zeros(x_nbr*u_nbr,u_nbr), zeros(x_nbr*u_nbr,u_nbr^2), kron(xf(-1),u)*kron(xf(-1),u)', kron(xf(-1),u)*kron(u,xf(-1))'; - % zeros(u_nbr*x_nbr,u_nbr), zeros(u_nbr*x_nbr,u_nbr^2), kron(u,xf(-1))*kron(xf(-1),u)', kron(u,xf(-1))*kron(u,xf(-1))';] - % That is, we only need to compute: - % - Sig_xi_11 = E[u*u']=Sig_u - % - Sig_xi_21 = E[kron(u,u)*u']=0 for symmetric distributions - % - Sig_xi_12 = transpose(Sig_xi_21)= 0 for symmetric distributions - % - Sig_xi_22 = E[kron(u,u)*kron(u,u)']-Sig_u(:)*Sig_u(:)' which requires the fourth-order product moments of u - % - Sig_xi_34 = E[kron(xf(-1),u)*kron(xf(-1),u)'] which requires the second-order moments of xf and second-order moments of u - % - Sig_xi_43 = transpose(Sig_xi_34) - % - Sig_xi_33 = - % - Sig_xi_44 = +%% MAIN IDEA: +% Decompose the state vector x into first-order effects xf, second-order +% effects xs, and third-order effects xrd, i.e. x=xf+xs+xrd. Then, Dynare's +% perturbation approximation for the state vector up to third order +% (with Gaussian innovations u, i.e. no odd moments, hxxs=huus=hxus=hsss=0) is: +% x = hx*( xf(-1)+xs(-1)+xrd(-1) ) +% + hu*u +% + 1/2*hxx*kron( xf(-1)+xs(-1)+xrd(-1) , xf(-1)+xs(-1)+xrd(-1) ) +% + hxu*kron( xf(-1)+xs(-1)+xrd(-1) , u ) +% + 1/2*huu*kron( u , u ) +% + 1/2*hss*sig^2 +% + 1/6*hxxx*kron( kron( xf(-1)+xs(-1)+xrd(-1) , xf(-1)+xs(-1)+xrd(-1) ) , xf(-1)+xs(-1)+xrd(-1) ) +% + 1/6*huuu*kron( kron( u , u ) , u ) +% + 3/6*hxxu*kron( kron( xf(-1)+xs(-1)+xrd(-1) , xf(-1)+xs(-1)+xrd(-1) ) , u ) +% + 3/6*hxuu*kron( kron( xf(-1)+xs(-1)+xrd(-1) , u ) , u) +% + 3/6*hxss*( xf(-1)+xs(-1)+xrd(-1) )*sig^2 +% + 3/6*huss*u*sig^2 +% where: +% hx = dr.ghx(indx,:); hu = dr.ghu(indx,:); +% hxx = dr.ghxx(indx,:); hxu = dr.ghxu(indx,:); huu = dr.ghuu(indx,:); hss = dr.ghs2(indx,:); +% hxxx = dr.ghxxx(indx,:); huuu = dr.ghuuu(indx,:); hxxu = dr.ghxxu(indx,:); hxuu = dr.ghxxu(indx,:); hxss = dr.ghxss(indx,:); huss = dr.ghuss(indx,:); +% and similarly for control variables: +% y = gx*( xf(-1)+xs(-1)+xrd(-1) ) +% + gu*u +% + 1/2*gxx*kron( xf(-1)+xs(-1)+xrd(-1) , xf(-1)+xs(-1)+xrd(-1) ) +% + gxu*kron( xf(-1)+xs(-1)+xrd(-1) , u ) +% + 1/2*guu*kron( u , u ) +% + 1/2*gss*sig^2 +% + 1/6*gxxx*kron( kron( xf(-1)+xs(-1)+xrd(-1) , xf(-1)+xs(-1)+xrd(-1) ) , xf(-1)+xs(-1)+xrd(-1) ) +% + 1/6*guuu*kron( kron( u , u ) , u ) +% + 3/6*gxxu*kron( kron( xf(-1)+xs(-1)+xrd(-1) , xf(-1)+xs(-1)+xrd(-1) ) , u ) +% + 3/6*gxuu*kron( kron( xf(-1)+xs(-1)+xrd(-1) , u ) , u) +% + 3/6*gxss*( xf(-1)+xs(-1)+xrd(-1) )*sig^2 +% + 3/6*guss*u*sig^2 +% where: +% gx = dr.ghx(indy,:); gu = dr.ghu(indy,:); +% gxx = dr.ghxx(indy,:); gxu = dr.ghxu(indy,:); guu = dr.ghuu(indy,:); gss = dr.ghs2(indy,:); +% gxxx = dr.ghxxx(indy,:); guuu = dr.ghuuu(indy,:); gxxu = dr.ghxxu(indy,:); gxuu = dr.ghxxu(indy,:); gxss = dr.ghxss(indy,:); guss = dr.ghuss(indy,:); +% +% PRUNING means getting rid of terms higher than the approximation order, i.e. +% - involving fourth-order effects: kron(xf,xrd), kron(xs,xs), kron(xrd,xf), kron(xrd,u), +% kron(kron(xf,xf),xs), kron(kron(xf,xs),xf), kron(kron(xs,xf),xf) +% kron(kron(xf,xs),u), kron(kron(xs,xf),u) +% kron(kron(xs,u),u) +% xs*sig^2 +% - involving fifth-order effects: kron(xs,xrd), kron(xrd,xs), +% kron(kron(xf,xf),xrd), kron(kron(xf,xs),xs), kron(kron(xf,xrd),xf), kron(kron(xs,xf),xs), kron(kron(xs,xs),xf), kron(kron(xrd,xf),xf) +% kron(kron(xf,xrd),u), kron(kron(xs,xs),u), kron(kron(xrd,xf),u) +% kron(kron(xrd,u),u) +% xrd*sig^2 +% - involving sixth-order effects: kron(xrd,xrd), +% kron(kron(xf,xs),xrd), kron(kron(xf,xrd),xs), kron(kron(xs,xrd),xrd), kron(kron(xs,xs),xs), kron(kron(xs,xrd),xf), kron(kron(xf,xf),xs), kron(kron(xrd,xs),xf) +% kron(kron(xs,xrd),u), kron(kron(xrd,xs),u) +% - involving seventh-order effects: kron(kron(xf,xrd),xrd), kron(kron(xs,xs),xrd), kron(kron(xs,xrd),xs), kron(kron(xrd,xf),xrd), kron(kron(xrd,xs),xs), kron(kron(xrd,xrd),xf) +% kron(kron(xrd,xrd),u) +% - involving eighth-order effects: kron(kron(xs,xrd),xrd), kron(kron(xrd,xs),xrd), kron(kron(xrd,xrd),xs) +% - involving ninth-order effects: kron(kron(xrd,xrd),xrd) +% Note that u is treated as a first-order effect and the perturbation parameter sig as a variable. +% +% SUMMARY OF LAW OF MOTIONS: Set up the law of motions for the individual effects, but keep only effects of same order +% Notation: I_n=eye(n) and K_m_n=commutation(m,n) +% +% First-order effects: keep xf and u +% xf = hx*xf(-1) + hu*u +% Note that we +% +% Second-order effects: keep xs, kron(xf,xf), kron(u,u), kron(xf,u), and sig^2 +% xs = hx*xs(-1) + 1/2*hxx*kron(xf(-1),xf(-1)) + 1/2*huu*(kron(u,u)-Sigma_e(:)+Sigma_e(:)) + hxu*kron(xf(-1),u) + 1/2*hss*sig^2% +% +% Third-order effects: keep xrd, kron(xf,xs), kron(xs,xf), kron(xs,u), kron(kron(xf,xf),xf), kron(kron(u,u),u), kron(kron(xf,xf),u), kron(kron(xf,u),u), xf*sig^2, u*sig^2 +% xrd = hx*xrd(-1) + 1/2*hxx*(kron(xf(-1),xs(-1))+kron(xs(-1),xf(-1))) + hxu*kron(xs(-1),u) + 1/6*hxxx*kron(xf(-1),kron(xf(-1),xf(-1))) + 1/6*huuu*kron(u,kron(u,u)) + 3/6*hxxu*kron(xf(-1),kron(xf(-1),u)) + 3/6*hxuu*kron(xf(-1),kron(u,u)) + 3/6*hxss*xf(-1)*sig^2 + 3/6*huss*u*sig^2 +% Simplified (due to symmetry in hxx): +% xrd = hx*xrd(-1) + hxx*(kron(xf(-1),xs(-1)) + hxu*kron(xs(-1),u) + 1/6*hxxx*kron(xf(-1),kron(xf(-1),xf(-1))) + 1/6*huuu*kron(u,kron(u,u)) + 3/6*hxxu*kron(xf(-1),kron(xf(-1),u)) + 3/6*hxuu*kron(xf(-1),kron(u,u)) + 3/6*hxss*xf(-1)*sig^2 + 3/6*huss*u*sig^2% +% +% Auxiliary equation kron(xf,xf) to set up the VAR(1) pruned state space system +% kron(xf,xf) = kron(hx,hx)*kron(xf(-1),xf(-1)) + kron(hu,hu)*(kron(u,u)-Sigma_e(:)+Sigma_e(:)) + kron(hx,u)*kron(xf(-1),u) + kron(u,hx)*kron(u,xf(-1)) +% Simplified using commutation matrix: +% kron(xf,xf) = kron(hx,hx)*kron(xf(-1),xf(-1)) + (I_xx+K_x_x)*kron(hx,hu)*kron(xf(-1),u) + kron(hu,hu)*kron(u,u) +% +% Auxiliary equation kron(xf,xs) to set up the VAR(1) pruned state space system +% kron(xf,xs) = kron(hx,hx)*kron(xf(-1),xs(-1)) + kron(hu,hx)*kron(u,xs(-1)) +% + kron(hx,1/2*hxx)*kron(kron(xf(-1),xf(-1)),xf(-1)) + kron(hu,1/2*hxx)*kron(kron(u,xf(-1)),xf(-1)) +% + kron(hx,1/2*huu)*kron(kron(xf(-1),u),u) + kron(hu,1/2*huu)*kron(kron(u,u),u) +% + kron(hx,hxu)*kron(kron(xf(-1),xf(-1)),u) + kron(hu,hxu)*kron(kron(u,xf(-1)),u) +% + kron(hx,1/2*hss)*xf(-1)*sig^2 + kron(hu,1/2*hss)*u*sig^2 +% Simplified using commutation matrix: +% kron(xf,xs) = kron(hx,hx)*kron(xf(-1),xs(-1)) +% + K_x_x*kron(hx,hu)*kron(xs(-1),u) +% + kron(hx,1/2*hxx)*kron(kron(xf(-1),xf(-1)),xf(-1)) +% + ( kron(hx,hxu) + K_x_x*kron(1/2*hxx,hu) )*kron(kron(xf(-1),xf(-1)),u) +% + ( kron(hx,1/2*huu) + K_x_x*kron(hxu,hu) )*kron(kron(xf(-1),u),u) +% + kron(hu,1/2*huu)*kron(kron(u,u),u) +% + kron(hx,1/2*hss)*xf(-1)*sig^2 +% + kron(hu,1/2*hss)*u*sig^2 +% +% Auxiliary equation kron(kron(xf,xf),xf) to set up the VAR(1) pruned state space system +% kron(kron(xf,xf),xf) = kron(kron(hx,hx),hx)*kron(kron(xf(-1),xf(-1)),xf(-1)) +% + kron(kron(hx,hu),hx)*kron(kron(xf(-1),u),xf(-1)) +% + kron(kron(hx,hx),hu)*kron(kron(xf(-1),xf(-1)),u) +% + kron(kron(hx,hu),hu)*kron(kron(xf(-1),u),u) +% + kron(kron(hu,hx),hx)*kron(kron(u,xf(-1)),xf(-1)) +% + kron(kron(hu,hu),hx)*kron(kron(u,u),xf(-1)) +% + kron(kron(hu,hx),hu)*kron(kron(u,xf(-1)),u) +% + kron(kron(hu,hu),hu)*kron(kron(u,u),u) +% Simplified using commutation matrix: +% kron(kron(xf,xf),xf) = kron(kron(hx,hx),hx)*kron(kron(xf(-1),xf(-1)),xf(-1)) +% + ( kron(kron(hx,hx),hu) + K_xx_x*kron(hx,(I_xx+K_x_x)*kron(hx,hu)) )*kron(kron(xf(-1),xf(-1)),u) +% + ( kron((I_xx+K_x_x)*kron(hx,hu),hu) + K_xx_x*kron(kron(hx,hu),hu) )*kron(kron(xf(-1),u),u) +% + kron(kron(hu,hu),hu)*kron(kron(u,u),u) +% +% Law of motion for control variables y (either VAROBS variables or if no VAROBS statement is given then for all endogenous variables) +% y = steady_state(y) +% + gx*( xf(-1)+xs(-1)+xrd(-1) ) +% + gu*u +% + 1/2*gxx*kron(xf(-1),xf(-1)) + gxx*kron(xf(-1),xs(-1)) +% + gxu*kron(xf(-1),u) + gxu*kron(xs(-1),u) +% + 1/2*guu*(kron(u,u)-Sigma_e+Sigma_e) +% + 1/2*gss*sig^2 +% + 1/6*gxxx*kron(kron(xf(-1),xf(-1)),xf(-1)) +% + 1/6*guuu*kron(kron(u,u),u) +% + 3/6*gxxu*kron(kron(xf(-1),xf(-1),u) +% + 3/6*gxuu*kron(kron(xf(-1),u),u) +% + 3/6*gxss*xf(-1)*sig^2 +% + 3/6*guss*u*sig^2 +% +% See code below how z and inov are defined at first, second, and third order, +% and how to set up A, B, C, D and compute unconditional first and second moments of inov, z and y -%% Auxiliary indices, numbers and flags +%% Auxiliary indices and objects order = options.order; +if isempty(options.qz_criterium) + % set default value for qz_criterium: if there are no unit roots one can use 1.0 + % If they are possible, you may have have multiple unit roots and the accuracy + % decreases when computing the eigenvalues in lyapunov_symm. Hence, we normally use 1+1e-6 + % Note that unit roots are only possible at first-order, at higher order we set it to 1 + options.qz_criterium = 1+1e-6; +end indx = [M.nstatic+(1:M.nspred) M.endo_nbr+(1:size(dr.ghx,2)-M.nspred)]'; -indy = (1:M.endo_nbr)'; %by default select all variables -compute_derivs = false; -if isfield(options,'options_ident') - compute_derivs = true; - stderrparam_nbr = length(options.options_ident.indpstderr); - corrparam_nbr = size(options.options_ident.indpcorr,1); - modparam_nbr = length(options.options_ident.indpmodel); +if isempty(indy) + indy = (1:M.endo_nbr)'; %by default select all variables in DR order +end +u_nbr = M.exo_nbr; +x_nbr = length(indx); +y_nbr = length(indy); +Yss = dr.ys(dr.order_var); +hx = dr.ghx(indx,:); +gx = dr.ghx(indy,:); +hu = dr.ghu(indx,:); +gu = dr.ghu(indy,:); +E_uu = M.Sigma_e; %this is E[u*u'] + +if compute_derivs + stderrparam_nbr = length(dr.derivs.indpstderr); + corrparam_nbr = size(dr.derivs.indpcorr,1); + modparam_nbr = length(dr.derivs.indpmodel); totparam_nbr = stderrparam_nbr+corrparam_nbr+modparam_nbr; - indy = options.options_ident.indvobs; -end -Yss = dr.ys(dr.order_var); if compute_derivs; dYss = dr.derivs.dYss; end -E_uu = M.Sigma_e; if compute_derivs; dE_uu = dr.derivs.dSigma_e; end -Correlation_matrix = M.Correlation_matrix; if compute_derivs; dCorrelation_matrix = dr.derivs.dCorrelation_matrix; end -ghx = dr.ghx; if compute_derivs; dghx = dr.derivs.dghx; end -ghu = dr.ghu; if compute_derivs; dghu = dr.derivs.dghu; end -Om = ghu*E_uu*transpose(ghu); if compute_derivs; dOm = dr.derivs.dOm; end -y_nbr = length(indy); -x_nbr = length(indx); -u_nbr = M.exo_nbr; - -% indices for extended state vector z and extended shock vector e -id_z1_xf = (1:x_nbr); -id_e1_u = (1:u_nbr); -if options.order > 1 - id_z2_xs = id_z1_xf(end) + (1:x_nbr); - id_z3_xf_xf = id_z2_xs(end) + (1:x_nbr*x_nbr); - id_e2_u_u = id_e1_u(end) + (1:u_nbr*u_nbr); - id_e3_xf_u = id_e2_u_u(end) + (1:x_nbr*u_nbr); - id_e4_u_xf = id_e3_xf_u(end) + (1:u_nbr*x_nbr); - - ghxx = dr.ghxx; if compute_derivs; dghxx = dr.derivs.dghxx; end - ghxu = dr.ghxu; if compute_derivs; dghxu = dr.derivs.dghxu; end - ghuu = dr.ghuu; if compute_derivs; dghuu = dr.derivs.dghuu; end - ghs2 = dr.ghs2; if compute_derivs; dghs2 = dr.derivs.dghs2; end -end -if options.order > 2 - id_z4_xrd = id_z3_xf_xf(end) + (1:x_nbr); - id_z5_xf_xs = id_z4_xrd(end) + (1:x_nbr*x_nbr); - id_z6_xf_xf_xf = id_z5_xf_xs(end) + (1:x_nbr*x_nbr*x_nbr); - id_e5_xs_u = id_e4_u_xf(end) + (1:x_nbr*u_nbr); - id_e6_u_xs = id_e5_xs_u(end) + (1:u_nbr*x_nbr); - id_e7_xf_xf_u = id_e6_u_xs(end) + (1:x_nbr*x_nbr*u_nbr); - id_e8_xf_u_xf = id_e7_xf_xf_u(end) + (1:x_nbr*u_nbr*x_nbr); - id_e9_u_xf_xf = id_e8_xf_u_xf(end) + (1:u_nbr*x_nbr*x_nbr); - id_e10_xf_u_u = id_e9_u_xf_xf(end) + (1:x_nbr*u_nbr*u_nbr); - id_e11_u_xf_u = id_e10_xf_u_u(end) + (1:u_nbr*x_nbr*u_nbr); - id_e12_u_u_xf = id_e11_u_xf_u(end) + (1:u_nbr*u_nbr*x_nbr); - id_e13_u_u_u = id_e12_u_u_xf(end) + (1:u_nbr*u_nbr*u_nbr); - - ghxxx = dr.ghxxx; if compute_derivs; dghxxx = dr.derivs.dghxxx; end - ghxxu = dr.ghxxu; if compute_derivs; dghxxu = dr.derivs.dghxxu; end - ghxuu = dr.ghxuu; if compute_derivs; dghxuu = dr.derivs.dghxuu; end - ghuuu = dr.ghuuu; if compute_derivs; dghuuu = dr.derivs.dghuuu; end - ghxss = dr.ghxss; if compute_derivs; dghxss = dr.derivs.dghxss; end - ghuss = dr.ghuss; if compute_derivs; dghuss = dr.derivs.dghuss; end + dYss = dr.derivs.dYss; + dhx = dr.derivs.dghx(indx,:,:); + dgx = dr.derivs.dghx(indy,:,:); + dhu = dr.derivs.dghu(indx,:,:); + dgu = dr.derivs.dghu(indy,:,:); + dE_uu = dr.derivs.dSigma_e; +end + +% first-order approximation indices for extended state vector z and extended innovations vector inov +id_z1_xf = (1:x_nbr); +id_inov1_u = (1:u_nbr); +if order > 1 + % second-order approximation indices for extended state vector z and extended innovations vector inov + id_z2_xs = id_z1_xf(end) + (1:x_nbr); + id_z3_xf_xf = id_z2_xs(end) + (1:x_nbr*x_nbr); + id_inov2_u_u = id_inov1_u(end) + (1:u_nbr*u_nbr); + id_inov3_xf_u = id_inov2_u_u(end) + (1:x_nbr*u_nbr); + + hxx = dr.ghxx(indx,:); + gxx = dr.ghxx(indy,:); + hxu = dr.ghxu(indx,:); + gxu = dr.ghxu(indy,:); + huu = dr.ghuu(indx,:); + guu = dr.ghuu(indy,:); + hss = dr.ghs2(indx,:); + gss = dr.ghs2(indy,:); + if compute_derivs + dhxx = dr.derivs.dghxx(indx,:,:); + dgxx = dr.derivs.dghxx(indy,:,:); + dhxu = dr.derivs.dghxu(indx,:,:); + dgxu = dr.derivs.dghxu(indy,:,:); + dhuu = dr.derivs.dghuu(indx,:,:); + dguu = dr.derivs.dghuu(indy,:,:); + dhss = dr.derivs.dghs2(indx,:); + dgss = dr.derivs.dghs2(indy,:); + end +end +if order > 2 + % third-order approximation indices for extended state vector z and extended innovations vector inov + id_z4_xrd = id_z3_xf_xf(end) + (1:x_nbr); + id_z5_xf_xs = id_z4_xrd(end) + (1:x_nbr*x_nbr); + id_z6_xf_xf_xf = id_z5_xf_xs(end) + (1:x_nbr*x_nbr*x_nbr); + id_inov4_xs_u = id_inov3_xf_u(end) + (1:x_nbr*u_nbr); + id_inov5_xf_xf_u = id_inov4_xs_u(end) + (1:x_nbr*x_nbr*u_nbr); + id_inov6_xf_u_u = id_inov5_xf_xf_u(end) + (1:x_nbr*u_nbr*u_nbr); + id_inov7_u_u_u = id_inov6_xf_u_u(end) + (1:u_nbr*u_nbr*u_nbr); + + hxxx = dr.ghxxx(indx,:); + gxxx = dr.ghxxx(indy,:); + hxxu = dr.ghxxu(indx,:); + gxxu = dr.ghxxu(indy,:); + hxuu = dr.ghxuu(indx,:); + gxuu = dr.ghxuu(indy,:); + huuu = dr.ghuuu(indx,:); + guuu = dr.ghuuu(indy,:); + hxss = dr.ghxss(indx,:); + gxss = dr.ghxss(indy,:); + huss = dr.ghuss(indx,:); + guss = dr.ghuss(indy,:); + if compute_derivs + dhxxx = dr.derivs.dghxxx(indx,:,:); + dgxxx = dr.derivs.dghxxx(indy,:,:); + dhxxu = dr.derivs.dghxxu(indx,:,:); + dgxxu = dr.derivs.dghxxu(indy,:,:); + dhxuu = dr.derivs.dghxuu(indx,:,:); + dgxuu = dr.derivs.dghxuu(indy,:,:); + dhuuu = dr.derivs.dghuuu(indx,:,:); + dguuu = dr.derivs.dghuuu(indy,:,:); + dhxss = dr.derivs.dghxss(indx,:,:); + dgxss = dr.derivs.dghxss(indy,:,:); + dhuss = dr.derivs.dghuss(indx,:,:); + dguss = dr.derivs.dghuss(indy,:,:); + end +end + +%% First-order state space system +% Auxiliary state vector z is defined by: z = [xf] +% Auxiliary innovations vector inov is defined by: inov = [u] +z_nbr = x_nbr; +inov_nbr = M.exo_nbr; +A = hx; +B = hu; +c = zeros(x_nbr,1); +C = gx; +D = gu; +d = zeros(y_nbr,1); +Varinov = E_uu; +E_inovzlag1 = zeros(inov_nbr,z_nbr); %at first-order E[inov*z(-1)'] = 0 +Om_z = B*Varinov*B'; +E_xf = zeros(x_nbr,1); + +lyapunov_symm_method = 1; %method=1 to initialize persistent variables +[Var_z,Schur_u] = lyapunov_symm(A, Om_z,... %at first-order this algorithm is well established and also used in th_autocovariances.m + options.lyapunov_fixed_point_tol, options.qz_criterium, options.lyapunov_complex_threshold,... + lyapunov_symm_method,... + options.debug); %we use Schur_u to take care of (possible) nonstationary VAROBS variables in moment computations +%find stationary vars +stationary_vars = (1:y_nbr)'; +if ~isempty(Schur_u) + %base this only on first order, because if first-order is stable so are the higher-order pruned systems + x = abs(gx*Schur_u); + stationary_vars = find(all(x < options.Schur_vec_tol,2)); end -%% First-order -z_nbr = x_nbr; -e_nbr = M.exo_nbr; -A = ghx(indx,:); -B = ghu(indx,:); -C = ghx(indy,:); -D = ghu(indy,:); -c = zeros(x_nbr,1); -d = zeros(y_nbr,1); -Varinov = E_uu; -E_z = zeros(x_nbr,1); %this is E_xf if compute_derivs == 1 - dA = dghx(indx,:,:); - dB = dghu(indx,:,:); - dC = dghx(indy,:,:); - dD = dghu(indy,:,:); - dc = zeros(x_nbr,totparam_nbr); - dd = zeros(y_nbr,totparam_nbr); - dVarinov = dE_uu; - dE_z = zeros(x_nbr,totparam_nbr); + dA = dhx; + dB = dhu; + dc = zeros(x_nbr,totparam_nbr); + dC = dgx; + dD = dgu; + dd = zeros(y_nbr,totparam_nbr); + dVarinov = dE_uu; + dE_xf = zeros(x_nbr,totparam_nbr); + dE_inovzlag1 = zeros(z_nbr,inov_nbr,totparam_nbr); + dVar_z = zeros(z_nbr,z_nbr,totparam_nbr); + lyapunov_symm_method = 2;%to spare a lot of computing time while not repeating Schur every time + for jp1 = 1:totparam_nbr + if jp1 <= stderrparam_nbr+corrparam_nbr + dOm_z_jp1 = B*dVarinov(:,:,jp1)*B'; + dVar_z(:,:,jp1) = lyapunov_symm(A, dOm_z_jp1,... + options.lyapunov_fixed_point_tol,options.qz_criterium,options.lyapunov_complex_threshold,... + lyapunov_symm_method,... + options.debug); + else + dOm_z_jp1 = dB(:,:,jp1)*Varinov*B' + B*Varinov*dB(:,:,jp1)'; + dVar_z(:,:,jp1) = lyapunov_symm(A, dA(:,:,jp1)*Var_z*A' + A*Var_z*dA(:,:,jp1)' + dOm_z_jp1,... + options.lyapunov_fixed_point_tol,options.qz_criterium,options.lyapunov_complex_threshold,... + lyapunov_symm_method,... + options.debug); + end + end end if order > 1 + options.qz_criterium = 1; %pruned state space has no unit roots % Some common and useful objects for order > 1 - % Compute E[xf*xf'] - E_xfxf = lyapunov_symm(ghx(indx,:), Om(indx,indx), options.lyapunov_fixed_point_tol, options.qz_criterium, options.lyapunov_complex_threshold, 1, options.debug); %use 1 to initialize persistent variables - K_ux = commutation(u_nbr,x_nbr); %commutation matrix - K_xu = commutation(x_nbr,u_nbr); %commutation matrix - QPu = quadruplication(u_nbr); %quadruplication matrix as in Meijer (2005), similar to Magnus-Neudecker definition of duplication matrix (i.e. dyn_vec) but for fourth-order product moments - %Compute unique product moments of E[kron(u*u',uu')] = E[kron(u,u)*kron(u,u)'] - COMBOS4 = flipud(allVL1(u_nbr, 4)); %all possible combinations of powers that sum up to four for fourth-order product moments of u - E_u_u_u_u = zeros(u_nbr*(u_nbr+1)/2*(u_nbr+2)/3*(u_nbr+3)/4,1); %only unique entries of E[kron(u,kron(u,kron(u,u)))] - if compute_derivs && (stderrparam_nbr+corrparam_nbr>0) - dE_u_u_u_u = zeros(u_nbr*(u_nbr+1)/2*(u_nbr+2)/3*(u_nbr+3)/4,stderrparam_nbr+corrparam_nbr); + E_xfxf = Var_z; + if compute_derivs + dE_xfxf = dVar_z; end - for j = 1:size(COMBOS4,1) - E_u_u_u_u(j) = prodmom(E_uu, 1:u_nbr, COMBOS4(j,:)); + hx_hx = kron(hx,hx); + hx_hu = kron(hx,hu); + hu_hu = kron(hu,hu); + I_xx = eye(x_nbr^2); + K_x_x = commutation(x_nbr,x_nbr,1); + invIx_hx = (eye(x_nbr)-hx)\eye(x_nbr); + + %Compute unique fourth order product moments of u, i.e. unique(E[kron(kron(kron(u,u),u),u)],'stable') + u_nbr4 = u_nbr*(u_nbr+1)/2*(u_nbr+2)/3*(u_nbr+3)/4; + QPu = quadruplication(u_nbr); + COMBOS4 = flipud(allVL1(u_nbr, 4)); %all possible (unique) combinations of powers that sum up to four + E_u_u_u_u = zeros(u_nbr4,1); %only unique entries + if compute_derivs && (stderrparam_nbr+corrparam_nbr>0) + dE_u_u_u_u = zeros(u_nbr4,stderrparam_nbr+corrparam_nbr); + end + for j4 = 1:size(COMBOS4,1) if compute_derivs && (stderrparam_nbr+corrparam_nbr>0) - dE_u_u_u_u(j,1:(stderrparam_nbr+corrparam_nbr)) = prodmom_deriv(E_uu, 1:u_nbr, COMBOS4(j,:), dE_uu(:,:,1:(stderrparam_nbr+corrparam_nbr)), dCorrelation_matrix(:,:,1:(stderrparam_nbr+corrparam_nbr))); + [E_u_u_u_u(j4), dE_u_u_u_u(j4,:)] = prodmom_deriv(E_uu, 1:u_nbr, COMBOS4(j4,:), dE_uu(:,:,1:(stderrparam_nbr+corrparam_nbr)), dr.derivs.dCorrelation_matrix(:,:,1:(stderrparam_nbr+corrparam_nbr))); + else + E_u_u_u_u(j4) = prodmom(E_uu, 1:u_nbr, COMBOS4(j4,:)); end end - E_u_u_u_u = QPu*E_u_u_u_u; %add duplicate product moments, i.e. this is E[kron(u,kron(u,kron(u,u)))] - E_uu_uu = reshape(E_u_u_u_u,u_nbr^2,u_nbr^2); %E[kron(u*u',uu')] = E[kron(u,u)*kron(u,u)'] + E_xfxf_uu = kron(E_xfxf,E_uu'); + +%% Second-order pruned state space system +% Auxiliary state vector z is defined by: z = [xf;xs;kron(xf,xf)] +% Auxiliary innovations vector inov is defined by: inov = [u;kron(u,u)-E_uu(:);kron(xf,u)] + z_nbr = x_nbr + x_nbr + x_nbr^2; + inov_nbr = u_nbr + u_nbr^2 + x_nbr*u_nbr; - % E[kron((xf*xf'),(u*u'))] - E_xfxf_E_uu = kron(E_xfxf,E_uu); - if compute_derivs - dE_xfxf = zeros(size(E_xfxf,1),size(E_xfxf,2),totparam_nbr); - dE_xfxf_E_uu = zeros(size(E_xfxf_E_uu,1),size(E_xfxf_E_uu,2),totparam_nbr); - for jp = 1:totparam_nbr - if jp <= (stderrparam_nbr+corrparam_nbr) - %Jacobian of E_xfxf wrt exogenous paramters: dE_xfxf(:,:,jp)-hx*dE_xfxf(:,:,jp)*hx'=dOm(:,:,jp), because dhx is zero by construction for stderr and corr parameters - dE_xfxf(:,:,jp) = lyapunov_symm(ghx(indx,:), dOm(indx,indx,jp),options.lyapunov_fixed_point_tol,options.qz_criterium,options.lyapunov_complex_threshold,2,options.debug); - else - %Jacobian of E_xfxf wrt model parameters: dE_xfxf(:,:,jp) - hx*dE_xfxf(:,:,jp)*hx' = d(hu*Sig_u*hu')(:,:,jp) + dhx(:,:,jp)*E_xfxf*hx'+ hx*E_xfxf*dhx(:,:,jp)' - dE_xfxf(:,:,jp) = lyapunov_symm(ghx(indx,:), dghx(indx,:,jp)*E_xfxf*ghx(indx,:)'+ghx(indx,:)*E_xfxf*dghx(indx,:,jp)'+dOm(indx,indx,jp),options.lyapunov_fixed_point_tol,options.qz_criterium,options.lyapunov_complex_threshold,2,options.debug); - %here method=2 is used to spare a lot of computing time while not repeating Schur every time - end - dE_xfxf_E_uu(:,:,jp) = kron(dE_xfxf(:,:,jp),E_uu) + kron(E_xfxf,dE_uu(:,:,jp)); - end - end - - % Second-order pruned state space system - z_nbr = x_nbr+x_nbr+x_nbr*x_nbr; - e_nbr = u_nbr+u_nbr*u_nbr+x_nbr*u_nbr+u_nbr*x_nbr; - A = zeros(z_nbr, z_nbr); - A(id_z1_xf , id_z1_xf ) = ghx(indx,:); - A(id_z2_xs , id_z2_xs ) = ghx(indx,:); - A(id_z2_xs , id_z3_xf_xf) = 0.5*ghxx(indx,:); - A(id_z3_xf_xf , id_z3_xf_xf) = kron(ghx(indx,:),ghx(indx,:)); - - B = zeros(z_nbr, e_nbr); - B(id_z1_xf , id_e1_u ) = ghu(indx,:); - B(id_z2_xs , id_e2_u_u ) = 0.5*ghuu(indx,:); - B(id_z2_xs , id_e3_xf_u) = ghxu(indx,:); - B(id_z3_xf_xf , id_e2_u_u ) = kron(ghu(indx,:),ghu(indx,:)); - B(id_z3_xf_xf , id_e3_xf_u) = kron(ghx(indx,:),ghu(indx,:)); - B(id_z3_xf_xf , id_e4_u_xf) = kron(ghu(indx,:),ghx(indx,:)); - - C = zeros(y_nbr, z_nbr); - C(1:y_nbr , id_z1_xf ) = ghx(indy,:); - C(1:y_nbr , id_z2_xs ) = ghx(indy,:); - C(1:y_nbr , id_z3_xf_xf) = 0.5*ghxx(indy,:); - - D = zeros(y_nbr, e_nbr); - D(1:y_nbr , id_e1_u ) = ghu(indy,:); - D(1:y_nbr , id_e2_u_u ) = 0.5*ghuu(indy,:); - D(1:y_nbr , id_e3_xf_u) = ghxu(indy,:); - + A(id_z1_xf , id_z1_xf ) = hx; + A(id_z2_xs , id_z2_xs ) = hx; + A(id_z2_xs , id_z3_xf_xf) = 1/2*hxx; + A(id_z3_xf_xf , id_z3_xf_xf) = hx_hx; + + B = zeros(z_nbr, inov_nbr); + B(id_z1_xf , id_inov1_u ) = hu; + B(id_z2_xs , id_inov2_u_u ) = 1/2*huu; + B(id_z2_xs , id_inov3_xf_u) = hxu; + B(id_z3_xf_xf , id_inov2_u_u ) = hu_hu; + B(id_z3_xf_xf , id_inov3_xf_u) = (I_xx+K_x_x)*hx_hu; + c = zeros(z_nbr, 1); - c(id_z2_xs , 1) = 0.5*ghs2(indx,:) + 0.5*ghuu(indx,:)*E_uu(:); - c(id_z3_xf_xf , 1) = kron(ghu(indx,:),ghu(indx,:))*E_uu(:); - - d = zeros(y_nbr, 1); - d(1:y_nbr, 1) = 0.5*ghs2(indy,:) + 0.5*ghuu(indy,:)*E_uu(:); + c(id_z2_xs , 1) = 1/2*hss + 1/2*huu*E_uu(:); + c(id_z3_xf_xf , 1) = hu_hu*E_uu(:); - Varinov = zeros(e_nbr,e_nbr); - Varinov(id_e1_u , id_e1_u) = E_uu; - Varinov(id_e2_u_u , id_e2_u_u) = E_uu_uu-E_uu(:)*transpose(E_uu(:)); - Varinov(id_e3_xf_u , id_e3_xf_u) = E_xfxf_E_uu; - Varinov(id_e4_u_xf , id_e3_xf_u) = K_ux*E_xfxf_E_uu; - Varinov(id_e3_xf_u , id_e4_u_xf) = transpose(Varinov(id_e4_u_xf,id_e3_xf_u)); - Varinov(id_e4_u_xf , id_e4_u_xf) = K_ux*E_xfxf_E_uu*transpose(K_ux); - - I_hx = speye(x_nbr)-ghx(indx,:); - I_hxinv = I_hx\speye(x_nbr); - E_xs = I_hxinv*(0.5*ghxx(indx,:)*E_xfxf(:) + c(x_nbr+(1:x_nbr),1)); - - E_z = [zeros(x_nbr,1); E_xs; E_xfxf(:)]; - if compute_derivs - dA = zeros(size(A,1),size(A,2),totparam_nbr); - dB = zeros(size(B,1),size(B,2),totparam_nbr); - dC = zeros(size(C,1),size(C,2),totparam_nbr); - dD = zeros(size(D,1),size(D,2),totparam_nbr); - dc = zeros(size(c,1),totparam_nbr); - dd = zeros(size(d,1),totparam_nbr); - dVarinov = zeros(size(Varinov,1),size(Varinov,2),totparam_nbr); - dE_xs = zeros(size(E_xs,1),size(E_xs,2),totparam_nbr); - dE_z = zeros(size(E_z,1),size(E_z,2),totparam_nbr); - for jp = 1:totparam_nbr - dA(id_z1_xf , id_z1_xf , jp) = dghx(indx,:,jp); - dA(id_z2_xs , id_z2_xs , jp) = dghx(indx,:,jp); - dA(id_z2_xs , id_z3_xf_xf , jp) = 0.5*dghxx(indx,:,jp); - dA(id_z3_xf_xf , id_z3_xf_xf , jp) = kron(dghx(indx,:,jp),ghx(indx,:)) + kron(ghx(indx,:),dghx(indx,:,jp)); + C = zeros(y_nbr, z_nbr); + C(: , id_z1_xf ) = gx; + C(: , id_z2_xs ) = gx; + C(: , id_z3_xf_xf) = 1/2*gxx; - dB(id_z1_xf , id_e1_u , jp) = dghu(indx,:,jp); - dB(id_z2_xs , id_e2_u_u , jp) = 0.5*dghuu(indx,:,jp); - dB(id_z2_xs , id_e3_xf_u , jp) = dghxu(indx,:,jp); - dB(id_z3_xf_xf , id_e2_u_u , jp) = kron(dghu(indx,:,jp),ghu(indx,:)) + kron(ghu(indx,:),dghu(indx,:,jp)); - dB(id_z3_xf_xf , id_e3_xf_u , jp) = kron(dghx(indx,:,jp),ghu(indx,:)) + kron(ghx(indx,:),dghu(indx,:,jp)); - dB(id_z3_xf_xf , id_e4_u_xf , jp) = kron(dghu(indx,:,jp),ghx(indx,:)) + kron(ghu(indx,:),dghx(indx,:,jp)); + D = zeros(y_nbr, inov_nbr); + D(: , id_inov1_u ) = gu; + D(: , id_inov2_u_u ) = 1/2*guu; + D(: , id_inov3_xf_u) = gxu; - dC(1:y_nbr , id_z1_xf , jp) = dghx(indy,:,jp); - dC(1:y_nbr , id_z2_xs , jp) = dghx(indy,:,jp); - dC(1:y_nbr , id_z3_xf_xf , jp) = 0.5*dghxx(indy,:,jp); + d = 1/2*gss + 1/2*guu*E_uu(:); - dD(1:y_nbr , id_e1_u , jp) = dghu(indy,:,jp); - dD(1:y_nbr , id_e2_u_u , jp) = 0.5*dghuu(indy,:,jp); - dD(1:y_nbr , id_e3_xf_u , jp) = dghxu(indy,:,jp); + Varinov = zeros(inov_nbr,inov_nbr); + Varinov(id_inov1_u , id_inov1_u) = E_uu; + %Varinov(id_inov1_u , id_inov2_u_u ) = zeros(u_nbr,u_nbr^2); + %Varinov(id_inov1_u , id_inov3_xf_u) = zeros(u_nbr,x_nbr*u_nbr); + %Varinov(id_inov2_u_u , id_inov1_u ) = zeros(u_nbr^2,u_nbr); + Varinov(id_inov2_u_u , id_inov2_u_u ) = reshape(QPu*E_u_u_u_u,u_nbr^2,u_nbr^2)-E_uu(:)*E_uu(:)'; + %Varinov(id_inov2_u_u , id_inov3_xf_u) = zeros(u_nbr^2,x_nbr*u_nbr); + %Varinov(id_inov3_xf_u , id_inov1_u ) = zeros(x_nbr*u_nbr,u_nbr); + %Varinov(id_inov3_xf_u , id_inov2_u_u ) = zeros(x_nbr*u_nbr,u_nbr^2); + Varinov(id_inov3_xf_u , id_inov3_xf_u) = E_xfxf_uu; - dc(id_z2_xs , jp) = 0.5*dghs2(indx,jp) + 0.5*(dghuu(indx,:,jp)*E_uu(:) + ghuu(indx,:)*vec(dE_uu(:,:,jp))); - dc(id_z3_xf_xf , jp) = (kron(dghu(indx,:,jp),ghu(indx,:)) + kron(ghu(indx,:),dghu(indx,:,jp)))*E_uu(:) + kron(ghu(indx,:),ghu(indx,:))*vec(dE_uu(:,:,jp)); + E_xs = invIx_hx*(1/2*hxx*E_xfxf(:) + c(id_z2_xs,1)); + E_inovzlag1 = zeros(inov_nbr,z_nbr); %at second-order E[z(-1)*inov'] = 0 + Om_z = B*Varinov*transpose(B); - dd(1:y_nbr , jp) = 0.5*dghs2(indy,jp) + 0.5*(dghuu(indy,:,jp)*E_uu(:) + ghuu(indy,:)*vec(dE_uu(:,:,jp))); + lyapunov_symm_method = 1; %method=1 to initialize persistent variables (if errorflag) + [Var_z, errorflag] = disclyap_fast(A,Om_z,options.lyapunov_doubling_tol); + if errorflag %use Schur-based method + fprintf('PRUNED_STATE_SPACE_SYSTEM: error flag in disclyap_fast at order=2, use lyapunov_symm\n'); + Var_z = lyapunov_symm(A,Om_z,... + options.lyapunov_fixed_point_tol,options.qz_criterium,options.lyapunov_complex_threshold,... + lyapunov_symm_method,... + options.debug); + lyapunov_symm_method = 2; %in the following we can reuse persistent variables + end + % Make sure some stuff is zero due to Gaussianity + Var_z(id_z1_xf , id_z2_xs ) = zeros(x_nbr,x_nbr); + Var_z(id_z1_xf , id_z3_xf_xf) = zeros(x_nbr,x_nbr^2); + Var_z(id_z2_xs , id_z1_xf ) = zeros(x_nbr,x_nbr); + Var_z(id_z3_xf_xf , id_z1_xf ) = zeros(x_nbr^2,x_nbr); - if jp <= (stderrparam_nbr+corrparam_nbr) - dVarinov(id_e1_u , id_e1_u , jp) = dE_uu(:,:,jp); - dVarinov(id_e2_u_u , id_e2_u_u , jp) = reshape(QPu*dE_u_u_u_u(:,jp), u_nbr^2, u_nbr^2) - (reshape(dE_uu(:,:,jp),u_nbr^2,1)*transpose(E_uu(:)) + E_uu(:)*transpose(reshape(dE_uu(:,:,jp),u_nbr^2,1))); + if compute_derivs + dA = zeros(z_nbr,z_nbr,totparam_nbr); + dB = zeros(z_nbr,inov_nbr,totparam_nbr); + dc = zeros(z_nbr,totparam_nbr); + dC = zeros(y_nbr,z_nbr,totparam_nbr); + dD = zeros(y_nbr,inov_nbr,totparam_nbr); + dd = zeros(y_nbr,totparam_nbr); + dVarinov = zeros(inov_nbr,inov_nbr,totparam_nbr); + dE_xs = zeros(x_nbr,totparam_nbr); + dE_inovzlag1 = zeros(inov_nbr,z_nbr,totparam_nbr); + dVar_z = zeros(z_nbr,z_nbr,totparam_nbr); + + for jp2 = 1:totparam_nbr + if jp2 <= (stderrparam_nbr+corrparam_nbr) + dE_uu_jp2 = dE_uu(:,:,jp2); + dE_u_u_u_u_jp2 = QPu*dE_u_u_u_u(:,jp2); + else + dE_uu_jp2 = zeros(u_nbr,u_nbr); + dE_u_u_u_u_jp2 = zeros(u_nbr^4,1); end - dVarinov(id_e3_xf_u , id_e3_xf_u , jp) = dE_xfxf_E_uu(:,:,jp); - dVarinov(id_e4_u_xf , id_e3_xf_u , jp) = K_ux*dE_xfxf_E_uu(:,:,jp); - dVarinov(id_e3_xf_u , id_e4_u_xf , jp) = transpose(dVarinov(id_e4_u_xf,id_e3_xf_u,jp)); - dVarinov(id_e4_u_xf , id_e4_u_xf , jp) = dVarinov(id_e4_u_xf , id_e3_xf_u , jp)*transpose(K_ux); + dhx_jp2 = dhx(:,:,jp2); + dhu_jp2 = dhu(:,:,jp2); + dhxx_jp2 = dhxx(:,:,jp2); + dhxu_jp2 = dhxu(:,:,jp2); + dhuu_jp2 = dhuu(:,:,jp2); + dhss_jp2 = dhss(:,jp2); + dgx_jp2 = dgx(:,:,jp2); + dgu_jp2 = dgu(:,:,jp2); + dgxx_jp2 = dgxx(:,:,jp2); + dgxu_jp2 = dgxu(:,:,jp2); + dguu_jp2 = dguu(:,:,jp2); + dgss_jp2 = dgss(:,jp2); + dhx_hx_jp2 = kron(dhx_jp2,hx) + kron(hx,dhx_jp2); + dhu_hu_jp2 = kron(dhu_jp2,hu) + kron(hu,dhu_jp2); + dhx_hu_jp2 = kron(dhx_jp2,hu) + kron(hx,dhu_jp2); + dE_xfxf_jp2 = dE_xfxf(:,:,jp2); + dE_xfxf_uu_jp2 = kron(dE_xfxf_jp2,E_uu) + kron(E_xfxf,dE_uu_jp2); + + dA(id_z1_xf , id_z1_xf , jp2) = dhx_jp2; + dA(id_z2_xs , id_z2_xs , jp2) = dhx_jp2; + dA(id_z2_xs , id_z3_xf_xf , jp2) = 1/2*dhxx_jp2; + dA(id_z3_xf_xf , id_z3_xf_xf , jp2) = dhx_hx_jp2; + + dB(id_z1_xf , id_inov1_u , jp2) = dhu_jp2; + dB(id_z2_xs , id_inov2_u_u , jp2) = 1/2*dhuu_jp2; + dB(id_z2_xs , id_inov3_xf_u , jp2) = dhxu_jp2; + dB(id_z3_xf_xf , id_inov2_u_u , jp2) = dhu_hu_jp2; + dB(id_z3_xf_xf , id_inov3_xf_u , jp2) = (I_xx+K_x_x)*dhx_hu_jp2; + + dc(id_z2_xs , jp2) = 1/2*dhss_jp2 + 1/2*dhuu_jp2*E_uu(:) + 1/2*huu*dE_uu_jp2(:); + dc(id_z3_xf_xf , jp2) = dhu_hu_jp2*E_uu(:) + hu_hu*dE_uu_jp2(:); + + dC(: , id_z1_xf , jp2) = dgx_jp2; + dC(: , id_z2_xs , jp2) = dgx_jp2; + dC(: , id_z3_xf_xf , jp2) = 1/2*dgxx_jp2; + + dD(: , id_inov1_u , jp2) = dgu_jp2; + dD(: , id_inov2_u_u , jp2) = 1/2*dguu_jp2; + dD(: , id_inov3_xf_u , jp2) = dgxu_jp2; + + dd(:,jp2) = 1/2*dgss_jp2 + 1/2*guu*dE_uu_jp2(:) + 1/2*dguu_jp2*E_uu(:); + + dVarinov(id_inov1_u , id_inov1_u , jp2) = dE_uu_jp2; + dVarinov(id_inov2_u_u , id_inov2_u_u , jp2) = reshape(dE_u_u_u_u_jp2,u_nbr^2,u_nbr^2) - dE_uu_jp2(:)*E_uu(:)' - E_uu(:)*dE_uu_jp2(:)'; + dVarinov(id_inov3_xf_u , id_inov3_xf_u , jp2) = dE_xfxf_uu_jp2; - dE_xs(:,jp) = I_hxinv*( dghx(indx,:,jp)*E_xs + 1/2*(dghxx(indx,:,jp)*E_xfxf(:) + ghxx(indx,:)*vec(dE_xfxf(:,:,jp)) + dc(x_nbr+(1:x_nbr),jp)) ); - dE_z(:,jp) = [zeros(x_nbr,1); dE_xs(:,jp); vec(dE_xfxf(:,:,jp))]; + dE_xs(:,jp2) = invIx_hx*( dhx_jp2*E_xs + 1/2*dhxx_jp2*E_xfxf(:) + 1/2*hxx*dE_xfxf_jp2(:) + dc(id_z2_xs,jp2) ); + dOm_z_jp2 = dB(:,:,jp2)*Varinov*B' + B*dVarinov(:,:,jp2)*B' + B*Varinov*dB(:,:,jp2)'; + + [dVar_z(:,:,jp2), errorflag] = disclyap_fast(A, dA(:,:,jp2)*Var_z*A' + A*Var_z*dA(:,:,jp2)' + dOm_z_jp2, options.lyapunov_doubling_tol); + if errorflag + dVar_z(:,:,jp2) = lyapunov_symm(A, dA(:,:,jp2)*Var_z*A' + A*Var_z*dA(:,:,jp2)' + dOm_z_jp2,... + options.lyapunov_fixed_point_tol,options.qz_criterium,options.lyapunov_complex_threshold,... + lyapunov_symm_method,... + options.debug); + if lyapunov_symm_method == 1 + lyapunov_symm_method = 2; %now we can reuse persistent schur + end + end + % Make sure some stuff is zero due to Gaussianity + dVar_z(id_z1_xf , id_z2_xs , jp2) = zeros(x_nbr,x_nbr); + dVar_z(id_z1_xf , id_z3_xf_xf , jp2) = zeros(x_nbr,x_nbr^2); + dVar_z(id_z2_xs , id_z1_xf , jp2) = zeros(x_nbr,x_nbr); + dVar_z(id_z3_xf_xf , id_z1_xf , jp2) = zeros(x_nbr^2,x_nbr); end end if order > 2 - Q6Pu = Q6_plication(u_nbr); %quadruplication matrix as in Meijer (2005), similar to Magnus-Neudecker definition of duplication matrix (i.e. dyn_vec) but for fourth-order product moments - %Compute unique product moments of E[kron(u*u',uu')] = E[kron(u,u)*kron(u,u)'] - COMBOS6 = flipud(allVL1(u_nbr, 6)); %all possible combinations of powers that sum up to four for fourth-order product moments of u - E_u_u_u_u_u_u = zeros(u_nbr*(u_nbr+1)/2*(u_nbr+2)/3*(u_nbr+3)/4*(u_nbr+4)/5*(u_nbr+5)/6,1); %only unique entries of E[kron(u,kron(u,kron(u,kron(u,kron(u,u)))))] - if compute_derivs && (stderrparam_nbr+corrparam_nbr>0) - dE_u_u_u_u_u_u = zeros(size(E_u_u_u_u_u_u,1),stderrparam_nbr+corrparam_nbr); - end - for j = 1:size(COMBOS6,1) - E_u_u_u_u_u_u(j) = prodmom(E_uu, 1:u_nbr, COMBOS6(j,:)); - if compute_derivs && (stderrparam_nbr+corrparam_nbr>0) - dE_u_u_u_u_u_u(j,1:(stderrparam_nbr+corrparam_nbr)) = prodmom_deriv(E_uu, 1:u_nbr, COMBOS6(j,:), dE_uu(:,:,1:(stderrparam_nbr+corrparam_nbr)), dCorrelation_matrix(:,:,1:(stderrparam_nbr+corrparam_nbr))); - end - end + % Some common and useful objects for order > 2 + K_u_xx = commutation(u_nbr,x_nbr^2,1); + K_u_ux = commutation(u_nbr,u_nbr*x_nbr,1); + hx_hss2 = kron(hx,1/2*hss); + hu_hss2 = kron(hu,1/2*hss); + hx_hxx2 = kron(hx,1/2*hxx); + hxx2_hu = kron(1/2*hxx,hu); + hx_hxu = kron(hx,hxu); + hxu_hu = kron(hxu,hu); + hx_huu2 = kron(hx,1/2*huu); + hu_huu2 = kron(hu,1/2*huu); + hx_hx_hx = kron(hx,hx_hx); + hx_hx_hu = kron(hx_hx,hu); + hu_hx_hx = kron(hu,hx_hx); + hu_hu_hu = kron(hu_hu,hu); + hx_hu_hu = kron(hx,hu_hu); + hu_hx_hu = kron(hu,hx_hu); + invIxx_hx_hx = (eye(x_nbr^2)-hx_hx)\eye(x_nbr^2); - Var_z = lyapunov_symm(A, B*Varinov*transpose(B), options.lyapunov_fixed_point_tol, options.qz_criterium, options.lyapunov_complex_threshold, 1, options.debug); - %E_xfxf = Var_z(id_z1_xf,id_z1_xf); %this is E_xfxf, as E_xf=0, we already have that - E_xfxs = Var_z(id_z1_xf,id_z2_xs); %as E_xf=0 - E_xf_xf_xf = vec(Var_z(id_z1_xf,id_z3_xf_xf)); %as E_xf=0, this is vec(E[xf*kron(xf,xf)']) - E_xsxf = Var_z(id_z2_xs,id_z1_xf); %as E_xf=0 - E_xsxs = Var_z(id_z2_xs,id_z2_xs) + E_xs*transpose(E_xs); - E_xs_xf_xf = vec(Var_z(id_z2_xs,id_z3_xf_xf)+E_xs*E_xfxf(:)'); %this is vec(E[xs*kron(xf,xf)']) - %E_xf_xf_xf = vec(Var_z(id_z3_xf_xf,id_z1_xf)); - E_xf_xf_xs = vec(Var_z(id_z3_xf_xf,id_z2_xs) + E_xfxf(:)*E_xs'); - E_xf_xf_xf_xf = vec(Var_z(id_z3_xf_xf,id_z3_xf_xf) + E_xfxf(:)*E_xfxf(:)'); - %E_xs_E_uu = kron(E_xs,E_uu); - E_xfxs_E_uu = kron(E_xfxs,E_uu); - - z_nbr = x_nbr+x_nbr+x_nbr^2+x_nbr+x_nbr*x_nbr+x_nbr^3; - e_nbr = u_nbr+u_nbr^2+x_nbr*u_nbr+u_nbr*x_nbr+x_nbr*u_nbr+u_nbr*x_nbr+x_nbr*x_nbr*u_nbr+x_nbr*u_nbr*x_nbr+u_nbr*x_nbr*x_nbr+u_nbr*u_nbr*x_nbr+u_nbr*x_nbr*u_nbr+x_nbr*u_nbr*u_nbr+u_nbr*u_nbr*u_nbr; - hx_hx = kron(ghx(indx,:),ghx(indx,:)); - hu_hu = kron(ghu(indx,:),ghu(indx,:)); - hx_hu = kron(ghx(indx,:),ghu(indx,:)); - hu_hx = kron(ghu(indx,:),ghx(indx,:)); - + % Reuse second-order results + %E_xfxf = Var_z(id_z1_xf, id_z1_xf ); %this is E[xf*xf'], we already have that + %E_xfxs = Var_z(id_z1_xf, id_z2_xs ); %this is E[xf*xs']=0 due to gaussianity + %E_xfxf_xf = Var_z(id_z1_xf, id_z3_xf_xf ); %this is E[xf*kron(xf_xf)']=0 due to gaussianity + %E_xsxf = Var_z(id_z2_xs, id_z1_xf ); %this is E[xs*xf']=0 due to gaussianity + E_xsxs = Var_z(id_z2_xs, id_z2_xs ) + E_xs*transpose(E_xs); %this is E[xs*xs'] + E_xsxf_xf = Var_z(id_z2_xs, id_z3_xf_xf ) + E_xs*E_xfxf(:)'; %this is E[xs*kron(xf,xf)'] + %E_xf_xfxf = Var_z(id_z3_xf_xf, id_z1_xf ); %this is E[kron(xf,xf)*xf']=0 due to gaussianity + E_xf_xfxs = Var_z(id_z3_xf_xf, id_z2_xs ) + E_xfxf(:)*E_xs'; %this is E[kron(xf,xf)*xs'] + E_xf_xfxf_xf = Var_z(id_z3_xf_xf, id_z3_xf_xf) + E_xfxf(:)*E_xfxf(:)'; %this is E[kron(xf,xf)*kron(xf,xf)'] + E_xrdxf = reshape(invIxx_hx_hx*vec(... + hxx*reshape( commutation(x_nbr^2,x_nbr,1)*E_xf_xfxs(:), x_nbr^2,x_nbr)*hx'... + + hxu*kron(E_xs,E_uu)*hu'... + + 1/6*hxxx*reshape(E_xf_xfxf_xf,x_nbr^3,x_nbr)*hx'... + + 1/6*huuu*reshape(QPu*E_u_u_u_u,u_nbr^3,u_nbr)*hu'... + + 3/6*hxxu*kron(E_xfxf(:),E_uu)*hu'... + + 3/6*hxuu*kron(E_xfxf,E_uu(:))*hx'... + + 3/6*hxss*E_xfxf*hx'... + + 3/6*huss*E_uu*hu'... + ),... + x_nbr,x_nbr); %this is E[xrd*xf'] if compute_derivs - dVar_z = zeros(size(Var_z,1),size(Var_z,2),totparam_nbr); - dE_xfxs = zeros(size(E_xfxs,1),size(E_xfxs,2),totparam_nbr); - dE_xf_xf_xf = zeros(size(E_xf_xf_xf,1),totparam_nbr); - dE_xsxf = zeros(size(E_xsxf,1),size(E_xsxf,2),totparam_nbr); - dE_xsxs = zeros(size(E_xsxs,1),size(E_xsxs,2),totparam_nbr); - dE_xs_xf_xf = zeros(size(E_xs_xf_xf,1),totparam_nbr); - dE_xf_xf_xs = zeros(size(E_xf_xf_xs,1),totparam_nbr); - dE_xf_xf_xf_xf = zeros(size(E_xf_xf_xf_xf,1),totparam_nbr); - dE_xfxs_E_uu = zeros(size(E_xfxs_E_uu,1),size(E_xfxs_E_uu,2),totparam_nbr); - dhx_hx = zeros(size(hx_hx,1),size(hx_hx,2),totparam_nbr); - dhu_hu = zeros(size(hu_hu,1),size(hu_hu,2),totparam_nbr); - dhx_hu = zeros(size(hx_hu,1),size(hx_hu,2),totparam_nbr); - dhu_hx = zeros(size(hu_hx,1),size(hu_hx,2),totparam_nbr); - for jp=1:totparam_nbr - dVar_z(:,:,jp) = lyapunov_symm(A, dB(:,:,jp)*Varinov*transpose(B) + B*dVarinov(:,:,jp)*transpose(B) +B*Varinov*transpose(dB(:,:,jp)) + dA(:,:,jp)*Var_z*A' + A*Var_z*transpose(dA(:,:,jp)),... ,... - options.lyapunov_fixed_point_tol, options.qz_criterium, options.lyapunov_complex_threshold, 2, options.debug); %2 is used as we use 1 above - dE_xfxs(:,:,jp) = dVar_z(id_z1_xf,id_z2_xs,jp); - dE_xf_xf_xf(:,jp) = vec(dVar_z(id_z1_xf,id_z3_xf_xf,jp)); - dE_xsxf(:,:,jp) = dVar_z(id_z2_xs,id_z1_xf,jp); - dE_xsxs(:,:,jp) = dVar_z(id_z2_xs,id_z2_xs,jp) + dE_xs(:,jp)*transpose(E_xs) + E_xs*transpose(dE_xs(:,jp)); - dE_xs_xf_xf(:,jp) = vec(dVar_z(id_z2_xs,id_z3_xf_xf,jp) + dE_xs(:,jp)*E_xfxf(:)' + E_xs*vec(dE_xfxf(:,:,jp))'); - dE_xf_xf_xs(:,jp) = vec(dVar_z(id_z3_xf_xf,id_z2_xs,jp) + vec(dE_xfxf(:,:,jp))*E_xs' + E_xfxf(:)*dE_xs(:,jp)'); - dE_xf_xf_xf_xf(:,jp) = vec(dVar_z(id_z3_xf_xf,id_z3_xf_xf,jp) + vec(dE_xfxf(:,:,jp))*E_xfxf(:)' + E_xfxf(:)*vec(dE_xfxf(:,:,jp))'); - dE_xfxs_E_uu(:,:,jp) = kron(dE_xfxs(:,:,jp),E_uu) + kron(E_xfxs,dE_uu(:,:,jp)); - - dhx_hx(:,:,jp) = kron(dghx(indx,:,jp),ghx(indx,:)) + kron(ghx(indx,:),dghx(indx,:,jp)); - dhu_hu(:,:,jp) = kron(dghu(indx,:,jp),ghu(indx,:)) + kron(ghu(indx,:),dghu(indx,:,jp)); - dhx_hu(:,:,jp) = kron(dghx(indx,:,jp),ghu(indx,:)) + kron(ghx(indx,:),dghu(indx,:,jp)); - dhu_hx(:,:,jp) = kron(dghu(indx,:,jp),ghx(indx,:)) + kron(ghu(indx,:),dghx(indx,:,jp)); + dE_xsxs = zeros(x_nbr,x_nbr,totparam_nbr); + dE_xsxf_xf = zeros(x_nbr,x_nbr^2,totparam_nbr); + dE_xf_xfxs = zeros(x_nbr^2,x_nbr,totparam_nbr); + dE_xf_xfxf_xf = zeros(x_nbr^2,x_nbr^2,totparam_nbr); + dE_xrdxf = zeros(x_nbr,x_nbr,totparam_nbr); + for jp2 = 1:totparam_nbr + if jp2 < (stderrparam_nbr+corrparam_nbr) + dE_u_u_u_u_jp2 = QPu*dE_u_u_u_u(:,jp2); + else + dE_u_u_u_u_jp2 = zeros(u_nbr^4,1); + end + dE_xsxs(:,:,jp2) = dVar_z(id_z2_xs , id_z2_xs , jp2) + dE_xs(:,jp2)*transpose(E_xs) + E_xs*transpose(dE_xs(:,jp2)); + dE_xsxf_xf(:,:,jp2) = dVar_z(id_z2_xs , id_z3_xf_xf , jp2) + dE_xs(:,jp2)*E_xfxf(:)' + E_xs*vec(dE_xfxf(:,:,jp2))'; + dE_xf_xfxs(:,:,jp2) = dVar_z(id_z3_xf_xf , id_z2_xs , jp2) + vec(dE_xfxf(:,:,jp2))*E_xs' + E_xfxf(:)*dE_xs(:,jp2)'; + dE_xf_xfxf_xf(:,:,jp2) = dVar_z(id_z3_xf_xf , id_z3_xf_xf , jp2) + vec(dE_xfxf(:,:,jp2))*E_xfxf(:)' + E_xfxf(:)*vec(dE_xfxf(:,:,jp2))'; + dE_xrdxf(:,:,jp2) = reshape(invIxx_hx_hx*vec(... + dhx(:,:,jp2)*E_xrdxf*hx' + hx*E_xrdxf*dhx(:,:,jp2)'... + + dhxx(:,:,jp2)*reshape( commutation(x_nbr^2,x_nbr,1)*E_xf_xfxs(:), x_nbr^2,x_nbr)*hx' + hxx*reshape( commutation(x_nbr^2,x_nbr,1)*vec(dE_xf_xfxs(:,:,jp2)), x_nbr^2,x_nbr)*hx' + hxx*reshape( commutation(x_nbr^2,x_nbr,1)*E_xf_xfxs(:), x_nbr^2,x_nbr)*dhx(:,:,jp2)'... + + dhxu(:,:,jp2)*kron(E_xs,E_uu)*hu' + hxu*kron(dE_xs(:,jp2),E_uu)*hu' + hxu*kron(E_xs,dE_uu(:,:,jp2))*hu' + hxu*kron(E_xs,E_uu)*dhu(:,:,jp2)'... + + 1/6*dhxxx(:,:,jp2)*reshape(E_xf_xfxf_xf,x_nbr^3,x_nbr)*hx' + 1/6*hxxx*reshape(dE_xf_xfxf_xf(:,:,jp2),x_nbr^3,x_nbr)*hx' + 1/6*hxxx*reshape(E_xf_xfxf_xf,x_nbr^3,x_nbr)*dhx(:,:,jp2)'... + + 1/6*dhuuu(:,:,jp2)*reshape(QPu*E_u_u_u_u,u_nbr^3,u_nbr)*hu' + 1/6*huuu*reshape(dE_u_u_u_u_jp2,u_nbr^3,u_nbr)*hu' + 1/6*huuu*reshape(QPu*E_u_u_u_u,u_nbr^3,u_nbr)*dhu(:,:,jp2)'... + + 3/6*dhxxu(:,:,jp2)*kron(E_xfxf(:),E_uu)*hu' + 3/6*hxxu*kron(vec(dE_xfxf(:,:,jp2)),E_uu)*hu' + 3/6*hxxu*kron(E_xfxf(:),dE_uu(:,:,jp2))*hu' + 3/6*hxxu*kron(E_xfxf(:),E_uu)*dhu(:,:,jp2)'... + + 3/6*dhxuu(:,:,jp2)*kron(E_xfxf,E_uu(:))*hx' + 3/6*hxuu*kron(dE_xfxf(:,:,jp2),E_uu(:))*hx' + 3/6*hxuu*kron(E_xfxf,vec(dE_uu(:,:,jp2)))*hx' + 3/6*hxuu*kron(E_xfxf,E_uu(:))*dhx(:,:,jp2)'... + + 3/6*dhxss(:,:,jp2)*E_xfxf*hx' + 3/6*hxss*dE_xfxf(:,:,jp2)*hx' + 3/6*hxss*E_xfxf*dhx(:,:,jp2)'... + + 3/6*dhuss(:,:,jp2)*E_uu*hu' + 3/6*huss*dE_uu(:,:,jp2)*hu' + 3/6*huss*E_uu*dhu(:,:,jp2)'... + ), x_nbr, x_nbr); end end + % Compute unique sixth-order product moments of u, i.e. unique(E[kron(kron(kron(kron(kron(u,u),u),u),u),u)],'stable') + u_nbr6 = u_nbr*(u_nbr+1)/2*(u_nbr+2)/3*(u_nbr+3)/4*(u_nbr+4)/5*(u_nbr+5)/6; + Q6Pu = Q6_plication(u_nbr); + COMBOS6 = flipud(allVL1(u_nbr, 6)); %all possible (unique) combinations of powers that sum up to six + E_u_u_u_u_u_u = zeros(u_nbr6,1); %only unique entries + if compute_derivs && (stderrparam_nbr+corrparam_nbr>0) + dE_u_u_u_u_u_u = zeros(u_nbr6,stderrparam_nbr+corrparam_nbr); + end + for j6 = 1:size(COMBOS6,1) + if compute_derivs && (stderrparam_nbr+corrparam_nbr>0) + [E_u_u_u_u_u_u(j6), dE_u_u_u_u_u_u(j6,:)] = prodmom_deriv(E_uu, 1:u_nbr, COMBOS6(j6,:), dE_uu(:,:,1:(stderrparam_nbr+corrparam_nbr)), dr.derivs.dCorrelation_matrix(:,:,1:(stderrparam_nbr+corrparam_nbr))); + else + E_u_u_u_u_u_u(j6) = prodmom(E_uu, 1:u_nbr, COMBOS6(j6,:)); + end + end + +%% Third-order pruned state space system +% Auxiliary state vector z is defined by: z = [xf; xs; kron(xf,xf); xrd; kron(xf,xs); kron(kron(xf,xf),xf)] +% Auxiliary innovations vector inov is defined by: inov = [u; kron(u,u)-E_uu(:); kron(xf,u); kron(xs,u); kron(kron(xf,xf),u); kron(kron(xf,u),u); kron(kron(u,u),u))] + z_nbr = x_nbr + x_nbr + x_nbr^2 + x_nbr + x_nbr^2 + x_nbr^3; + inov_nbr = u_nbr + u_nbr^2 + x_nbr*u_nbr + x_nbr*u_nbr + x_nbr^2*u_nbr + x_nbr*u_nbr^2 + u_nbr^3; + A = zeros(z_nbr,z_nbr); - A(id_z1_xf , id_z1_xf ) = ghx(indx,:); - A(id_z2_xs , id_z2_xs ) = ghx(indx,:); - A(id_z2_xs , id_z3_xf_xf ) = 1/2*ghxx(indx,:); + A(id_z1_xf , id_z1_xf ) = hx; + A(id_z2_xs , id_z2_xs ) = hx; + A(id_z2_xs , id_z3_xf_xf ) = 1/2*hxx; A(id_z3_xf_xf , id_z3_xf_xf ) = hx_hx; - A(id_z4_xrd , id_z1_xf ) = 3/6*ghxss(indx,:); - A(id_z4_xrd , id_z4_xrd ) = ghx(indx,:); - A(id_z4_xrd , id_z5_xf_xs ) = ghxx(indx,:); - A(id_z4_xrd , id_z6_xf_xf_xf) = 1/6*ghxxx(indx,:); - A(id_z5_xf_xs , id_z1_xf ) = kron(ghx(indx,:),1/2*ghs2(indx,:)); + A(id_z4_xrd , id_z1_xf ) = 3/6*hxss; + A(id_z4_xrd , id_z4_xrd ) = hx; + A(id_z4_xrd , id_z5_xf_xs ) = hxx; + A(id_z4_xrd , id_z6_xf_xf_xf) = 1/6*hxxx; + A(id_z5_xf_xs , id_z1_xf ) = hx_hss2; A(id_z5_xf_xs , id_z5_xf_xs ) = hx_hx; - A(id_z5_xf_xs , id_z6_xf_xf_xf) = kron(ghx(indx,:),1/2*ghxx(indx,:)); - A(id_z6_xf_xf_xf , id_z6_xf_xf_xf) = kron(ghx(indx,:),hx_hx); + A(id_z5_xf_xs , id_z6_xf_xf_xf) = hx_hxx2; + A(id_z6_xf_xf_xf , id_z6_xf_xf_xf) = hx_hx_hx; - B = zeros(z_nbr,e_nbr); - B(id_z1_xf , id_e1_u ) = ghu(indx,:); - B(id_z2_xs , id_e2_u_u ) = 1/2*ghuu(indx,:); - B(id_z2_xs , id_e3_xf_u ) = ghxu(indx,:); - B(id_z3_xf_xf , id_e2_u_u ) = hu_hu; - B(id_z3_xf_xf , id_e3_xf_u ) = hx_hu; - B(id_z3_xf_xf , id_e4_u_xf ) = hu_hx; - B(id_z4_xrd , id_e1_u ) = 3/6*ghuss(indx,:); - B(id_z4_xrd , id_e5_xs_u ) = ghxu(indx,:); - B(id_z4_xrd , id_e7_xf_xf_u) = 3/6*ghxxu(indx,:); - B(id_z4_xrd , id_e10_xf_u_u) = 3/6*ghxuu(indx,:); - B(id_z4_xrd , id_e13_u_u_u ) = 1/6*ghuuu(indx,:); - B(id_z5_xf_xs , id_e1_u ) = kron(ghu(indx,:),1/2*ghs2(indx,:)); - B(id_z5_xf_xs , id_e6_u_xs ) = hu_hx; - B(id_z5_xf_xs , id_e7_xf_xf_u) = kron(ghx(indx,:),ghxu(indx,:)); - B(id_z5_xf_xs , id_e9_u_xf_xf) = kron(ghu(indx,:),1/2*ghxx(indx,:)); - B(id_z5_xf_xs , id_e10_xf_u_u) = kron(ghx(indx,:),1/2*ghuu(indx,:)); - B(id_z5_xf_xs , id_e11_u_xf_u) = kron(ghu(indx,:),ghxu(indx,:)); - B(id_z5_xf_xs , id_e13_u_u_u ) = kron(ghu(indx,:),1/2*ghuu(indx,:)); - B(id_z6_xf_xf_xf , id_e7_xf_xf_u) = kron(hx_hx,ghu(indx,:)); - B(id_z6_xf_xf_xf , id_e8_xf_u_xf) = kron(ghx(indx,:),hu_hx); - B(id_z6_xf_xf_xf , id_e9_u_xf_xf) = kron(ghu(indx,:),hx_hx); - B(id_z6_xf_xf_xf , id_e10_xf_u_u) = kron(hx_hu,ghu(indx,:)); - B(id_z6_xf_xf_xf , id_e11_u_xf_u) = kron(ghu(indx,:),hx_hu); - B(id_z6_xf_xf_xf , id_e12_u_u_xf) = kron(hu_hu,ghx(indx,:)); - B(id_z6_xf_xf_xf , id_e13_u_u_u ) = kron(ghu(indx,:),hu_hu); + B = zeros(z_nbr,inov_nbr); + B(id_z1_xf , id_inov1_u ) = hu; + B(id_z2_xs , id_inov2_u_u ) = 1/2*huu; + B(id_z2_xs , id_inov3_xf_u ) = hxu; + B(id_z3_xf_xf , id_inov2_u_u ) = hu_hu; + B(id_z3_xf_xf , id_inov3_xf_u ) = (I_xx+K_x_x)*hx_hu; + B(id_z4_xrd , id_inov1_u ) = 3/6*huss; + B(id_z4_xrd , id_inov4_xs_u ) = hxu; + B(id_z4_xrd , id_inov5_xf_xf_u) = 3/6*hxxu; + B(id_z4_xrd , id_inov6_xf_u_u ) = 3/6*hxuu; + B(id_z4_xrd , id_inov7_u_u_u ) = 1/6*huuu; + B(id_z5_xf_xs , id_inov1_u ) = hu_hss2; + B(id_z5_xf_xs , id_inov4_xs_u ) = K_x_x*hx_hu; + B(id_z5_xf_xs , id_inov5_xf_xf_u) = hx_hxu + K_x_x*hxx2_hu; + B(id_z5_xf_xs , id_inov6_xf_u_u ) = hx_huu2 + K_x_x*hxu_hu; + B(id_z5_xf_xs , id_inov7_u_u_u ) = hu_huu2; + B(id_z6_xf_xf_xf , id_inov5_xf_xf_u) = hx_hx_hu + kron(hx,K_x_x*hx_hu) + hu_hx_hx*K_u_xx; + B(id_z6_xf_xf_xf , id_inov6_xf_u_u ) = hx_hu_hu + hu_hx_hu*K_u_ux + kron(hu,K_x_x*hx_hu)*K_u_ux; + B(id_z6_xf_xf_xf , id_inov7_u_u_u ) = hu_hu_hu; - C = zeros(y_nbr,z_nbr); - C(1:y_nbr , id_z1_xf ) = ghx(indy,:) + 1/2*ghxss(indy,:); - C(1:y_nbr , id_z2_xs ) = ghx(indy,:); - C(1:y_nbr , id_z3_xf_xf ) = 1/2*ghxx(indy,:); - C(1:y_nbr , id_z4_xrd ) = ghx(indy,:); - C(1:y_nbr , id_z5_xf_xs ) = ghxx(indy,:); - C(1:y_nbr , id_z6_xf_xf_xf) = 1/6*ghxxx(indy,:); - - D = zeros(y_nbr,e_nbr); - D(1:y_nbr , id_e1_u ) = ghu(indy,:) + 1/2*ghuss(indy,:); - D(1:y_nbr , id_e2_u_u ) = 1/2*ghuu(indy,:); - D(1:y_nbr , id_e3_xf_u ) = ghxu(indy,:); - D(1:y_nbr , id_e5_xs_u ) = ghxu(indy,:); - D(1:y_nbr , id_e7_xf_xf_u) = 1/2*ghxxu(indy,:); - D(1:y_nbr , id_e10_xf_u_u) = 1/2*ghxuu(indy,:); - D(1:y_nbr , id_e13_u_u_u ) = 1/6*ghuuu(indy,:); - - c = zeros(z_nbr,1); - c(id_z2_xs , 1) = 1/2*ghs2(indx,:) + 1/2*ghuu(indx,:)*E_uu(:); + c = zeros(z_nbr, 1); + c(id_z2_xs , 1) = 1/2*hss + 1/2*huu*E_uu(:); c(id_z3_xf_xf , 1) = hu_hu*E_uu(:); - d = zeros(y_nbr,1); - d(1:y_nbr , 1) = 0.5*ghs2(indy,:) + 0.5*ghuu(indy,:)*E_uu(:); + C = zeros(y_nbr,z_nbr); + C(: , id_z1_xf ) = gx + 3/6*gxss; + C(: , id_z2_xs ) = gx; + C(: , id_z3_xf_xf ) = 1/2*gxx; + C(: , id_z4_xrd ) = gx; + C(: , id_z5_xf_xs ) = gxx; + C(: , id_z6_xf_xf_xf) = 1/6*gxxx; - Varinov = zeros(e_nbr,e_nbr); - Varinov(id_e1_u , id_e1_u ) = E_uu; - Varinov(id_e1_u , id_e5_xs_u ) = kron(E_xs',E_uu); - Varinov(id_e1_u , id_e6_u_xs ) = kron(E_uu,E_xs'); - Varinov(id_e1_u , id_e7_xf_xf_u) = kron(E_xfxf(:)',E_uu); - Varinov(id_e1_u , id_e8_xf_u_xf) = kron(E_uu,E_xfxf(:)')*kron(K_xu,speye(x_nbr)); - Varinov(id_e1_u , id_e9_u_xf_xf) = kron(E_uu,E_xfxf(:)'); - Varinov(id_e1_u , id_e13_u_u_u ) = reshape(E_u_u_u_u,u_nbr,u_nbr^3); - - Varinov(id_e2_u_u , id_e2_u_u ) = E_uu_uu-E_uu(:)*transpose(E_uu(:)); - - Varinov(id_e3_xf_u , id_e3_xf_u ) = E_xfxf_E_uu; - Varinov(id_e3_xf_u , id_e4_u_xf ) = E_xfxf_E_uu*K_ux'; - Varinov(id_e3_xf_u , id_e5_xs_u ) = E_xfxs_E_uu; - Varinov(id_e3_xf_u , id_e6_u_xs ) = E_xfxs_E_uu*K_ux'; - Varinov(id_e3_xf_u , id_e7_xf_xf_u) = kron(reshape(E_xf_xf_xf,x_nbr,x_nbr^2), E_uu); - Varinov(id_e3_xf_u , id_e8_xf_u_xf) = kron(reshape(E_xf_xf_xf,x_nbr,x_nbr^2), E_uu)*kron(speye(x_nbr),K_ux)'; - Varinov(id_e3_xf_u , id_e9_u_xf_xf) = K_xu*kron(E_uu, reshape(E_xf_xf_xf, x_nbr, x_nbr^2)); - - Varinov(id_e4_u_xf , id_e3_xf_u ) = K_ux*E_xfxf_E_uu; - Varinov(id_e4_u_xf , id_e4_u_xf ) = kron(E_uu,E_xfxf); - Varinov(id_e4_u_xf , id_e5_xs_u ) = K_ux*kron(E_xfxs,E_uu); - Varinov(id_e4_u_xf , id_e6_u_xs ) = kron(E_uu, E_xfxs); - Varinov(id_e4_u_xf , id_e7_xf_xf_u) = K_ux*kron(reshape(E_xf_xf_xf,x_nbr,x_nbr^2),E_uu); - Varinov(id_e4_u_xf , id_e8_xf_u_xf) = kron(E_uu,reshape(E_xf_xf_xf,x_nbr,x_nbr^2))*kron(K_xu,speye(x_nbr))'; - Varinov(id_e4_u_xf , id_e9_u_xf_xf) = kron(E_uu,reshape(E_xf_xf_xf,x_nbr,x_nbr^2)); - - Varinov(id_e5_xs_u , id_e1_u ) = kron(E_xs, E_uu); - Varinov(id_e5_xs_u , id_e3_xf_u ) = kron(E_xsxf, E_uu); - Varinov(id_e5_xs_u , id_e4_u_xf ) = kron(E_xsxf, E_uu)*K_ux'; - Varinov(id_e5_xs_u , id_e5_xs_u ) = kron(E_xsxs, E_uu); - Varinov(id_e5_xs_u , id_e6_u_xs ) = kron(E_xsxs, E_uu)*K_ux'; - Varinov(id_e5_xs_u , id_e7_xf_xf_u) = kron(reshape(E_xs_xf_xf,x_nbr,x_nbr^2),E_uu); - Varinov(id_e5_xs_u , id_e8_xf_u_xf) = kron(reshape(E_xs_xf_xf,x_nbr,x_nbr^2),E_uu)*kron(speye(x_nbr),K_ux)'; - Varinov(id_e5_xs_u , id_e9_u_xf_xf) = K_xu*kron(E_uu,reshape(E_xs_xf_xf,x_nbr,x_nbr^2)); - Varinov(id_e5_xs_u , id_e13_u_u_u ) = kron(E_xs,reshape(E_u_u_u_u,u_nbr,u_nbr^3)); - - Varinov(id_e6_u_xs , id_e1_u ) = kron(E_uu,E_xs); - Varinov(id_e6_u_xs , id_e3_xf_u ) = K_ux*kron(E_xsxf, E_uu); - Varinov(id_e6_u_xs , id_e4_u_xf ) = kron(E_uu, E_xsxf); - Varinov(id_e6_u_xs , id_e5_xs_u ) = K_ux*kron(E_xsxs,E_uu); - Varinov(id_e6_u_xs , id_e6_u_xs ) = kron(E_uu, E_xsxs); - Varinov(id_e6_u_xs , id_e7_xf_xf_u) = K_ux*kron(reshape(E_xs_xf_xf,x_nbr,x_nbr^2), E_uu); - Varinov(id_e6_u_xs , id_e8_xf_u_xf) = kron(E_uu, reshape(E_xs_xf_xf,x_nbr,x_nbr^2))*kron(K_xu,speye(x_nbr))'; - Varinov(id_e6_u_xs , id_e9_u_xf_xf) = kron(E_uu, reshape(E_xs_xf_xf,x_nbr,x_nbr^2)); - Varinov(id_e6_u_xs , id_e13_u_u_u ) = K_ux*kron(E_xs,reshape(E_u_u_u_u,u_nbr,u_nbr^3)); - - Varinov(id_e7_xf_xf_u , id_e1_u ) = kron(E_xfxf(:),E_uu); - Varinov(id_e7_xf_xf_u , id_e3_xf_u ) = kron(reshape(E_xf_xf_xf,x_nbr^2,x_nbr),E_uu); - Varinov(id_e7_xf_xf_u , id_e4_u_xf ) = kron(reshape(E_xf_xf_xf,x_nbr^2,x_nbr),E_uu)*K_ux'; - Varinov(id_e7_xf_xf_u , id_e5_xs_u ) = kron(reshape(E_xf_xf_xs,x_nbr^2,x_nbr),E_uu); - Varinov(id_e7_xf_xf_u , id_e6_u_xs ) = kron(reshape(E_xf_xf_xs,x_nbr^2,x_nbr),E_uu)*K_ux'; - Varinov(id_e7_xf_xf_u , id_e7_xf_xf_u) = kron(reshape(E_xf_xf_xf_xf,x_nbr^2,x_nbr^2),E_uu); - Varinov(id_e7_xf_xf_u , id_e8_xf_u_xf) = kron(reshape(E_xf_xf_xf_xf,x_nbr^2,x_nbr^2),E_uu)*kron(speye(x_nbr),K_ux)'; - Varinov(id_e7_xf_xf_u , id_e9_u_xf_xf) = kron(speye(x_nbr),K_ux)*kron(K_ux,speye(x_nbr))*kron(E_uu, reshape(E_xf_xf_xf_xf,x_nbr^2,x_nbr^2)); - Varinov(id_e7_xf_xf_u , id_e13_u_u_u ) = kron(E_xfxf(:),reshape(E_u_u_u_u,u_nbr,u_nbr^3)); - - Varinov(id_e8_xf_u_xf , id_e1_u ) = kron(K_xu,speye(x_nbr))*kron(E_uu,E_xfxf(:)); - Varinov(id_e8_xf_u_xf , id_e3_xf_u ) = kron(speye(x_nbr),K_xu)*kron(reshape(E_xf_xf_xf,x_nbr^2,x_nbr),E_uu); - Varinov(id_e8_xf_u_xf , id_e4_u_xf ) = kron(K_xu,speye(x_nbr))*kron(E_uu,reshape(E_xf_xf_xf,x_nbr^2,x_nbr)); - Varinov(id_e8_xf_u_xf , id_e5_xs_u ) = kron(speye(x_nbr),K_ux)*kron(reshape(E_xf_xf_xs,x_nbr^2,x_nbr),E_uu); - Varinov(id_e8_xf_u_xf , id_e6_u_xs ) = kron(K_xu,speye(x_nbr))*kron(E_uu,reshape(E_xf_xf_xs,x_nbr^2,x_nbr)); - Varinov(id_e8_xf_u_xf , id_e7_xf_xf_u) = kron(speye(x_nbr),K_ux)*kron(reshape(E_xf_xf_xf_xf,x_nbr^2,x_nbr^2),E_uu); - Varinov(id_e8_xf_u_xf , id_e8_xf_u_xf) = kron(K_xu,speye(x_nbr))*kron(E_uu,reshape(E_xf_xf_xf_xf,x_nbr^2,x_nbr^2))*kron(K_xu,speye(x_nbr))'; - Varinov(id_e8_xf_u_xf , id_e9_u_xf_xf) = kron(K_xu,speye(x_nbr))*kron(E_uu,reshape(E_xf_xf_xf_xf,x_nbr^2,x_nbr^2)); - Varinov(id_e8_xf_u_xf , id_e13_u_u_u ) = kron(K_xu,speye(x_nbr))*kron(reshape(E_u_u_u_u,u_nbr,u_nbr^3),E_xfxf(:)); - - Varinov(id_e9_u_xf_xf , id_e1_u ) = kron(E_uu, E_xfxf(:)); - Varinov(id_e9_u_xf_xf , id_e3_xf_u ) = kron(E_uu, reshape(E_xf_xf_xf,x_nbr^2,x_nbr))*K_xu'; - Varinov(id_e9_u_xf_xf , id_e4_u_xf ) = kron(E_uu, reshape(E_xf_xf_xf,x_nbr^2,x_nbr)); - Varinov(id_e9_u_xf_xf , id_e5_xs_u ) = kron(E_uu, reshape(E_xf_xf_xs,x_nbr^2,x_nbr))*K_xu'; - Varinov(id_e9_u_xf_xf , id_e6_u_xs ) = kron(E_uu, reshape(E_xf_xf_xs,x_nbr^2,x_nbr)); - Varinov(id_e9_u_xf_xf , id_e7_xf_xf_u) = kron(speye(x_nbr),K_ux)*kron(K_ux,speye(x_nbr))*kron(reshape(E_xf_xf_xf_xf,x_nbr^2,x_nbr^2),E_uu); - Varinov(id_e9_u_xf_xf , id_e8_xf_u_xf) = kron(E_uu,reshape(E_xf_xf_xf_xf,x_nbr^2,x_nbr^2))*kron(speye(x_nbr),K_ux)'; - Varinov(id_e9_u_xf_xf , id_e9_u_xf_xf) = kron(E_uu,reshape(E_xf_xf_xf_xf,x_nbr^2,x_nbr^2)); - Varinov(id_e9_u_xf_xf , id_e13_u_u_u ) = kron(reshape(E_u_u_u_u,u_nbr,u_nbr^3),E_xfxf(:)); - - Varinov(id_e10_xf_u_u , id_e10_xf_u_u) = kron(E_xfxf,reshape(E_u_u_u_u,u_nbr^2,u_nbr^2)); - Varinov(id_e10_xf_u_u , id_e11_u_xf_u) = kron(E_xfxf,reshape(E_u_u_u_u,u_nbr^2,u_nbr^2))*kron(K_ux,speye(u_nbr))'; - Varinov(id_e10_xf_u_u , id_e12_u_u_xf) = kron(E_xfxf,reshape(E_u_u_u_u,u_nbr^2,u_nbr^2))*kron(K_ux,speye(u_nbr))'*kron(speye(u_nbr),K_ux)'; - - Varinov(id_e11_u_xf_u , id_e10_xf_u_u) = kron(K_ux,speye(u_nbr))*kron(E_xfxf,reshape(E_u_u_u_u,u_nbr^2,u_nbr^2)); - Varinov(id_e11_u_xf_u , id_e11_u_xf_u) = kron(K_ux,speye(u_nbr))*kron(E_xfxf,reshape(E_u_u_u_u,u_nbr^2,u_nbr^2))*kron(K_ux,speye(u_nbr))'; - Varinov(id_e11_u_xf_u , id_e12_u_u_xf) = kron(speye(u_nbr),K_ux)*kron(reshape(E_u_u_u_u,u_nbr^2,u_nbr^2),E_xfxf); - - Varinov(id_e12_u_u_xf , id_e10_xf_u_u) = kron(K_ux,speye(u_nbr))*kron(speye(u_nbr),K_ux)*kron(E_xfxf,reshape(E_u_u_u_u,u_nbr^2,u_nbr^2)); - Varinov(id_e12_u_u_xf , id_e11_u_xf_u) = kron(reshape(E_u_u_u_u,u_nbr^2,u_nbr^2),E_xfxf)*kron(speye(u_nbr),K_xu)'; - Varinov(id_e12_u_u_xf , id_e12_u_u_xf) = kron(reshape(E_u_u_u_u,u_nbr^2,u_nbr^2),E_xfxf); - - Varinov(id_e13_u_u_u , id_e1_u ) = reshape(E_u_u_u_u,u_nbr^3,u_nbr); - Varinov(id_e13_u_u_u , id_e5_xs_u ) = kron(E_xs', reshape(E_u_u_u_u,u_nbr^3,u_nbr)); - Varinov(id_e13_u_u_u , id_e6_u_xs ) = kron(reshape(E_u_u_u_u,u_nbr^3,u_nbr),E_xs'); - Varinov(id_e13_u_u_u , id_e7_xf_xf_u ) = kron(E_xfxf(:)',reshape(E_u_u_u_u,u_nbr^3,u_nbr)); - Varinov(id_e13_u_u_u , id_e8_xf_u_xf ) = kron(E_xfxf(:)',reshape(E_u_u_u_u,u_nbr^3,u_nbr))*kron(speye(x_nbr),K_ux)'; - Varinov(id_e13_u_u_u , id_e9_u_xf_xf ) = kron(reshape(E_u_u_u_u,u_nbr^3,u_nbr), E_xfxf(:)'); - Varinov(id_e13_u_u_u , id_e13_u_u_u ) = reshape(Q6Pu*E_u_u_u_u_u_u,u_nbr^3,u_nbr^3); - - E_z = (speye(z_nbr)-A)\c; - + D = zeros(y_nbr,inov_nbr); + D(: , id_inov1_u ) = gu + 3/6*guss; + D(: , id_inov2_u_u ) = 1/2*guu; + D(: , id_inov3_xf_u ) = gxu; + D(: , id_inov4_xs_u ) = gxu; + D(: , id_inov5_xf_xf_u) = 3/6*gxxu; + D(: , id_inov6_xf_u_u) = 3/6*gxuu; + D(: , id_inov7_u_u_u ) = 1/6*guuu; + + d = 1/2*gss + 1/2*guu*E_uu(:); + + Varinov = zeros(inov_nbr,inov_nbr); + Varinov(id_inov1_u , id_inov1_u ) = E_uu; + %Varinov(id_inov1_u , id_inov2_u_u ) = zeros(u_nbr,u_nbr^2); + %Varinov(id_inov1_u , id_inov3_xf_u ) = zeros(u_nbr,x_nbr*u_nbr); + Varinov(id_inov1_u , id_inov4_xs_u ) = kron(E_xs',E_uu); + Varinov(id_inov1_u , id_inov5_xf_xf_u) = kron(E_xfxf(:)',E_uu); + %Varinov(id_inov1_u , id_inov6_xf_u_u ) = zeros(u_nbr,x_nbr*u_nbr^2); + Varinov(id_inov1_u , id_inov7_u_u_u ) = reshape(QPu*E_u_u_u_u,u_nbr,u_nbr^3); + + %Varinov(id_inov2_u_u , id_inov1_u ) = zeros(u_nbr^2,u_nbr); + Varinov(id_inov2_u_u , id_inov2_u_u ) = reshape(QPu*E_u_u_u_u,u_nbr^2,u_nbr^2)-E_uu(:)*E_uu(:)'; + %Varinov(id_inov2_u_u , id_inov3_xf_u ) = zeros(u_nbr^2,x_nbr*u_nbr); + %Varinov(id_inov2_u_u , id_inov4_xs_u ) = zeros(u_nbr^2,x_nbr*u_nbr); + %Varinov(id_inov2_u_u , id_inov5_xf_xf_u) = zeros(u_nbr^2,x_nbr^2,u_nbr); + %Varinov(id_inov2_u_u , id_inov6_xf_u_u ) = zeros(u_nbr^2,x_nbr*u_nbr^2); + %Varinov(id_inov2_u_u , id_inov7_u_u_u ) = zeros(u_nbr^2,u_nbr^3); + + %Varinov(id_inov3_xf_u , id_inov1_u ) = zeros(x_nbr*u_nbr,u_nbr); + %Varinov(id_inov3_xf_u , id_inov2_u_u ) = zeros(x_nbr*u_nbr,u_nbr^2); + Varinov(id_inov3_xf_u , id_inov3_xf_u ) = E_xfxf_uu; + %Varinov(id_inov3_xf_u , id_inov4_xs_u ) = zeros(x_nbr*u_nbr,x_nbr*u_nbr); + %Varinov(id_inov3_xf_u , id_inov5_xf_xf_u) = zeros(x_nbr*u_nbr,x_nbr^2*u_nbr); + %Varinov(id_inov3_xf_u , id_inov6_xf_u_u ) = zeros(x_nbr*u_nbr,x_nbr*u_nbr^2); + %Varinov(id_inov3_xf_u , id_inov7_u_u_u ) = zeros(x_nbr*u_nbr,u_nbr^3); + + Varinov(id_inov4_xs_u , id_inov1_u ) = kron(E_xs,E_uu); + %Varinov(id_inov4_xs_u , id_inov2_u_u ) = zeros(x_nbr*u_nbr,u_nbr^2); + %Varinov(id_inov4_xs_u , id_inov3_xf_u ) = zeros(x_nbr*u_nbr,x_nbr*u_nbr); + Varinov(id_inov4_xs_u , id_inov4_xs_u ) = kron(E_xsxs,E_uu); + Varinov(id_inov4_xs_u , id_inov5_xf_xf_u) = kron(E_xsxf_xf, E_uu); + %Varinov(id_inov4_xs_u , id_inov6_xf_u_u ) = zeros(x_nbr*u_nbr,x_nbr*u_nbr^2); + Varinov(id_inov4_xs_u , id_inov7_u_u_u ) = kron(E_xs,reshape(QPu*E_u_u_u_u,u_nbr,u_nbr^3)); + + Varinov(id_inov5_xf_xf_u , id_inov1_u ) = kron(E_xfxf(:),E_uu); + %Varinov(id_inov5_xf_xf_u , id_inov2_u_u ) = zeros(x_nbr^2*u_nbr,u_nbr^2); + %Varinov(id_inov5_xf_xf_u , id_inov3_xf_u ) = zeros(x_nbr^2*u_nbr,x_nbr*u_nbr); + Varinov(id_inov5_xf_xf_u , id_inov4_xs_u ) = kron(E_xf_xfxs,E_uu); + Varinov(id_inov5_xf_xf_u , id_inov5_xf_xf_u) = kron(E_xf_xfxf_xf,E_uu); + %Varinov(id_inov5_xf_xf_u , id_inov6_xf_u_u ) = zeros(x_nbr^2*u_nbr,x_nbr*u_nbr^2); + Varinov(id_inov5_xf_xf_u , id_inov7_u_u_u ) = kron(E_xfxf(:),reshape(QPu*E_u_u_u_u,u_nbr,u_nbr^3)); + + %Varinov(id_inov6_xf_u_u , id_inov1_u ) = zeros(x_nbr*u_nbr^2,u_nbr); + %Varinov(id_inov6_xf_u_u , id_inov2_u_u ) = zeros(x_nbr*u_nbr^2,u_nbr^2); + %Varinov(id_inov6_xf_u_u , id_inov3_xf_u ) = zeros(x_nbr*u_nbr^2,x_nbr*u_nbr); + %Varinov(id_inov6_xf_u_u , id_inov4_xs_u ) = zeros(x_nbr*u_nbr^2,x_nbr*u_nbr); + %Varinov(id_inov6_xf_u_u , id_inov5_xf_xf_u) = zeros(x_nbr*u_nbr^2,x_nbr^2*u_nbr); + Varinov(id_inov6_xf_u_u , id_inov6_xf_u_u ) = kron(E_xfxf,reshape(QPu*E_u_u_u_u,u_nbr^2,u_nbr^2)); + %Varinov(id_inov6_xf_u_u , id_inov7_u_u_u ) = zeros(x_nbr*u_nbr^2,u_nbr^3); + + Varinov(id_inov7_u_u_u , id_inov1_u ) = reshape(QPu*E_u_u_u_u,u_nbr^3,u_nbr); + %Varinov(id_inov7_u_u_u , id_inov2_u_u ) = zeros(u_nbr^3,u_nbr^2); + %Varinov(id_inov7_u_u_u , id_inov3_xf_u ) = zeros(u_nbr^3,x_nbr*u_nbr); + Varinov(id_inov7_u_u_u , id_inov4_xs_u ) = kron(E_xs',reshape(QPu*E_u_u_u_u,u_nbr^3,u_nbr)); + Varinov(id_inov7_u_u_u , id_inov5_xf_xf_u) = kron(transpose(E_xfxf(:)),reshape(QPu*E_u_u_u_u,u_nbr^3,u_nbr)); + %Varinov(id_inov7_u_u_u , id_inov6_xf_u_u ) = zeros(u_nbr^3,x_nbr*u_nbr^2); + Varinov(id_inov7_u_u_u , id_inov7_u_u_u ) = reshape(Q6Pu*E_u_u_u_u_u_u,u_nbr^3,u_nbr^3); + + E_xrd = zeros(x_nbr,1);%due to gaussianity + + E_inovzlag1 = zeros(inov_nbr,z_nbr); % Attention: E[inov*z(-1)'] is not equal to zero for a third-order approximation due to kron(kron(xf(-1),u),u) + E_inovzlag1(id_inov6_xf_u_u , id_z1_xf ) = kron(E_xfxf,E_uu(:)); + E_inovzlag1(id_inov6_xf_u_u , id_z4_xrd ) = kron(E_xrdxf',E_uu(:)); + E_inovzlag1(id_inov6_xf_u_u , id_z5_xf_xs ) = kron(reshape(commutation(x_nbr^2,x_nbr)*vec(E_xsxf_xf),x_nbr,x_nbr^2),vec(E_uu)) ; + E_inovzlag1(id_inov6_xf_u_u , id_z6_xf_xf_xf ) = kron(reshape(E_xf_xfxf_xf,x_nbr,x_nbr^3),E_uu(:)); + + Binovzlag1A= B*E_inovzlag1*transpose(A); + Om_z = B*Varinov*transpose(B) + Binovzlag1A + transpose(Binovzlag1A); + + lyapunov_symm_method = 1; %method=1 to initialize persistent variables + [Var_z, errorflag] = disclyap_fast(A,Om_z,options.lyapunov_doubling_tol); + if errorflag %use Schur-based method + fprintf('PRUNED_STATE_SPACE_SYSTEM: error flag in disclyap_fast at order=3, use lyapunov_symm\n'); + Var_z = lyapunov_symm(A,Om_z,... + options.lyapunov_fixed_point_tol,options.qz_criterium,options.lyapunov_complex_threshold,... + lyapunov_symm_method,... + options.debug); + lyapunov_symm_method = 2; %we can now make use of persistent variables from shur + end + %make sure some stuff is zero due to Gaussianity + Var_z(id_z1_xf , id_z2_xs) = zeros(x_nbr,x_nbr); + Var_z(id_z1_xf , id_z3_xf_xf) = zeros(x_nbr,x_nbr^2); + Var_z(id_z2_xs , id_z1_xf) = zeros(x_nbr,x_nbr); + Var_z(id_z2_xs , id_z4_xrd) = zeros(x_nbr,x_nbr); + Var_z(id_z2_xs , id_z5_xf_xs) = zeros(x_nbr,x_nbr^2); + Var_z(id_z2_xs , id_z6_xf_xf_xf) = zeros(x_nbr,x_nbr^3); + Var_z(id_z3_xf_xf , id_z1_xf) = zeros(x_nbr^2,x_nbr); + Var_z(id_z3_xf_xf , id_z4_xrd) = zeros(x_nbr^2,x_nbr); + Var_z(id_z3_xf_xf , id_z5_xf_xs) = zeros(x_nbr^2,x_nbr^2); + Var_z(id_z3_xf_xf , id_z6_xf_xf_xf) = zeros(x_nbr^2,x_nbr^3); + Var_z(id_z4_xrd , id_z2_xs) = zeros(x_nbr,x_nbr); + Var_z(id_z4_xrd , id_z3_xf_xf) = zeros(x_nbr,x_nbr^2); + Var_z(id_z5_xf_xs , id_z2_xs) = zeros(x_nbr^2,x_nbr); + Var_z(id_z5_xf_xs , id_z3_xf_xf) = zeros(x_nbr^2,x_nbr^2); + Var_z(id_z6_xf_xf_xf , id_z2_xs) = zeros(x_nbr^3,x_nbr); + Var_z(id_z6_xf_xf_xf , id_z3_xf_xf) = zeros(x_nbr^3,x_nbr^2); if compute_derivs - dA = zeros(z_nbr,z_nbr,totparam_nbr); - dB = zeros(z_nbr,e_nbr,totparam_nbr); - dC = zeros(y_nbr,z_nbr,totparam_nbr); - dD = zeros(y_nbr,e_nbr,totparam_nbr); - dc = zeros(z_nbr,totparam_nbr); - dd = zeros(y_nbr,totparam_nbr); - dVarinov = zeros(e_nbr,e_nbr,totparam_nbr); - dE_z =zeros(z_nbr,totparam_nbr); - - for jp=1:totparam_nbr - dA(id_z1_xf , id_z1_xf ,jp) = dghx(indx,:,jp); - dA(id_z2_xs , id_z2_xs ,jp) = dghx(indx,:,jp); - dA(id_z2_xs , id_z3_xf_xf ,jp) = 1/2*dghxx(indx,:,jp); - dA(id_z3_xf_xf , id_z3_xf_xf ,jp) = dhx_hx(:,:,jp); - dA(id_z4_xrd , id_z1_xf ,jp) = 3/6*dghxss(indx,:,jp); - dA(id_z4_xrd , id_z4_xrd ,jp) = dghx(indx,:,jp); - dA(id_z4_xrd , id_z5_xf_xs ,jp) = dghxx(indx,:,jp); - dA(id_z4_xrd , id_z6_xf_xf_xf ,jp) = 1/6*dghxxx(indx,:,jp); - dA(id_z5_xf_xs , id_z1_xf ,jp) = kron(dghx(indx,:,jp),1/2*ghs2(indx,:)) + kron(ghx(indx,:),1/2*dghs2(indx,jp)); - dA(id_z5_xf_xs , id_z5_xf_xs ,jp) = dhx_hx(:,:,jp); - dA(id_z5_xf_xs , id_z6_xf_xf_xf ,jp) = kron(dghx(indx,:,jp),1/2*ghxx(indx,:)) + kron(ghx(indx,:),1/2*dghxx(indx,:,jp)); - dA(id_z6_xf_xf_xf , id_z6_xf_xf_xf ,jp) = kron(dghx(indx,:,jp),hx_hx) + kron(ghx(indx,:),dhx_hx(:,:,jp)); + dA = zeros(z_nbr,z_nbr,totparam_nbr); + dB = zeros(z_nbr,inov_nbr,totparam_nbr); + dc = zeros(z_nbr,totparam_nbr); + dC = zeros(y_nbr,z_nbr,totparam_nbr); + dD = zeros(y_nbr,inov_nbr,totparam_nbr); + dd = zeros(y_nbr,totparam_nbr); + dVarinov = zeros(inov_nbr,inov_nbr,totparam_nbr); + dE_xrd = zeros(x_nbr,totparam_nbr); + dE_inovzlag1 = zeros(inov_nbr,z_nbr,totparam_nbr); + dVar_z = zeros(z_nbr,z_nbr,totparam_nbr); + + for jp3 = 1:totparam_nbr + if jp3 <= (stderrparam_nbr+corrparam_nbr) + dE_uu_jp3 = dE_uu(:,:,jp3); + dE_u_u_u_u_jp3 = QPu*dE_u_u_u_u(:,jp3); + dE_u_u_u_u_u_u_jp3 = Q6Pu*dE_u_u_u_u_u_u(:,jp3); + else + dE_uu_jp3 = zeros(u_nbr,u_nbr); + dE_u_u_u_u_jp3 = zeros(u_nbr^4,1); + dE_u_u_u_u_u_u_jp3 = zeros(u_nbr^6,1); + end + dhx_jp3 = dhx(:,:,jp3); + dhu_jp3 = dhu(:,:,jp3); + dhxx_jp3 = dhxx(:,:,jp3); + dhxu_jp3 = dhxu(:,:,jp3); + dhuu_jp3 = dhuu(:,:,jp3); + dhss_jp3 = dhss(:,jp3); + dhxxx_jp3 = dhxxx(:,:,jp3); + dhxxu_jp3 = dhxxu(:,:,jp3); + dhxuu_jp3 = dhxuu(:,:,jp3); + dhuuu_jp3 = dhuuu(:,:,jp3); + dhxss_jp3 = dhxss(:,:,jp3); + dhuss_jp3 = dhuss(:,:,jp3); + dgx_jp3 = dgx(:,:,jp3); + dgu_jp3 = dgu(:,:,jp3); + dgxx_jp3 = dgxx(:,:,jp3); + dgxu_jp3 = dgxu(:,:,jp3); + dguu_jp3 = dguu(:,:,jp3); + dgss_jp3 = dgss(:,jp3); + dgxxx_jp3 = dgxxx(:,:,jp3); + dgxxu_jp3 = dgxxu(:,:,jp3); + dgxuu_jp3 = dgxuu(:,:,jp3); + dguuu_jp3 = dguuu(:,:,jp3); + dgxss_jp3 = dgxss(:,:,jp3); + dguss_jp3 = dguss(:,:,jp3); - dB(id_z1_xf , id_e1_u , jp) = dghu(indx,:,jp); - dB(id_z2_xs , id_e2_u_u , jp) = 1/2*dghuu(indx,:,jp); - dB(id_z2_xs , id_e3_xf_u , jp) = dghxu(indx,:,jp); - dB(id_z3_xf_xf , id_e2_u_u , jp) = dhu_hu(:,:,jp); - dB(id_z3_xf_xf , id_e3_xf_u , jp) = dhx_hu(:,:,jp); - dB(id_z3_xf_xf , id_e4_u_xf , jp) = dhu_hx(:,:,jp); - dB(id_z4_xrd , id_e1_u , jp) = 3/6*dghuss(indx,:,jp); - dB(id_z4_xrd , id_e5_xs_u , jp) = dghxu(indx,:,jp); - dB(id_z4_xrd , id_e7_xf_xf_u , jp) = 3/6*dghxxu(indx,:,jp); - dB(id_z4_xrd , id_e10_xf_u_u , jp) = 3/6*dghxuu(indx,:,jp); - dB(id_z4_xrd , id_e13_u_u_u , jp) = 1/6*dghuuu(indx,:,jp); - dB(id_z5_xf_xs , id_e1_u , jp) = kron(dghu(indx,:,jp),1/2*ghs2(indx,:)) + kron(ghu(indx,:),1/2*dghs2(indx,jp)); - dB(id_z5_xf_xs , id_e6_u_xs , jp) = dhu_hx(:,:,jp); - dB(id_z5_xf_xs , id_e7_xf_xf_u , jp) = kron(dghx(indx,:,jp),ghxu(indx,:)) + kron(ghx(indx,:),dghxu(indx,:,jp)); - dB(id_z5_xf_xs , id_e9_u_xf_xf , jp) = kron(dghu(indx,:,jp),1/2*ghxx(indx,:)) + kron(ghu(indx,:),1/2*dghxx(indx,:,jp)); - dB(id_z5_xf_xs , id_e10_xf_u_u , jp) = kron(dghx(indx,:,jp),1/2*ghuu(indx,:)) + kron(ghx(indx,:),1/2*dghuu(indx,:,jp)); - dB(id_z5_xf_xs , id_e11_u_xf_u , jp) = kron(dghu(indx,:,jp),ghxu(indx,:)) + kron(ghu(indx,:),dghxu(indx,:,jp)); - dB(id_z5_xf_xs , id_e13_u_u_u , jp) = kron(dghu(indx,:,jp),1/2*ghuu(indx,:)) + kron(ghu(indx,:),1/2*dghuu(indx,:,jp)); - dB(id_z6_xf_xf_xf , id_e7_xf_xf_u , jp) = kron(dhx_hx(:,:,jp),ghu(indx,:)) + kron(hx_hx,dghu(indx,:,jp)); - dB(id_z6_xf_xf_xf , id_e8_xf_u_xf , jp) = kron(dghx(indx,:,jp),hu_hx) + kron(ghx(indx,:),dhu_hx(:,:,jp)); - dB(id_z6_xf_xf_xf , id_e9_u_xf_xf , jp) = kron(dghu(indx,:,jp),hx_hx) + kron(ghu(indx,:),dhx_hx(:,:,jp)); - dB(id_z6_xf_xf_xf , id_e10_xf_u_u , jp) = kron(dhx_hu(:,:,jp),ghu(indx,:)) + kron(hx_hu,dghu(indx,:,jp)); - dB(id_z6_xf_xf_xf , id_e11_u_xf_u , jp) = kron(dghu(indx,:,jp),hx_hu) + kron(ghu(indx,:),dhx_hu(:,:,jp)); - dB(id_z6_xf_xf_xf , id_e12_u_u_xf , jp) = kron(dhu_hu(:,:,jp),ghx(indx,:)) + kron(hu_hu,dghx(indx,:,jp)); - dB(id_z6_xf_xf_xf , id_e13_u_u_u , jp) = kron(dghu(indx,:,jp),hu_hu) + kron(ghu(indx,:),dhu_hu(:,:,jp)); - - dC(1:y_nbr , id_z1_xf , jp) = dghx(indy,:,jp) + 1/2*dghxss(indy,:,jp); - dC(1:y_nbr , id_z2_xs , jp) = dghx(indy,:,jp); - dC(1:y_nbr , id_z3_xf_xf , jp) = 1/2*dghxx(indy,:,jp); - dC(1:y_nbr , id_z4_xrd , jp) = dghx(indy,:,jp); - dC(1:y_nbr , id_z5_xf_xs , jp) = dghxx(indy,:,jp); - dC(1:y_nbr , id_z6_xf_xf_xf , jp) = 1/6*dghxxx(indy,:,jp); + dhx_hx_jp3 = kron(dhx_jp3,hx) + kron(hx,dhx_jp3); + dhx_hu_jp3 = kron(dhx_jp3,hu) + kron(hx,dhu_jp3); + dhu_hu_jp3 = kron(dhu_jp3,hu) + kron(hu,dhu_jp3); + dhx_hss2_jp3 = kron(dhx_jp3,1/2*hss) + kron(hx,1/2*dhss_jp3); + dhu_hss2_jp3 = kron(dhu_jp3,1/2*hss) + kron(hu,1/2*dhss_jp3); + dhx_hxx2_jp3 = kron(dhx_jp3,1/2*hxx) + kron(hx,1/2*dhxx_jp3); + dhxx2_hu_jp3 = kron(1/2*dhxx_jp3,hu) + kron(1/2*hxx,dhu_jp3); + dhx_hxu_jp3 = kron(dhx_jp3,hxu) + kron(hx,dhxu_jp3); + dhxu_hu_jp3 = kron(dhxu_jp3,hu) + kron(hxu,dhu_jp3); + dhx_huu2_jp3 = kron(dhx_jp3,1/2*huu) + kron(hx,1/2*dhuu_jp3); + dhu_huu2_jp3 = kron(dhu_jp3,1/2*huu) + kron(hu,1/2*dhuu_jp3); + dhx_hx_hx_jp3 = kron(dhx_jp3,hx_hx) + kron(hx,dhx_hx_jp3); + dhx_hx_hu_jp3 = kron(dhx_hx_jp3,hu) + kron(hx_hx,dhu_jp3); + dhu_hx_hx_jp3 = kron(dhu_jp3,hx_hx) + kron(hu,dhx_hx_jp3); + dhu_hu_hu_jp3 = kron(dhu_hu_jp3,hu) + kron(hu_hu,dhu_jp3); + dhx_hu_hu_jp3 = kron(dhx_jp3,hu_hu) + kron(hx,dhu_hu_jp3); + dhu_hx_hu_jp3 = kron(dhu_jp3,hx_hu) + kron(hu,dhx_hu_jp3); - dD(1:y_nbr , id_e1_u , jp) = dghu(indy,:,jp) + 1/2*dghuss(indy,:,jp); - dD(1:y_nbr , id_e2_u_u , jp) = 1/2*dghuu(indy,:,jp); - dD(1:y_nbr , id_e3_xf_u , jp) = dghxu(indy,:,jp); - dD(1:y_nbr , id_e5_xs_u , jp) = dghxu(indy,:,jp); - dD(1:y_nbr , id_e7_xf_xf_u , jp) = 1/2*dghxxu(indy,:,jp); - dD(1:y_nbr , id_e10_xf_u_u , jp) = 1/2*dghxuu(indy,:,jp); - dD(1:y_nbr , id_e13_u_u_u , jp) = 1/6*dghuuu(indy,:,jp); - - dc(id_z2_xs , jp) = 1/2*dghs2(indx,jp) + 1/2*dghuu(indx,:,jp)*E_uu(:) + 1/2*ghuu(indx,:)*vec(dE_uu(:,:,jp)); - dc(id_z3_xf_xf , jp) = dhu_hu(:,:,jp)*E_uu(:) + hu_hu*vec(dE_uu(:,:,jp)); - - dd(1:y_nbr , jp) = 0.5*dghs2(indy,jp) + 0.5*dghuu(indy,:,jp)*E_uu(:) + 0.5*ghuu(indy,:)*vec(dE_uu(:,:,jp)); - - dVarinov(id_e1_u , id_e1_u , jp) = dE_uu(:,:,jp); - dVarinov(id_e1_u , id_e5_xs_u , jp) = kron(dE_xs(:,jp)',E_uu) + kron(E_xs',dE_uu(:,:,jp)); - dVarinov(id_e1_u , id_e6_u_xs , jp) = kron(dE_uu(:,:,jp),E_xs') + kron(E_uu,dE_xs(:,jp)'); - dVarinov(id_e1_u , id_e7_xf_xf_u , jp) = kron(vec(dE_xfxf(:,:,jp))',E_uu) + kron(E_xfxf(:)',dE_uu(:,:,jp)); - dVarinov(id_e1_u , id_e8_xf_u_xf , jp) = (kron(dE_uu(:,:,jp),E_xfxf(:)') + kron(E_uu,vec(dE_xfxf(:,:,jp))'))*kron(K_xu,speye(x_nbr)); - dVarinov(id_e1_u , id_e9_u_xf_xf , jp) = kron(dE_uu(:,:,jp),E_xfxf(:)') + kron(E_uu,vec(dE_xfxf(:,:,jp))'); - if jp <= (stderrparam_nbr+corrparam_nbr) - dVarinov(id_e1_u , id_e13_u_u_u , jp) = reshape(QPu*dE_u_u_u_u(:,jp),u_nbr,u_nbr^3); - dVarinov(id_e2_u_u , id_e2_u_u , jp) = reshape(QPu*dE_u_u_u_u(:,jp),u_nbr^2,u_nbr^2) - vec(dE_uu(:,:,jp))*transpose(E_uu(:)) - E_uu(:)*transpose(vec(dE_uu(:,:,jp))); - end + dE_xs_jp3 = dE_xs(:,jp3); + dE_xfxf_jp3 = dE_xfxf(:,:,jp3); + dE_xsxs_jp3 = dE_xsxs(:,:,jp3); + dE_xsxf_xf_jp3 = dE_xsxf_xf(:,:,jp3); + dE_xfxf_uu_jp3 = kron(dE_xfxf_jp3,E_uu) + kron(E_xfxf,dE_uu_jp3); + dE_xf_xfxs_jp3 = dE_xf_xfxs(:,:,jp3); + dE_xf_xfxf_xf_jp3 = dE_xf_xfxf_xf(:,:,jp3); + dE_xrdxf_jp3 = dE_xrdxf(:,:,jp3); - dVarinov(id_e3_xf_u , id_e3_xf_u , jp) = dE_xfxf_E_uu(:,:,jp); - dVarinov(id_e3_xf_u , id_e4_u_xf , jp) = dE_xfxf_E_uu(:,:,jp)*K_ux'; - dVarinov(id_e3_xf_u , id_e5_xs_u , jp) = dE_xfxs_E_uu(:,:,jp); - dVarinov(id_e3_xf_u , id_e6_u_xs , jp) = dE_xfxs_E_uu(:,:,jp)*K_ux'; - dVarinov(id_e3_xf_u , id_e7_xf_xf_u , jp) = kron(reshape(dE_xf_xf_xf(:,jp),x_nbr,x_nbr^2), E_uu) + kron(reshape(E_xf_xf_xf,x_nbr,x_nbr^2), dE_uu(:,:,jp)); - dVarinov(id_e3_xf_u , id_e8_xf_u_xf , jp) = (kron(reshape(dE_xf_xf_xf(:,jp),x_nbr,x_nbr^2), E_uu) + kron(reshape(E_xf_xf_xf,x_nbr,x_nbr^2), dE_uu(:,:,jp)))*kron(speye(x_nbr),K_ux)'; - dVarinov(id_e3_xf_u , id_e9_u_xf_xf , jp) = K_xu*(kron(dE_uu(:,:,jp), reshape(E_xf_xf_xf, x_nbr, x_nbr^2)) + kron(E_uu, reshape(dE_xf_xf_xf(:,jp), x_nbr, x_nbr^2))); + dA(id_z1_xf , id_z1_xf , jp3) = dhx_jp3; + dA(id_z2_xs , id_z2_xs , jp3) = dhx_jp3; + dA(id_z2_xs , id_z3_xf_xf , jp3) = 1/2*dhxx_jp3; + dA(id_z3_xf_xf , id_z3_xf_xf , jp3) = dhx_hx_jp3; + dA(id_z4_xrd , id_z1_xf , jp3) = 3/6*dhxss_jp3; + dA(id_z4_xrd , id_z4_xrd , jp3) = dhx_jp3; + dA(id_z4_xrd , id_z5_xf_xs , jp3) = dhxx_jp3; + dA(id_z4_xrd , id_z6_xf_xf_xf , jp3) = 1/6*dhxxx_jp3; + dA(id_z5_xf_xs , id_z1_xf , jp3) = dhx_hss2_jp3; + dA(id_z5_xf_xs , id_z5_xf_xs , jp3) = dhx_hx_jp3; + dA(id_z5_xf_xs , id_z6_xf_xf_xf , jp3) = dhx_hxx2_jp3; + dA(id_z6_xf_xf_xf , id_z6_xf_xf_xf , jp3) = dhx_hx_hx_jp3; - dVarinov(id_e4_u_xf , id_e3_xf_u , jp) = K_ux*dE_xfxf_E_uu(:,:,jp); - dVarinov(id_e4_u_xf , id_e4_u_xf , jp) = kron(dE_uu(:,:,jp),E_xfxf) + kron(E_uu,dE_xfxf(:,:,jp)); - dVarinov(id_e4_u_xf , id_e5_xs_u , jp) = K_ux*(kron(dE_xfxs(:,:,jp),E_uu) + kron(E_xfxs,dE_uu(:,:,jp))); - dVarinov(id_e4_u_xf , id_e6_u_xs , jp) = kron(dE_uu(:,:,jp), E_xfxs) + kron(E_uu, dE_xfxs(:,:,jp)); - dVarinov(id_e4_u_xf , id_e7_xf_xf_u , jp) = K_ux*(kron(reshape(dE_xf_xf_xf(:,jp),x_nbr,x_nbr^2),E_uu) + kron(reshape(E_xf_xf_xf,x_nbr,x_nbr^2),dE_uu(:,:,jp))); - dVarinov(id_e4_u_xf , id_e8_xf_u_xf , jp) = (kron(dE_uu(:,:,jp),reshape(E_xf_xf_xf,x_nbr,x_nbr^2)) + kron(E_uu,reshape(dE_xf_xf_xf(:,jp),x_nbr,x_nbr^2)))*kron(K_xu,speye(x_nbr))'; - dVarinov(id_e4_u_xf , id_e9_u_xf_xf , jp) = kron(dE_uu(:,:,jp),reshape(E_xf_xf_xf,x_nbr,x_nbr^2)) + kron(E_uu,reshape(dE_xf_xf_xf(:,jp),x_nbr,x_nbr^2)); + dB(id_z1_xf , id_inov1_u , jp3) = dhu_jp3; + dB(id_z2_xs , id_inov2_u_u , jp3) = 1/2*dhuu_jp3; + dB(id_z2_xs , id_inov3_xf_u , jp3) = dhxu_jp3; + dB(id_z3_xf_xf , id_inov2_u_u , jp3) = dhu_hu_jp3; + dB(id_z3_xf_xf , id_inov3_xf_u , jp3) = (I_xx+K_x_x)*dhx_hu_jp3; + dB(id_z4_xrd , id_inov1_u , jp3) = 3/6*dhuss_jp3; + dB(id_z4_xrd , id_inov4_xs_u , jp3) = dhxu_jp3; + dB(id_z4_xrd , id_inov5_xf_xf_u , jp3) = 3/6*dhxxu_jp3; + dB(id_z4_xrd , id_inov6_xf_u_u , jp3) = 3/6*dhxuu_jp3; + dB(id_z4_xrd , id_inov7_u_u_u , jp3) = 1/6*dhuuu_jp3; + dB(id_z5_xf_xs , id_inov1_u , jp3) = dhu_hss2_jp3; + dB(id_z5_xf_xs , id_inov4_xs_u , jp3) = K_x_x*dhx_hu_jp3; + dB(id_z5_xf_xs , id_inov5_xf_xf_u , jp3) = dhx_hxu_jp3 + K_x_x*dhxx2_hu_jp3; + dB(id_z5_xf_xs , id_inov6_xf_u_u , jp3) = dhx_huu2_jp3 + K_x_x*dhxu_hu_jp3; + dB(id_z5_xf_xs , id_inov7_u_u_u , jp3) = dhu_huu2_jp3; + dB(id_z6_xf_xf_xf , id_inov5_xf_xf_u , jp3) = dhx_hx_hu_jp3 + kron(dhx_jp3,K_x_x*hx_hu) + kron(hx,K_x_x*dhx_hu_jp3) + dhu_hx_hx_jp3*K_u_xx; + dB(id_z6_xf_xf_xf , id_inov6_xf_u_u , jp3) = dhx_hu_hu_jp3 + dhu_hx_hu_jp3*K_u_ux + kron(dhu_jp3,K_x_x*hx_hu)*K_u_ux + kron(hu,K_x_x*dhx_hu_jp3)*K_u_ux; + dB(id_z6_xf_xf_xf , id_inov7_u_u_u , jp3) = dhu_hu_hu_jp3; - dVarinov(id_e5_xs_u , id_e1_u , jp) = kron(dE_xs(:,jp), E_uu) + kron(E_xs, dE_uu(:,:,jp)); - dVarinov(id_e5_xs_u , id_e3_xf_u , jp) = kron(dE_xsxf(:,:,jp), E_uu) + kron(E_xsxf, dE_uu(:,:,jp)); - dVarinov(id_e5_xs_u , id_e4_u_xf , jp) = (kron(dE_xsxf(:,:,jp), E_uu) + kron(E_xsxf, dE_uu(:,:,jp)))*K_ux'; - dVarinov(id_e5_xs_u , id_e5_xs_u , jp) = kron(dE_xsxs(:,:,jp), E_uu) + kron(E_xsxs, dE_uu(:,:,jp)); - dVarinov(id_e5_xs_u , id_e6_u_xs , jp) = (kron(dE_xsxs(:,:,jp), E_uu) + kron(E_xsxs, dE_uu(:,:,jp)))*K_ux'; - dVarinov(id_e5_xs_u , id_e7_xf_xf_u , jp) = kron(reshape(dE_xs_xf_xf(:,jp),x_nbr,x_nbr^2),E_uu) + kron(reshape(E_xs_xf_xf,x_nbr,x_nbr^2),dE_uu(:,:,jp)); - dVarinov(id_e5_xs_u , id_e8_xf_u_xf , jp) = (kron(reshape(dE_xs_xf_xf(:,jp),x_nbr,x_nbr^2),E_uu) + kron(reshape(E_xs_xf_xf,x_nbr,x_nbr^2),dE_uu(:,:,jp)))*kron(speye(x_nbr),K_ux)'; - dVarinov(id_e5_xs_u , id_e9_u_xf_xf , jp) = K_xu*(kron(dE_uu(:,:,jp),reshape(E_xs_xf_xf,x_nbr,x_nbr^2)) + kron(E_uu,reshape(dE_xs_xf_xf(:,jp),x_nbr,x_nbr^2))); - if jp <= (stderrparam_nbr+corrparam_nbr) - dVarinov(id_e5_xs_u , id_e13_u_u_u , jp) = kron(dE_xs(:,jp),reshape(E_u_u_u_u,u_nbr,u_nbr^3)) + kron(E_xs,reshape(QPu*dE_u_u_u_u(:,jp),u_nbr,u_nbr^3)); - else - dVarinov(id_e5_xs_u , id_e13_u_u_u , jp) = kron(dE_xs(:,jp),reshape(E_u_u_u_u,u_nbr,u_nbr^3)); - end + dc(id_z2_xs , jp3) = 1/2*dhss_jp3 + 1/2*dhuu_jp3*E_uu(:) + 1/2*huu*dE_uu_jp3(:); + dc(id_z3_xf_xf , jp3) = dhu_hu_jp3*E_uu(:) + hu_hu*dE_uu_jp3(:); - dVarinov(id_e6_u_xs , id_e1_u , jp) = kron(dE_uu(:,:,jp),E_xs) + kron(E_uu,dE_xs(:,jp)); - dVarinov(id_e6_u_xs , id_e3_xf_u , jp) = K_ux*(kron(dE_xsxf(:,:,jp), E_uu) + kron(E_xsxf, dE_uu(:,:,jp))); - dVarinov(id_e6_u_xs , id_e4_u_xf , jp) = kron(dE_uu(:,:,jp), E_xsxf) + kron(E_uu, dE_xsxf(:,:,jp)); - dVarinov(id_e6_u_xs , id_e5_xs_u , jp) = K_ux*(kron(dE_xsxs(:,:,jp),E_uu) + kron(E_xsxs,dE_uu(:,:,jp))); - dVarinov(id_e6_u_xs , id_e6_u_xs , jp) = kron(dE_uu(:,:,jp), E_xsxs) + kron(E_uu, dE_xsxs(:,:,jp)); - dVarinov(id_e6_u_xs , id_e7_xf_xf_u , jp) = K_ux*(kron(reshape(dE_xs_xf_xf(:,jp),x_nbr,x_nbr^2), E_uu) + kron(reshape(E_xs_xf_xf,x_nbr,x_nbr^2), dE_uu(:,:,jp))); - dVarinov(id_e6_u_xs , id_e8_xf_u_xf , jp) = (kron(dE_uu(:,:,jp), reshape(E_xs_xf_xf,x_nbr,x_nbr^2)) + kron(E_uu, reshape(dE_xs_xf_xf(:,jp),x_nbr,x_nbr^2)))*kron(K_xu,speye(x_nbr))'; - dVarinov(id_e6_u_xs , id_e9_u_xf_xf , jp) = kron(dE_uu(:,:,jp), reshape(E_xs_xf_xf,x_nbr,x_nbr^2)) + kron(E_uu, reshape(dE_xs_xf_xf(:,jp),x_nbr,x_nbr^2)); - if jp <= (stderrparam_nbr+corrparam_nbr) - dVarinov(id_e6_u_xs , id_e13_u_u_u , jp) = K_ux*(kron(dE_xs(:,jp),reshape(E_u_u_u_u,u_nbr,u_nbr^3)) + kron(E_xs,reshape(QPu*dE_u_u_u_u(:,jp),u_nbr,u_nbr^3))); - else - dVarinov(id_e6_u_xs , id_e13_u_u_u , jp) = K_ux*kron(dE_xs(:,jp),reshape(E_u_u_u_u,u_nbr,u_nbr^3)); - end + dC(: , id_z1_xf , jp3) = dgx_jp3 + 3/6*dgxss_jp3; + dC(: , id_z2_xs , jp3) = dgx_jp3; + dC(: , id_z3_xf_xf , jp3) = 1/2*dgxx_jp3; + dC(: , id_z4_xrd , jp3) = dgx_jp3; + dC(: , id_z5_xf_xs , jp3) = dgxx_jp3; + dC(: , id_z6_xf_xf_xf , jp3) = 1/6*dgxxx_jp3; - dVarinov(id_e7_xf_xf_u , id_e1_u , jp) = kron(vec(dE_xfxf(:,:,jp)),E_uu) + kron(E_xfxf(:),dE_uu(:,:,jp)); - dVarinov(id_e7_xf_xf_u , id_e3_xf_u , jp) = kron(reshape(dE_xf_xf_xf(:,jp),x_nbr^2,x_nbr),E_uu) + kron(reshape(E_xf_xf_xf,x_nbr^2,x_nbr),dE_uu(:,:,jp)); - dVarinov(id_e7_xf_xf_u , id_e4_u_xf , jp) = (kron(reshape(dE_xf_xf_xf(:,jp),x_nbr^2,x_nbr),E_uu) + kron(reshape(E_xf_xf_xf,x_nbr^2,x_nbr),dE_uu(:,:,jp)))*K_ux'; - dVarinov(id_e7_xf_xf_u , id_e5_xs_u , jp) = kron(reshape(dE_xf_xf_xs(:,jp),x_nbr^2,x_nbr),E_uu) + kron(reshape(E_xf_xf_xs,x_nbr^2,x_nbr),dE_uu(:,:,jp)); - dVarinov(id_e7_xf_xf_u , id_e6_u_xs , jp) = (kron(reshape(dE_xf_xf_xs(:,jp),x_nbr^2,x_nbr),E_uu) + kron(reshape(E_xf_xf_xs,x_nbr^2,x_nbr),dE_uu(:,:,jp)))*K_ux'; - dVarinov(id_e7_xf_xf_u , id_e7_xf_xf_u , jp) = kron(reshape(dE_xf_xf_xf_xf(:,jp),x_nbr^2,x_nbr^2),E_uu) + kron(reshape(E_xf_xf_xf_xf,x_nbr^2,x_nbr^2),dE_uu(:,:,jp)); - dVarinov(id_e7_xf_xf_u , id_e8_xf_u_xf , jp) = (kron(reshape(dE_xf_xf_xf_xf(:,jp),x_nbr^2,x_nbr^2),E_uu) + kron(reshape(E_xf_xf_xf_xf,x_nbr^2,x_nbr^2),dE_uu(:,:,jp)))*kron(speye(x_nbr),K_ux)'; - dVarinov(id_e7_xf_xf_u , id_e9_u_xf_xf , jp) = kron(speye(x_nbr),K_ux)*kron(K_ux,speye(x_nbr))*(kron(dE_uu(:,:,jp), reshape(E_xf_xf_xf_xf,x_nbr^2,x_nbr^2)) + kron(E_uu, reshape(dE_xf_xf_xf_xf(:,jp),x_nbr^2,x_nbr^2))); - if jp <= (stderrparam_nbr+corrparam_nbr) - dVarinov(id_e7_xf_xf_u , id_e13_u_u_u , jp) = kron(vec(dE_xfxf(:,:,jp)),reshape(E_u_u_u_u,u_nbr,u_nbr^3)) + kron(E_xfxf(:),reshape(QPu*dE_u_u_u_u(:,jp),u_nbr,u_nbr^3)); - else - dVarinov(id_e7_xf_xf_u , id_e13_u_u_u , jp) = kron(vec(dE_xfxf(:,:,jp)),reshape(E_u_u_u_u,u_nbr,u_nbr^3)); - end + dD(: , id_inov1_u , jp3) = dgu_jp3 + 3/6*dguss_jp3; + dD(: , id_inov2_u_u , jp3) = 1/2*dguu_jp3; + dD(: , id_inov3_xf_u , jp3) = dgxu_jp3; + dD(: , id_inov4_xs_u , jp3) = dgxu_jp3; + dD(: , id_inov5_xf_xf_u , jp3) = 3/6*dgxxu_jp3; + dD(: , id_inov6_xf_u_u , jp3) = 3/6*dgxuu_jp3; + dD(: , id_inov7_u_u_u , jp3) = 1/6*dguuu_jp3; - dVarinov(id_e8_xf_u_xf , id_e1_u , jp) = kron(K_xu,speye(x_nbr))*(kron(dE_uu(:,:,jp),E_xfxf(:)) + kron(E_uu,vec(dE_xfxf(:,:,jp)))); - dVarinov(id_e8_xf_u_xf , id_e3_xf_u , jp) = kron(speye(x_nbr),K_xu)*(kron(reshape(dE_xf_xf_xf(:,jp),x_nbr^2,x_nbr),E_uu) + kron(reshape(E_xf_xf_xf,x_nbr^2,x_nbr),dE_uu(:,:,jp))); - dVarinov(id_e8_xf_u_xf , id_e4_u_xf , jp) = kron(K_xu,speye(x_nbr))*(kron(dE_uu(:,:,jp),reshape(E_xf_xf_xf,x_nbr^2,x_nbr)) + kron(E_uu,reshape(dE_xf_xf_xf(:,jp),x_nbr^2,x_nbr))); - dVarinov(id_e8_xf_u_xf , id_e5_xs_u , jp) = kron(speye(x_nbr),K_ux)*(kron(reshape(dE_xf_xf_xs(:,jp),x_nbr^2,x_nbr),E_uu) + kron(reshape(E_xf_xf_xs,x_nbr^2,x_nbr),dE_uu(:,:,jp))); - dVarinov(id_e8_xf_u_xf , id_e6_u_xs , jp) = kron(K_xu,speye(x_nbr))*(kron(dE_uu(:,:,jp),reshape(E_xf_xf_xs,x_nbr^2,x_nbr)) + kron(E_uu,reshape(dE_xf_xf_xs(:,jp),x_nbr^2,x_nbr))); - dVarinov(id_e8_xf_u_xf , id_e7_xf_xf_u , jp) = kron(speye(x_nbr),K_ux)*(kron(reshape(dE_xf_xf_xf_xf(:,jp),x_nbr^2,x_nbr^2),E_uu) + kron(reshape(E_xf_xf_xf_xf,x_nbr^2,x_nbr^2),dE_uu(:,:,jp))); - dVarinov(id_e8_xf_u_xf , id_e8_xf_u_xf , jp) = kron(K_xu,speye(x_nbr))*(kron(dE_uu(:,:,jp),reshape(E_xf_xf_xf_xf,x_nbr^2,x_nbr^2)) + kron(E_uu,reshape(dE_xf_xf_xf_xf(:,jp),x_nbr^2,x_nbr^2)))*kron(K_xu,speye(x_nbr))'; - dVarinov(id_e8_xf_u_xf , id_e9_u_xf_xf , jp) = kron(K_xu,speye(x_nbr))*(kron(dE_uu(:,:,jp),reshape(E_xf_xf_xf_xf,x_nbr^2,x_nbr^2)) + kron(E_uu,reshape(dE_xf_xf_xf_xf(:,jp),x_nbr^2,x_nbr^2))); - if jp <= (stderrparam_nbr+corrparam_nbr) - dVarinov(id_e8_xf_u_xf , id_e13_u_u_u , jp) = kron(K_xu,speye(x_nbr))*(kron(reshape(QPu*dE_u_u_u_u(:,jp),u_nbr,u_nbr^3),E_xfxf(:)) + kron(reshape(E_u_u_u_u,u_nbr,u_nbr^3),vec(dE_xfxf(:,:,jp)))); - else - dVarinov(id_e8_xf_u_xf , id_e13_u_u_u , jp) = kron(K_xu,speye(x_nbr))*kron(reshape(E_u_u_u_u,u_nbr,u_nbr^3),vec(dE_xfxf(:,:,jp))); - end + dd(:,jp3) = 1/2*dgss_jp3 + 1/2*dguu_jp3*E_uu(:) + 1/2*guu*dE_uu_jp3(:); - dVarinov(id_e9_u_xf_xf , id_e1_u , jp) = kron(dE_uu(:,:,jp), E_xfxf(:)) + kron(E_uu, vec(dE_xfxf(:,:,jp))); - dVarinov(id_e9_u_xf_xf , id_e3_xf_u , jp) = (kron(dE_uu(:,:,jp), reshape(E_xf_xf_xf,x_nbr^2,x_nbr)) + kron(E_uu, reshape(dE_xf_xf_xf(:,jp),x_nbr^2,x_nbr)))*K_xu'; - dVarinov(id_e9_u_xf_xf , id_e4_u_xf , jp) = kron(dE_uu(:,:,jp), reshape(E_xf_xf_xf,x_nbr^2,x_nbr)) + kron(E_uu, reshape(dE_xf_xf_xf(:,jp),x_nbr^2,x_nbr)); - dVarinov(id_e9_u_xf_xf , id_e5_xs_u , jp) = (kron(dE_uu(:,:,jp), reshape(E_xf_xf_xs,x_nbr^2,x_nbr)) + kron(E_uu, reshape(dE_xf_xf_xs(:,jp),x_nbr^2,x_nbr)))*K_xu'; - dVarinov(id_e9_u_xf_xf , id_e6_u_xs , jp) = kron(dE_uu(:,:,jp), reshape(E_xf_xf_xs,x_nbr^2,x_nbr)) + kron(E_uu, reshape(dE_xf_xf_xs(:,jp),x_nbr^2,x_nbr)); - dVarinov(id_e9_u_xf_xf , id_e7_xf_xf_u , jp) = kron(speye(x_nbr),K_ux)*kron(K_ux,speye(x_nbr))*(kron(reshape(dE_xf_xf_xf_xf(:,jp),x_nbr^2,x_nbr^2),E_uu) + kron(reshape(E_xf_xf_xf_xf,x_nbr^2,x_nbr^2),dE_uu(:,:,jp))); - dVarinov(id_e9_u_xf_xf , id_e8_xf_u_xf , jp) = (kron(dE_uu(:,:,jp),reshape(E_xf_xf_xf_xf,x_nbr^2,x_nbr^2)) + kron(E_uu,reshape(dE_xf_xf_xf_xf(:,jp),x_nbr^2,x_nbr^2)))*kron(speye(x_nbr),K_ux)'; - dVarinov(id_e9_u_xf_xf , id_e9_u_xf_xf , jp) = kron(dE_uu(:,:,jp),reshape(E_xf_xf_xf_xf,x_nbr^2,x_nbr^2)) + kron(E_uu,reshape(dE_xf_xf_xf_xf(:,jp),x_nbr^2,x_nbr^2)); - if jp <= (stderrparam_nbr+corrparam_nbr) - dVarinov(id_e9_u_xf_xf , id_e13_u_u_u , jp) = kron(reshape(QPu*dE_u_u_u_u(:,jp),u_nbr,u_nbr^3),E_xfxf(:)) + kron(reshape(E_u_u_u_u,u_nbr,u_nbr^3),vec(dE_xfxf(:,:,jp))); - else - dVarinov(id_e9_u_xf_xf , id_e13_u_u_u , jp) = kron(reshape(E_u_u_u_u,u_nbr,u_nbr^3),vec(dE_xfxf(:,:,jp))); - end + dVarinov(id_inov1_u , id_inov1_u , jp3) = dE_uu_jp3; + dVarinov(id_inov1_u , id_inov4_xs_u , jp3) = kron(dE_xs_jp3',E_uu) + kron(E_xs',dE_uu_jp3); + dVarinov(id_inov1_u , id_inov5_xf_xf_u , jp3) = kron(dE_xfxf_jp3(:)',E_uu) + kron(E_xfxf(:)',dE_uu_jp3); + dVarinov(id_inov1_u , id_inov7_u_u_u , jp3) = reshape(dE_u_u_u_u_jp3,u_nbr,u_nbr^3); + dVarinov(id_inov2_u_u , id_inov2_u_u , jp3) = reshape(dE_u_u_u_u_jp3,u_nbr^2,u_nbr^2) - dE_uu_jp3(:)*E_uu(:)' - E_uu(:)*dE_uu_jp3(:)'; + dVarinov(id_inov3_xf_u , id_inov3_xf_u , jp3) = dE_xfxf_uu_jp3; + dVarinov(id_inov4_xs_u , id_inov1_u , jp3) = kron(dE_xs_jp3,E_uu) + kron(E_xs,dE_uu_jp3); + dVarinov(id_inov4_xs_u , id_inov4_xs_u , jp3) = kron(dE_xsxs_jp3,E_uu) + kron(E_xsxs,dE_uu_jp3); + dVarinov(id_inov4_xs_u , id_inov5_xf_xf_u , jp3) = kron(dE_xsxf_xf_jp3, E_uu) + kron(E_xsxf_xf, dE_uu_jp3); + dVarinov(id_inov4_xs_u , id_inov7_u_u_u , jp3) = kron(dE_xs_jp3,reshape(QPu*E_u_u_u_u,u_nbr,u_nbr^3)) + kron(E_xs,reshape(dE_u_u_u_u_jp3,u_nbr,u_nbr^3)); + dVarinov(id_inov5_xf_xf_u , id_inov1_u , jp3) = kron(dE_xfxf_jp3(:),E_uu) + kron(E_xfxf(:),dE_uu_jp3); + dVarinov(id_inov5_xf_xf_u , id_inov4_xs_u , jp3) = kron(dE_xf_xfxs_jp3,E_uu) + kron(E_xf_xfxs,dE_uu_jp3); + dVarinov(id_inov5_xf_xf_u , id_inov5_xf_xf_u , jp3) = kron(dE_xf_xfxf_xf_jp3,E_uu) + kron(E_xf_xfxf_xf,dE_uu_jp3); + dVarinov(id_inov5_xf_xf_u , id_inov7_u_u_u , jp3) = kron(dE_xfxf_jp3(:),reshape(QPu*E_u_u_u_u,u_nbr,u_nbr^3)) + kron(E_xfxf(:),reshape(dE_u_u_u_u_jp3,u_nbr,u_nbr^3)); + dVarinov(id_inov6_xf_u_u , id_inov6_xf_u_u , jp3) = kron(dE_xfxf_jp3,reshape(QPu*E_u_u_u_u,u_nbr^2,u_nbr^2)) + kron(E_xfxf,reshape(dE_u_u_u_u_jp3,u_nbr^2,u_nbr^2)); + dVarinov(id_inov7_u_u_u , id_inov1_u , jp3) = reshape(dE_u_u_u_u_jp3,u_nbr^3,u_nbr); + dVarinov(id_inov7_u_u_u , id_inov4_xs_u , jp3) = kron(dE_xs_jp3',reshape(QPu*E_u_u_u_u,u_nbr^3,u_nbr)) + kron(E_xs',reshape(dE_u_u_u_u_jp3,u_nbr^3,u_nbr)); + dVarinov(id_inov7_u_u_u , id_inov5_xf_xf_u , jp3) = kron(transpose(dE_xfxf_jp3(:)),reshape(QPu*E_u_u_u_u,u_nbr^3,u_nbr)) + kron(transpose(E_xfxf(:)),reshape(dE_u_u_u_u_jp3,u_nbr^3,u_nbr)); + dVarinov(id_inov7_u_u_u , id_inov7_u_u_u , jp3) = reshape(dE_u_u_u_u_u_u_jp3,u_nbr^3,u_nbr^3); + + dE_inovzlag1(id_inov6_xf_u_u , id_z1_xf , jp3) = kron(dE_xfxf_jp3,E_uu(:)) + kron(E_xfxf,dE_uu_jp3(:)); + dE_inovzlag1(id_inov6_xf_u_u , id_z4_xrd , jp3) = kron(dE_xrdxf_jp3',E_uu(:)) + kron(E_xrdxf',dE_uu_jp3(:)); + dE_inovzlag1(id_inov6_xf_u_u , id_z5_xf_xs , jp3) = kron(reshape(commutation(x_nbr^2,x_nbr)*vec(dE_xsxf_xf_jp3),x_nbr,x_nbr^2),vec(E_uu)) + kron(reshape(commutation(x_nbr^2,x_nbr)*vec(E_xsxf_xf),x_nbr,x_nbr^2),vec(dE_uu_jp3)) ; + dE_inovzlag1(id_inov6_xf_u_u , id_z6_xf_xf_xf , jp3) = kron(reshape(dE_xf_xfxf_xf_jp3,x_nbr,x_nbr^3),E_uu(:)) + kron(reshape(E_xf_xfxf_xf,x_nbr,x_nbr^3),dE_uu_jp3(:)); + + dBinovzlag1A_jp3 = dB(:,:,jp3)*E_inovzlag1*transpose(A) + B*dE_inovzlag1(:,:,jp3)*transpose(A) + B*E_inovzlag1*transpose(dA(:,:,jp3)); + dOm_z_jp3 = dB(:,:,jp3)*Varinov*transpose(B) + B*dVarinov(:,:,jp3)*transpose(B) + B*Varinov*transpose(dB(:,:,jp3)) + dBinovzlag1A_jp3 + transpose(dBinovzlag1A_jp3); - if jp <= (stderrparam_nbr+corrparam_nbr) - dVarinov(id_e10_xf_u_u , id_e10_xf_u_u , jp) = kron(dE_xfxf(:,:,jp),reshape(E_u_u_u_u,u_nbr^2,u_nbr^2)) + kron(E_xfxf,reshape(QPu*dE_u_u_u_u(:,jp),u_nbr^2,u_nbr^2)); - dVarinov(id_e10_xf_u_u , id_e11_u_xf_u , jp) = (kron(dE_xfxf(:,:,jp),reshape(E_u_u_u_u,u_nbr^2,u_nbr^2)) + kron(E_xfxf,reshape(QPu*dE_u_u_u_u(:,jp),u_nbr^2,u_nbr^2)))*kron(K_ux,speye(u_nbr))'; - dVarinov(id_e10_xf_u_u , id_e12_u_u_xf , jp) = (kron(dE_xfxf(:,:,jp),reshape(E_u_u_u_u,u_nbr^2,u_nbr^2)) + kron(E_xfxf,reshape(QPu*dE_u_u_u_u(:,jp),u_nbr^2,u_nbr^2)))*kron(K_ux,speye(u_nbr))'*kron(speye(u_nbr),K_ux)'; - else - dVarinov(id_e10_xf_u_u , id_e10_xf_u_u , jp) = kron(dE_xfxf(:,:,jp),reshape(E_u_u_u_u,u_nbr^2,u_nbr^2)); - dVarinov(id_e10_xf_u_u , id_e11_u_xf_u , jp) = kron(dE_xfxf(:,:,jp),reshape(E_u_u_u_u,u_nbr^2,u_nbr^2))*kron(K_ux,speye(u_nbr))'; - dVarinov(id_e10_xf_u_u , id_e12_u_u_xf , jp) = kron(dE_xfxf(:,:,jp),reshape(E_u_u_u_u,u_nbr^2,u_nbr^2))*kron(K_ux,speye(u_nbr))'*kron(speye(u_nbr),K_ux)'; + [dVar_z(:,:,jp3), errorflag] = disclyap_fast(A, dA(:,:,jp3)*Var_z*A' + A*Var_z*dA(:,:,jp3)' + dOm_z_jp3, options.lyapunov_doubling_tol); + if errorflag + dVar_z(:,:,jp3) = lyapunov_symm(A, dA(:,:,jp3)*Var_z*A' + A*Var_z*dA(:,:,jp3)' + dOm_z_jp3,... + options.lyapunov_fixed_point_tol,options.qz_criterium,options.lyapunov_complex_threshold,... + lyapunov_symm_method,... + options.debug); + if lyapunov_symm_method == 1 + lyapunov_symm_method = 2; %now we can reuse persistent schur + end end - - if jp <= (stderrparam_nbr+corrparam_nbr) - dVarinov(id_e11_u_xf_u , id_e10_xf_u_u , jp) = kron(K_ux,speye(u_nbr))*(kron(dE_xfxf(:,:,jp),reshape(E_u_u_u_u,u_nbr^2,u_nbr^2)) + kron(E_xfxf,reshape(QPu*dE_u_u_u_u(:,jp),u_nbr^2,u_nbr^2))); - dVarinov(id_e11_u_xf_u , id_e11_u_xf_u , jp) = kron(K_ux,speye(u_nbr))*(kron(dE_xfxf(:,:,jp),reshape(E_u_u_u_u,u_nbr^2,u_nbr^2)) + kron(E_xfxf,reshape(QPu*dE_u_u_u_u(:,jp),u_nbr^2,u_nbr^2)))*kron(K_ux,speye(u_nbr))'; - dVarinov(id_e11_u_xf_u , id_e12_u_u_xf , jp) = kron(speye(u_nbr),K_ux)*(kron(reshape(QPu*dE_u_u_u_u(:,jp),u_nbr^2,u_nbr^2),E_xfxf) + kron(reshape(E_u_u_u_u,u_nbr^2,u_nbr^2),dE_xfxf(:,:,jp))); - else - dVarinov(id_e11_u_xf_u , id_e10_xf_u_u , jp) = kron(K_ux,speye(u_nbr))*kron(dE_xfxf(:,:,jp),reshape(E_u_u_u_u,u_nbr^2,u_nbr^2)); - dVarinov(id_e11_u_xf_u , id_e11_u_xf_u , jp) = kron(K_ux,speye(u_nbr))*kron(dE_xfxf(:,:,jp),reshape(E_u_u_u_u,u_nbr^2,u_nbr^2))*kron(K_ux,speye(u_nbr))'; - dVarinov(id_e11_u_xf_u , id_e12_u_u_xf , jp) = kron(speye(u_nbr),K_ux)*kron(reshape(E_u_u_u_u,u_nbr^2,u_nbr^2),dE_xfxf(:,:,jp)); - end - - if jp <= (stderrparam_nbr+corrparam_nbr) - dVarinov(id_e12_u_u_xf , id_e10_xf_u_u , jp) = kron(K_ux,speye(u_nbr))*kron(speye(u_nbr),K_ux)*(kron(dE_xfxf(:,:,jp),reshape(E_u_u_u_u,u_nbr^2,u_nbr^2)) + kron(E_xfxf,reshape(QPu*dE_u_u_u_u(:,jp),u_nbr^2,u_nbr^2))); - dVarinov(id_e12_u_u_xf , id_e11_u_xf_u , jp) = (kron(reshape(QPu*dE_u_u_u_u(:,jp),u_nbr^2,u_nbr^2),E_xfxf) + kron(reshape(E_u_u_u_u,u_nbr^2,u_nbr^2),dE_xfxf(:,:,jp)))*kron(speye(u_nbr),K_xu)'; - dVarinov(id_e12_u_u_xf , id_e12_u_u_xf , jp) = kron(reshape(QPu*dE_u_u_u_u(:,jp),u_nbr^2,u_nbr^2),E_xfxf) + kron(reshape(E_u_u_u_u,u_nbr^2,u_nbr^2),dE_xfxf(:,:,jp)); - else - dVarinov(id_e12_u_u_xf , id_e10_xf_u_u , jp) = kron(K_ux,speye(u_nbr))*kron(speye(u_nbr),K_ux)*kron(dE_xfxf(:,:,jp),reshape(E_u_u_u_u,u_nbr^2,u_nbr^2)); - dVarinov(id_e12_u_u_xf , id_e11_u_xf_u , jp) = kron(reshape(E_u_u_u_u,u_nbr^2,u_nbr^2),dE_xfxf(:,:,jp))*kron(speye(u_nbr),K_xu)'; - dVarinov(id_e12_u_u_xf , id_e12_u_u_xf , jp) = kron(reshape(E_u_u_u_u,u_nbr^2,u_nbr^2),dE_xfxf(:,:,jp)); - end - - if jp <= (stderrparam_nbr+corrparam_nbr) - dVarinov(id_e13_u_u_u , id_e1_u , jp) = reshape(QPu*dE_u_u_u_u(:,jp),u_nbr^3,u_nbr); - dVarinov(id_e13_u_u_u , id_e5_xs_u , jp) = kron(dE_xs(:,jp)', reshape(E_u_u_u_u,u_nbr^3,u_nbr)) + kron(E_xs', reshape(QPu*dE_u_u_u_u(:,jp),u_nbr^3,u_nbr)); - dVarinov(id_e13_u_u_u , id_e6_u_xs , jp) = kron(reshape(QPu*dE_u_u_u_u(:,jp),u_nbr^3,u_nbr),E_xs') + kron(reshape(E_u_u_u_u,u_nbr^3,u_nbr),dE_xs(:,jp)'); - dVarinov(id_e13_u_u_u , id_e7_xf_xf_u , jp) = kron(vec(dE_xfxf(:,:,jp))',reshape(E_u_u_u_u,u_nbr^3,u_nbr)) + kron(E_xfxf(:)',reshape(QPu*dE_u_u_u_u(:,jp),u_nbr^3,u_nbr)); - dVarinov(id_e13_u_u_u , id_e8_xf_u_xf , jp) = (kron(vec(dE_xfxf(:,:,jp))',reshape(E_u_u_u_u,u_nbr^3,u_nbr)) + kron(E_xfxf(:)',reshape(QPu*dE_u_u_u_u(:,jp),u_nbr^3,u_nbr)))*kron(speye(x_nbr),K_ux)'; - dVarinov(id_e13_u_u_u , id_e9_u_xf_xf , jp) = kron(reshape(QPu*dE_u_u_u_u(:,jp),u_nbr^3,u_nbr), E_xfxf(:)') + kron(reshape(E_u_u_u_u,u_nbr^3,u_nbr), vec(dE_xfxf(:,:,jp))'); - else - dVarinov(id_e13_u_u_u , id_e5_xs_u , jp) = kron(dE_xs(:,jp)', reshape(E_u_u_u_u,u_nbr^3,u_nbr)); - dVarinov(id_e13_u_u_u , id_e6_u_xs , jp) = kron(reshape(E_u_u_u_u,u_nbr^3,u_nbr),dE_xs(:,jp)'); - dVarinov(id_e13_u_u_u , id_e7_xf_xf_u , jp) = kron(vec(dE_xfxf(:,:,jp))',reshape(E_u_u_u_u,u_nbr^3,u_nbr)); - dVarinov(id_e13_u_u_u , id_e8_xf_u_xf , jp) = kron(vec(dE_xfxf(:,:,jp))',reshape(E_u_u_u_u,u_nbr^3,u_nbr))*kron(speye(x_nbr),K_ux)'; - dVarinov(id_e13_u_u_u , id_e9_u_xf_xf , jp) = kron(reshape(E_u_u_u_u,u_nbr^3,u_nbr), vec(dE_xfxf(:,:,jp))'); - end - if jp <= (stderrparam_nbr+corrparam_nbr) - dVarinov(id_e13_u_u_u , id_e13_u_u_u , jp) = reshape(Q6Pu*dE_u_u_u_u_u_u(:,jp),u_nbr^3,u_nbr^3); - end - - dE_z(:,jp) = (speye(z_nbr)-A)\(dc(:,jp) + dA(:,:,jp)*E_z); + %make sure some stuff is zero due to Gaussianity + dVar_z(id_z1_xf , id_z2_xs , jp3) = zeros(x_nbr,x_nbr); + dVar_z(id_z1_xf , id_z3_xf_xf , jp3) = zeros(x_nbr,x_nbr^2); + dVar_z(id_z2_xs , id_z1_xf , jp3) = zeros(x_nbr,x_nbr); + dVar_z(id_z2_xs , id_z4_xrd , jp3) = zeros(x_nbr,x_nbr); + dVar_z(id_z2_xs , id_z5_xf_xs , jp3) = zeros(x_nbr,x_nbr^2); + dVar_z(id_z2_xs , id_z6_xf_xf_xf , jp3) = zeros(x_nbr,x_nbr^3); + dVar_z(id_z3_xf_xf , id_z1_xf , jp3) = zeros(x_nbr^2,x_nbr); + dVar_z(id_z3_xf_xf , id_z4_xrd , jp3) = zeros(x_nbr^2,x_nbr); + dVar_z(id_z3_xf_xf , id_z5_xf_xs , jp3) = zeros(x_nbr^2,x_nbr^2); + dVar_z(id_z3_xf_xf , id_z6_xf_xf_xf , jp3) = zeros(x_nbr^2,x_nbr^3); + dVar_z(id_z4_xrd , id_z2_xs , jp3) = zeros(x_nbr,x_nbr); + dVar_z(id_z4_xrd , id_z3_xf_xf , jp3) = zeros(x_nbr,x_nbr^2); + dVar_z(id_z5_xf_xs , id_z2_xs , jp3) = zeros(x_nbr^2,x_nbr); + dVar_z(id_z5_xf_xs , id_z3_xf_xf , jp3) = zeros(x_nbr^2,x_nbr^2); + dVar_z(id_z6_xf_xf_xf , id_z2_xs , jp3) = zeros(x_nbr^3,x_nbr); + dVar_z(id_z6_xf_xf_xf , id_z3_xf_xf , jp3) = zeros(x_nbr^3,x_nbr^2); end end end end +%% Covariance/Correlation of control variables +Var_y = NaN*ones(y_nbr,y_nbr); +if order < 3 + Var_y(stationary_vars,stationary_vars) = C(stationary_vars,:)*Var_z*C(stationary_vars,:)'... + + D(stationary_vars,:)*Varinov*D(stationary_vars,:)'; +else + Var_y(stationary_vars,stationary_vars) = C(stationary_vars,:)*Var_z*C(stationary_vars,:)'... + + D(stationary_vars,:)*E_inovzlag1*C(stationary_vars,:)'... + + C(stationary_vars,:)*transpose(E_inovzlag1)*D(stationary_vars,:)'... + + D(stationary_vars,:)*Varinov*D(stationary_vars,:)'; +end +indzeros = find(abs(Var_y) < 1e-12); %find values that are numerical zero +Var_y(indzeros) = 0; +if useautocorr + sy = sqrt(diag(Var_y)); %theoretical standard deviation + sy = sy(stationary_vars); + sy = sy*sy'; %cross products of standard deviations + Corr_y = NaN*ones(y_nbr,y_nbr); + Corr_y(stationary_vars,stationary_vars) = Var_y(stationary_vars,stationary_vars)./sy; + Corr_yi = NaN*ones(y_nbr,y_nbr,nlags); +end -E_y = Yss(indy,:) + C*E_z + d; -Om_z = B*Varinov*transpose(B); -Om_y = D*Varinov*transpose(D); +if compute_derivs + dVar_y = NaN*ones(y_nbr,y_nbr,totparam_nbr); + if useautocorr + dCorr_y = NaN*ones(y_nbr,y_nbr,totparam_nbr); + dCorr_yi = NaN*ones(y_nbr,y_nbr,nlags,totparam_nbr); + end + for jpV=1:totparam_nbr + if order < 3 + dVar_y(stationary_vars,stationary_vars,jpV) = dC(stationary_vars,:,jpV)*Var_z*C(stationary_vars,:)' + C(stationary_vars,:)*dVar_z(:,:,jpV)*C(stationary_vars,:)' + C(stationary_vars,:)*Var_z*dC(stationary_vars,:,jpV)'... + + dD(stationary_vars,:,jpV)*Varinov*D(stationary_vars,:)' + D(stationary_vars,:)*dVarinov(:,:,jpV)*D(stationary_vars,:)' + D(stationary_vars,:)*Varinov*dD(stationary_vars,:,jpV)'; + else + dVar_y(stationary_vars,stationary_vars,jpV) = dC(stationary_vars,:,jpV)*Var_z*C(stationary_vars,:)' + C(stationary_vars,:)*dVar_z(:,:,jpV)*C(stationary_vars,:)' + C(stationary_vars,:)*Var_z*dC(stationary_vars,:,jpV)'... + + dD(stationary_vars,:,jpV)*E_inovzlag1*C(stationary_vars,:)' + D(stationary_vars,:)*dE_inovzlag1(:,:,jpV)*C(stationary_vars,:)' + D(stationary_vars,:)*E_inovzlag1*dC(stationary_vars,:,jpV)'... + + dC(stationary_vars,:,jpV)*transpose(E_inovzlag1)*D(stationary_vars,:)' + C(stationary_vars,:)*transpose(dE_inovzlag1(:,:,jpV))*D(stationary_vars,:)' + C(stationary_vars,:)*transpose(E_inovzlag1)*dD(stationary_vars,:,jpV)'... + + dD(stationary_vars,:,jpV)*Varinov*D(stationary_vars,:)' + D(stationary_vars,:)*dVarinov(:,:,jpV)*D(stationary_vars,:)' + D(stationary_vars,:)*Varinov*dD(stationary_vars,:,jpV)'; + end + [indzerosrow,indzeroscol] = find(abs(dVar_y(:,:,jpV)) < 1e-12); %find values that are numerical zero + dVar_y(indzerosrow,indzeroscol,jpV) = 0; + if useautocorr + %is this correct?[@wmutschl] + dsy = 1/2./sy.*diag(dVar_y(:,:,jpV)); + dsy = dsy(stationary_vars); + dsy = dsy*sy'+sy*dsy'; + dCorr_y(stationary_vars,stationary_vars,jpV) = (dVar_y(stationary_vars,stationary_vars,jpV).*sy-dsy.*Var_y(stationary_vars,stationary_vars))./(sy.*sy); + dCorr_y(stationary_vars,stationary_vars,jpV) = dCorr_y(stationary_vars,stationary_vars,jpV)-diag(diag(dCorr_y(stationary_vars,stationary_vars,jpV)))+diag(diag(dVar_y(stationary_vars,stationary_vars,jpV))); + end + end +end + +%% Autocovariances/autocorrelations of lagged control variables +Var_yi = NaN*ones(y_nbr,y_nbr,nlags); +Ai = eye(z_nbr); %this is A^0 +hxi = eye(x_nbr); +E_inovzlagi = E_inovzlag1; +Var_zi = Var_z; +if order <= 2 + tmp = A*Var_z*C(stationary_vars,:)' + B*Varinov*D(stationary_vars,:)'; +else + tmp = A*E_inovzlag1'*D(stationary_vars,:)' + B*Varinov*D(stationary_vars,:)'; +end +for i = 1:nlags + if order <= 2 + Var_yi(stationary_vars,stationary_vars,i) = C(stationary_vars,:)*Ai*tmp; + else + Var_zi = A*Var_zi + B*E_inovzlagi; + hxi = hx*hxi; + E_inovzlagi = zeros(inov_nbr,z_nbr); + E_inovzlagi(id_inov6_xf_u_u , id_z1_xf ) = kron(hxi*E_xfxf,E_uu(:)); + E_inovzlagi(id_inov6_xf_u_u , id_z4_xrd ) = kron(hxi*E_xrdxf',E_uu(:)); + E_inovzlagi(id_inov6_xf_u_u , id_z5_xf_xs ) = kron(hxi*reshape(commutation(x_nbr^2,x_nbr)*vec(E_xsxf_xf),x_nbr,x_nbr^2),vec(E_uu)); + E_inovzlagi(id_inov6_xf_u_u , id_z6_xf_xf_xf ) = kron(hxi*reshape(E_xf_xfxf_xf,x_nbr,x_nbr^3),E_uu(:)); + Var_yi(stationary_vars,stationary_vars,i) = C(stationary_vars,:)*Var_zi*C(stationary_vars,:)' + C(stationary_vars,:)*Ai*tmp + D(stationary_vars,:)*E_inovzlagi*C(stationary_vars,:)'; + end + if useautocorr + Corr_yi(stationary_vars,stationary_vars,i) = Var_yi(stationary_vars,stationary_vars,i)./sy; + end + Ai = Ai*A; %note that this is A^(i-1) +end + +if compute_derivs + dVar_yi = NaN*ones(y_nbr,y_nbr,nlags,totparam_nbr); + for jpVi=1:totparam_nbr + Ai = eye(z_nbr); dAi_jpVi = zeros(z_nbr,z_nbr); + hxi = eye(x_nbr); dhxi_jpVi = zeros(x_nbr,x_nbr); + E_inovzlagi = E_inovzlag1; dE_inovzlagi_jpVi = dE_inovzlag1(:,:,jpVi); + Var_zi = Var_z; dVar_zi_jpVi = dVar_z(:,:,jpVi); + if order <= 2 + dtmp_jpVi = dA(:,:,jpVi)*Var_z*C(stationary_vars,:)' + A*dVar_z(:,:,jpVi)*C(stationary_vars,:)' + A*Var_z*dC(stationary_vars,:,jpVi)'... + + dB(:,:,jpVi)*Varinov*D(stationary_vars,:)' + B*dVarinov(:,:,jpVi)*D(stationary_vars,:)' + B*Varinov*dD(stationary_vars,:,jpVi)'; + else + dtmp_jpVi = dA(:,:,jpVi)*E_inovzlag1'*D(stationary_vars,:)' + A*dE_inovzlag1(:,:,jpVi)'*D(stationary_vars,:)' + A*E_inovzlag1'*dD(stationary_vars,:,jpVi)'... + + dB(:,:,jpVi)*Varinov*D(stationary_vars,:)' + B*dVarinov(:,:,jpVi)*D(stationary_vars,:)' + B*Varinov*dD(stationary_vars,:,jpVi)'; + end + + for i = 1:nlags + if order <= 2 + dVar_yi(stationary_vars,stationary_vars,i,jpVi) = dC(stationary_vars,:,jpVi)*Ai*tmp + C(stationary_vars,:)*dAi_jpVi*tmp + C(stationary_vars,:)*Ai*dtmp_jpVi; + else + Var_zi = A*Var_zi + B*E_inovzlagi; + dVar_zi_jpVi = dA(:,:,jpVi)*Var_zi + A*dVar_zi_jpVi + dB(:,:,jpVi)*E_inovzlagi + + B*dE_inovzlagi_jpVi; + dhxi_jpVi = dhx(:,:,jpVi)*hxi + hx*dhxi_jpVi; + hxi = hx*hxi; + E_inovzlagi = zeros(inov_nbr,z_nbr); + E_inovzlagi(id_inov6_xf_u_u , id_z1_xf ) = kron(hxi*E_xfxf,E_uu(:)); + E_inovzlagi(id_inov6_xf_u_u , id_z4_xrd ) = kron(hxi*E_xrdxf',E_uu(:)); + E_inovzlagi(id_inov6_xf_u_u , id_z5_xf_xs ) = kron(hxi*reshape(commutation(x_nbr^2,x_nbr)*vec(E_xsxf_xf),x_nbr,x_nbr^2),vec(E_uu)); + E_inovzlagi(id_inov6_xf_u_u , id_z6_xf_xf_xf ) = kron(hxi*reshape(E_xf_xfxf_xf,x_nbr,x_nbr^3),E_uu(:)); + dE_inovzlagi_jpVi = zeros(inov_nbr,z_nbr); + dE_inovzlagi_jpVi(id_inov6_xf_u_u , id_z1_xf ) = kron(dhxi_jpVi*E_xfxf,E_uu(:)) + kron(hxi*dE_xfxf(:,:,jpVi),E_uu(:)) + kron(hxi*E_xfxf,vec(dE_uu(:,:,jpVi))); + dE_inovzlagi_jpVi(id_inov6_xf_u_u , id_z4_xrd ) = kron(dhxi_jpVi*E_xrdxf',E_uu(:)) + kron(hxi*dE_xrdxf(:,:,jpVi)',E_uu(:)) + kron(hxi*E_xrdxf',vec(dE_uu(:,:,jpVi))); + dE_inovzlagi_jpVi(id_inov6_xf_u_u , id_z5_xf_xs ) = kron(dhxi_jpVi*reshape(commutation(x_nbr^2,x_nbr)*vec(E_xsxf_xf),x_nbr,x_nbr^2),vec(E_uu)) + kron(hxi*reshape(commutation(x_nbr^2,x_nbr)*vec(dE_xsxf_xf(:,:,jpVi)),x_nbr,x_nbr^2),vec(E_uu)) + kron(hxi*reshape(commutation(x_nbr^2,x_nbr)*vec(E_xsxf_xf),x_nbr,x_nbr^2),vec(dE_uu(:,:,jpVi))); + dE_inovzlagi_jpVi(id_inov6_xf_u_u , id_z6_xf_xf_xf ) = kron(dhxi_jpVi*reshape(E_xf_xfxf_xf,x_nbr,x_nbr^3),E_uu(:)) + kron(hxi*reshape(dE_xf_xfxf_xf(:,:,jpVi),x_nbr,x_nbr^3),E_uu(:)) + kron(hxi*reshape(E_xf_xfxf_xf,x_nbr,x_nbr^3),vec(dE_uu(:,:,jpVi))); + dVar_yi(stationary_vars,stationary_vars,i,jpVi) = dC(stationary_vars,:,jpVi)*Var_zi*C(stationary_vars,:)' + C(stationary_vars,:)*dVar_zi_jpVi*C(stationary_vars,:)' + C(stationary_vars,:)*Var_zi*dC(stationary_vars,:,jpVi)'... + + dC(stationary_vars,:,jpVi)*Ai*tmp + C(stationary_vars,:)*dAi_jpVi*tmp + C(stationary_vars,:)*Ai*dtmp_jpVi... + + dD(stationary_vars,:,jpVi)*E_inovzlagi*C(stationary_vars,:)' + D(stationary_vars,:)*dE_inovzlagi_jpVi*C(stationary_vars,:)' + D(stationary_vars,:)*E_inovzlagi*dC(stationary_vars,:,jpVi)'; + end + if useautocorr + dCorr_yi(stationary_vars,stationary_vars,i,jpVi) = (dVar_yi(stationary_vars,stationary_vars,i,jpVi).*sy-dsy.*Var_yi(stationary_vars,stationary_vars,i))./(sy.*sy); + end + dAi_jpVi = dAi_jpVi*A + Ai*dA(:,:,jpVi); + Ai = Ai*A; + end + end +end + + +%% Mean of control variables +E_z = E_xf; +if order > 1 + E_z = [E_xf;E_xs;E_xfxf(:)]; +end +if order > 2 + E_xf_xs = zeros(x_nbr^2,1); + E_xf_xf_xf = zeros(x_nbr^3,1); + E_z = [E_xf;E_xs;E_xfxf(:);E_xrd;E_xf_xs;E_xf_xf_xf]; +end +E_y = Yss(indy,:) + C*E_z + d; if compute_derivs dE_y = zeros(y_nbr,totparam_nbr); - dOm_z = zeros(z_nbr,z_nbr,totparam_nbr); - dOm_y = zeros(y_nbr,y_nbr,totparam_nbr); - for jp = 1:totparam_nbr - dE_y(:,jp) = dC(:,:,jp)*E_z + C*dE_z(:,jp) + dd(:,jp); - dOm_z(:,:,jp) = dB(:,:,jp)*Varinov*B' + B*dVarinov(:,:,jp)*B' + B*Varinov*dB(:,:,jp)'; - dOm_y(:,:,jp) = dD(:,:,jp)*Varinov*D' + D*dVarinov(:,:,jp)*D' + D*Varinov*dD(:,:,jp)'; - if jp > (stderrparam_nbr+corrparam_nbr) - dE_y(:,jp) = dE_y(:,jp) + dYss(indy,jp-stderrparam_nbr-corrparam_nbr); %add steady state + for jpE = 1:totparam_nbr + if order == 1 + dE_z_jpE = dE_xf(:,jpE); + elseif order == 2 + dE_z_jpE = [dE_xf(:,jpE);dE_xs(:,jpE);vec(dE_xfxf(:,:,jpE))]; + elseif order == 3 + dE_xf_xs_jpE = zeros(x_nbr^2,1); + dE_xf_xf_xf_jpE = zeros(x_nbr^3,1); + dE_z_jpE = [dE_xf(:,jpE);dE_xs(:,jpE);vec(dE_xfxf(:,:,jpE)); dE_xrd(:,jpE); dE_xf_xs_jpE; dE_xf_xf_xf_jpE]; + end + dE_y(:,jpE) = dC(:,:,jpE)*E_z + C*dE_z_jpE + dd(:,jpE); + if jpE > (stderrparam_nbr+corrparam_nbr) + dE_y(:,jpE) = dE_y(:,jpE) + dYss(indy,jpE-stderrparam_nbr-corrparam_nbr); %add steady state end end end - +non_stationary_vars = setdiff(1:y_nbr,stationary_vars); +E_y(non_stationary_vars) = NaN; +if compute_derivs + dE_y(non_stationary_vars,:) = NaN; +end %% Store into output structure -dr.pruned.indx = indx; -dr.pruned.indy = indy; -%dr.pruned.E_xfxf = E_xfxf; -dr.pruned.A = A; -dr.pruned.B = B; -dr.pruned.C = C; -dr.pruned.D = D; -dr.pruned.c = c; -dr.pruned.d = d; -dr.pruned.Om_z = Om_z; -dr.pruned.Om_y = Om_y; -dr.pruned.Varinov = Varinov; -dr.pruned.E_z = E_z; -dr.pruned.E_y = E_y; -if compute_derivs == 1 - %dr.pruned.dE_xfxf = dE_xfxf; - dr.pruned.dA = dA; - dr.pruned.dB = dB; - dr.pruned.dC = dC; - dr.pruned.dD = dD; - dr.pruned.dc = dc; - dr.pruned.dd = dd; - dr.pruned.dOm_z = dOm_z; - dr.pruned.dOm_y = dOm_y; - dr.pruned.dVarinov = dVarinov; - dr.pruned.dE_z = dE_z; - dr.pruned.dE_y = dE_y; +pruned_state_space.indx = indx; +pruned_state_space.indy = indy; +pruned_state_space.A = A; +pruned_state_space.B = B; +pruned_state_space.C = C; +pruned_state_space.D = D; +pruned_state_space.c = c; +pruned_state_space.d = d; +pruned_state_space.Varinov = Varinov; +pruned_state_space.Var_z = Var_z; %remove in future [@wmutschl] +pruned_state_space.Var_y = Var_y; +pruned_state_space.Var_yi = Var_yi; +if useautocorr + pruned_state_space.Corr_y = Corr_y; + pruned_state_space.Corr_yi = Corr_yi; +end +pruned_state_space.E_y = E_y; + +if compute_derivs == 1 + pruned_state_space.dA = dA; + pruned_state_space.dB = dB; + pruned_state_space.dC = dC; + pruned_state_space.dD = dD; + pruned_state_space.dc = dc; + pruned_state_space.dd = dd; + pruned_state_space.dVarinov = dVarinov; + pruned_state_space.dVar_y = dVar_y; + pruned_state_space.dVar_yi = dVar_yi; + if useautocorr + pruned_state_space.dCorr_y = dCorr_y; + pruned_state_space.dCorr_yi = dCorr_yi; + end + pruned_state_space.dE_y = dE_y; end diff --git a/matlab/quadruplication.m b/matlab/quadruplication.m index 462857ff0..2d47fe740 100644 --- a/matlab/quadruplication.m +++ b/matlab/quadruplication.m @@ -1,46 +1,54 @@ -% By Willi Mutschler, September 26, 2016. Email: willi@mutschler.eu -% Quadruplication Matrix as defined by -% Meijer (2005) - Matrix algebra for higher order moments. Linear Algebra and its Applications, 410,pp. 112–134 +function [QP,QPinv] = quadruplication(p) +% Computes the Quadruplication Matrix QP (and its Moore-Penrose inverse) +% such that for any p-dimensional vector x: +% y=kron(kron(kron(x,x),x),x)=QP*z +% where z is of dimension np=p*(p+1)*(p+2)*(p+3)/2 and is obtained from y +% by removing each second and later occurence of the same element. +% This is a generalization of the Duplication matrix. +% Reference: Meijer (2005) - Matrix algebra for higher order moments. +% Linear Algebra and its Applications, 410,pp. 112-134 +% ========================================================================= +% INPUTS +% * p [integer] size of vector +% ------------------------------------------------------------------------- +% OUTPUTS +% * QP [p^4 by np] Quadruplication matrix +% * QPinv [np by np] Moore-Penrose inverse of QP +% ------------------------------------------------------------------------- +% This function is called by +% * pruned_state_space_system.m +% ------------------------------------------------------------------------- +% This function calls +% * mue (embedded) +% * uperm +% ========================================================================= +% Copyright (C) 2020 Dynare Team % -% Inputs: -% p: size of vector -% Outputs: -% QP: quadruplication matrix -% QPinv: Moore-Penrose inverse of QP +% This file is part of Dynare. % -function [QP,QPinv] = quadruplication(p,progress,sparseflag) - -if nargin <2 - progress =0; -end -if nargin < 3 - sparseflag = 1; -end -reverseStr = ''; counti=1; +% Dynare is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% Dynare is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with Dynare. If not, see . +% ========================================================================= np = p*(p+1)*(p+2)*(p+3)/24; - -if sparseflag - QP = spalloc(p^4,p*(p+1)*(p+2)*(p+3)/24,p^4); -else - QP = zeros(p^4,p*(p+1)*(p+2)*(p+3)/24); -end +QP = spalloc(p^4,np,p^4); if nargout > 1 - if sparseflag - QPinv = spalloc(p*(p+1)*(p+2)*(p+3)/24,p*(p+1)*(p+2)*(p+3)/24,p^4); - else - QPinv = zeros(p*(p+1)*(p+2)*(p+3)/24,p*(p+1)*(p+2)*(p+3)/24); - end + QPinv = spalloc(np,np,p^4); end - +counti = 1; for l=1:p for k=l:p for j=k:p for i=j:p - if progress && (rem(counti,100)== 0) - msg = sprintf(' Quadruplication Matrix Processed %d/%d', counti, np); fprintf([reverseStr, msg]); reverseStr = repmat(sprintf('\b'), 1, length(msg)); - elseif progress && (counti==np) - msg = sprintf(' Quadruplication Matrix Processed %d/%d\n', counti, np); fprintf([reverseStr, msg]); reverseStr = repmat(sprintf('\b'), 1, length(msg)); - end idx = uperm([i j k l]); for r = 1:size(idx,1) ii = idx(r,1); jj= idx(r,2); kk=idx(r,3); ll=idx(r,4); @@ -75,6 +83,7 @@ end %QPinv = (transpose(QP)*QP)\transpose(QP); function m = mue(p,i,j,k,l) + % Auxiliary expression, see page 118 of Meijer (2005) m = i + (j-1)*p + 1/2*(k-1)*p^2 + 1/6*(l-1)*p^3 - 1/2*j*(j-1) + 1/6*k*(k-1)*(k-2) - 1/24*l*(l-1)*(l-2)*(l-3) - 1/2*(k-1)^2*p + 1/6*(l-1)^3*p - 1/4*(l-1)*(l-2)*p^2 - 1/4*l*(l-1)*p + 1/6*(l-1)*p; m = round(m); end diff --git a/matlab/uperm.m b/matlab/uperm.m index 0f4161b61..3322af96b 100644 --- a/matlab/uperm.m +++ b/matlab/uperm.m @@ -1,4 +1,5 @@ function p = uperm(a) +% Return all unique permutations of possibly-repeating array elements % ========================================================================= % Copyright (C) 2014 Bruno Luong % Copyright (C) 2020 Dynare Team diff --git a/tests/.gitignore b/tests/.gitignore index e7925b2d4..35ff3c844 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -126,6 +126,7 @@ wsOct !/practicing/dataHST.mat !/practicing/data_consRicardoypg.mat !/practicing/datasaver.m +!/pruning/Andreasen_et_al_2018_Dynare44Pruning_v2.mat !/utils/printMakeCheckMatlabErrMsg.m !/utils/printMakeCheckOctaveErrMsg.m !/prior_posterior_function/posterior_function_demo.m diff --git a/tests/Makefile.am b/tests/Makefile.am index b957098e9..7648c3818 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -21,6 +21,7 @@ MODFILES = \ analytic_derivatives/fs2000_analytic_derivation.mod \ analytic_derivatives/BrockMirman_PertParamsDerivs.mod \ analytic_derivatives/burnside_3_order_PertParamsDerivs.mod \ + pruning/AnSchorfheide_pruned_state_space.mod \ measurement_errors/fs2000_corr_me_ml_mcmc/fs2000_corr_ME.mod \ TeX/fs2000_corr_ME.mod \ estimation/MH_recover/fs2000_recover_tarb.mod \ @@ -716,6 +717,10 @@ analytic_derivatives: m/analytic_derivatives o/analytic_derivatives m/analytic_derivatives: $(patsubst %.mod, %.m.trs, $(filter analytic_derivatives/%.mod, $(MODFILES))) o/analytic_derivatives: $(patsubst %.mod, %.o.trs, $(filter analytic_derivatives/%.mod, $(MODFILES))) +pruning: m/pruning o/pruning +m/pruning: $(patsubst %.mod, %.m.trs, $(filter pruning/%.mod, $(MODFILES))) +o/pruning: $(patsubst %.mod, %.o.trs, $(filter pruning/%.mod, $(MODFILES))) + fs2000: m/fs2000 o/fs2000 m/fs2000: $(patsubst %.mod, %.m.trs, $(filter fs2000/%.mod, $(MODFILES))) o/fs2000: $(patsubst %.mod, %.o.trs, $(filter fs2000/%.mod, $(MODFILES))) @@ -837,6 +842,7 @@ EXTRA_DIST = \ gsa/data_ca1.mat \ analytic_derivatives/fsdat_simul.m \ analytic_derivatives/nBrockMirmanSYM.mat \ + pruning/Andreasen_et_al_2018_Dynare44Pruning_v2.mat \ fs2000/fsdat_simul.m \ fs2000/fsdat_simul_dseries.m \ fs2000/fsdat_simul_missing_obs.m \ diff --git a/tests/pruning/AnSchorfheide_pruned_state_space.mod b/tests/pruning/AnSchorfheide_pruned_state_space.mod new file mode 100644 index 000000000..9afd133b8 --- /dev/null +++ b/tests/pruning/AnSchorfheide_pruned_state_space.mod @@ -0,0 +1,193 @@ +% This mod file compares the functionality of Dynare's pruned_state_space.m with the +% external Dynare pruning toolbox of Andreasen, Fernández-Villaverde and Rubio-Ramírez (2018): +% "The Pruned State-Space System for Non-Linear DSGE Models: Theory and Empirical Applications", +% Review of Economic Studies, Volume 85, Issue 1, Pages 1–49. +% The model under study is taken from An and Schorfheide (2007): "Bayesian Analysis of DSGE Models", +% Econometric Reviews, Volume 26, Issue 2-4, Pages 113-172. +% Note that we use version 2 of the toolbox, i.e. the one which is called +% "Third-order GMM estimate package for DSGE models (version 2)" and can be +% downloaded from https://sites.google.com/site/mandreasendk/home-1 +% +% Created by @wmutschl (Willi Mutschler, willi@mutschler.eu) +% +% ========================================================================= +% Copyright (C) 2020 Dynare Team +% +% This file is part of Dynare. +% +% Dynare is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% Dynare is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with Dynare. If not, see . +% ========================================================================= + +% set this to 1 if you want to recompute using the Andreasen et al toolbox +% otherwise the results are loaded from Andreasen_et_al_2018_Dynare44Pruning_v2.mat +@#define Andreasen_et_al_toolbox = 0 + +var YGR INFL INT + c p R g y z; %if ordering of var is changed comparison code below needs to be adapted +varexo e_r e_g e_z; +parameters tau nu kap cyst psi1 psi2 rhor rhog rhoz rrst pist gamst; + +tau = 2; +nu = 0.1; +kap = 0.33; +cyst = 0.85; +psi1 = 1.5; +psi2 = 0.125; +rhor = 0.75; +rhog = 0.95; +rhoz = 0.9; +rrst = 1; +pist = 3.2; +gamst = 0.55; +sig_r = .2; +sig_g = .6; +sig_z = .3; + +model; +#pist2 = exp(pist/400); +#rrst2 = exp(rrst/400); +#bet = 1/rrst2; +#phi = tau*(1-nu)/nu/kap/pist2^2; +#gst = 1/cyst; +#cst = (1-nu)^(1/tau); +#yst = cst*gst; +#dy = y-y(-1); +1 = exp(-tau*c(+1)+tau*c+R-z(+1)-p(+1)); +(1-nu)/nu/phi/(pist2^2)*(exp(tau*c)-1) = (exp(p)-1)*((1-1/2/nu)*exp(p)+1/2/nu) - bet*(exp(p(+1))-1)*exp(-tau*c(+1)+tau*c+y(+1)-y+p(+1)); +exp(c-y) = exp(-g) - phi*pist2^2*gst/2*(exp(p)-1)^2; +R = rhor*R(-1) + (1-rhor)*psi1*p + (1-rhor)*psi2*(y-g) + e_r; +g = rhog*g(-1) + e_g; +z = rhoz*z(-1) + e_z; +YGR = gamst+100*(dy+z); +INFL = pist+400*p; +INT = pist+rrst+4*gamst+400*R; +end; + +shocks; +var e_r = sig_r^2; +var e_g = sig_g^2; +var e_z = sig_z^2; +end; + +steady_state_model; +y = 0; +R = 0; +g = 0; +z = 0; +c = 0; +p = 0; +YGR = gamst; +INFL = pist; +INT = pist + rrst + 4*gamst; +end; + +steady; check; model_diagnostics; + +@#for orderApp in [1, 2, 3] + stoch_simul(order=@{orderApp},pruning,irf=0,periods=0); + pruned_state_space.order_@{orderApp} = pruned_state_space_system(M_, options_, oo_.dr, [], options_.ar, 1, 0); + @#if Andreasen_et_al_toolbox + addpath('Dynare44Pruning_v2/simAndMoments3order'); %provide path to toolbox + optPruning.orderApp = @{orderApp}; + outAndreasenetal.order_@{orderApp} = RunDynarePruning(optPruning,oo_,M_,[oo_.dr.ghx oo_.dr.ghu]); + rmpath('Dynare44Pruning_v2/simAndMoments3order'); + close all; + @#endif +@#endfor + +@#if Andreasen_et_al_toolbox + delete Andreasen_et_al_2018_Dynare44Pruning_v2.mat; + pause(3); + save('Andreasen_et_al_2018_Dynare44Pruning_v2.mat', 'outAndreasenetal') + pause(3); +@#endif + +load('Andreasen_et_al_2018_Dynare44Pruning_v2.mat') + +% Make comparisons only at orders 1 and 2 +for iorder = 1:3 + fprintf('ORDER %d:\n',iorder); + pruned = pruned_state_space.(sprintf('order_%d',iorder)); + outAndreasen = outAndreasenetal.(sprintf('order_%d',iorder)); + %make sure variable ordering is correct + if ~isequal(M_.endo_names,[outAndreasen.label_y; outAndreasen.label_v(1:M_.nspred)]) + error('variable ordering is not the same, change declaration order'); + end + norm_E_yx = norm(pruned.E_y(oo_.dr.inv_order_var) - [outAndreasen.Mean_y; outAndreasen.Mean_v(1:M_.nspred)] , Inf); + fprintf('max(sum(abs(E[y;x]''))): %d\n',norm_E_yx); + norm_Var_y = norm(pruned.Var_y(oo_.dr.inv_order_var(1:(M_.endo_nbr-M_.nspred)),oo_.dr.inv_order_var(1:(M_.endo_nbr-M_.nspred))) - outAndreasen.Var_y , Inf); + fprintf('max(sum(abs(Var[y]''))):: %d\n',norm_Var_y); + norm_Var_x = norm(pruned.Var_y(M_.nstatic+(1:M_.nspred),M_.nstatic+(1:M_.nspred)) - outAndreasen.Var_v(1:M_.nspred,1:M_.nspred) , Inf); + fprintf('max(sum(abs(Var[x]''))): %d\n',norm_Var_x); + norm_Corr_yi1 = norm(pruned.Corr_yi(oo_.dr.inv_order_var(1:(M_.endo_nbr-M_.nspred)),oo_.dr.inv_order_var(1:(M_.endo_nbr-M_.nspred)),1) - outAndreasen.Corr_y(:,:,1) , Inf); + fprintf('max(sum(abs(Corr[y,y(-1)]''))): %d\n',norm_Corr_yi1); + norm_Corr_yi2 = norm(pruned.Corr_yi(oo_.dr.inv_order_var(1:(M_.endo_nbr-M_.nspred)),oo_.dr.inv_order_var(1:(M_.endo_nbr-M_.nspred)),2) - outAndreasen.Corr_y(:,:,2) , Inf); + fprintf('max(sum(abs(Corr[y,y(-2)]''))): %d\n',norm_Corr_yi2); + norm_Corr_xi1 = norm(pruned.Corr_yi(M_.nstatic+(1:M_.nspred),M_.nstatic+(1:M_.nspred),1) - outAndreasen.Corr_v(1:M_.nspred,1:M_.nspred,1) , Inf); + fprintf('max(sum(abs(Corr[x,x(-1)]''))): %d\n',norm_Corr_xi1); + norm_Corr_xi2 = norm(pruned.Corr_yi(M_.nstatic+(1:M_.nspred),M_.nstatic+(1:M_.nspred),2) - outAndreasen.Corr_v(1:M_.nspred,1:M_.nspred,2) , Inf); + fprintf('max(sum(abs(Corr[x,x(-2)]''))): %d\n',norm_Corr_xi2); + + if iorder < 3 && any([norm_E_yx norm_Var_y norm_Var_x norm_Corr_yi1 norm_Corr_yi2 norm_Corr_xi1 norm_Corr_xi2] > 1e-5) + error('Something wrong with pruned_state_space.m compared to Andreasen et al 2018 Toolbox v2 at order %d.',iorder); + end +end +skipline(); +fprintf('Note that at third order, there is an error in the computation of Var_z in Andreasen et al (2018)''s toolbox, @wmutschl is in contact to clarify this.\n'); +fprintf('EXAMPLE:\n') +fprintf(' Consider Var[kron(kron(xf,xf),xf)] = E[kron(kron(kron(kron(kron(xf,xf),xf),xf),xf),xf)] - E[kron(kron(xf,xf),xf)]*E[kron(kron(xf,xf),xf)].''\n'); +fprintf(' Now note that xf=hx*xf(-1)+hu*u is Gaussian, that is E[kron(kron(xf,xf),xf)]=0, and Var[kron(kron(xf,xf),xf)] are the sixth-order product moments\n'); +fprintf(' which can be computed using the prodmom.m function by providing E[xf*xf''] as covariance matrix.\n'); +fprintf(' In order to replicate this you have to change UnconditionalMoments_3rd_Lyap.m to also output Var_z.\n') + +dynare_nx = M_.nspred; +dynare_E_xf2 = pruned_state_space.order_3.Var_z(1:dynare_nx,1:dynare_nx); +dynare_E_xf6 = pruned_state_space.order_3.Var_z((end-dynare_nx^3+1):end,(end-dynare_nx^3+1):end); +dynare_E_xf6 = dynare_E_xf6(:); + +Andreasen_nx = M_.nspred+M_.exo_nbr; +Andreasen_E_xf2 = outAndreasenetal.order_3.Var_z(1:Andreasen_nx,1:Andreasen_nx); +Andreasen_E_xf6 = outAndreasenetal.order_3.Var_z((end-Andreasen_nx^3+1):end,(end-Andreasen_nx^3+1):end); +Andreasen_E_xf6 = Andreasen_E_xf6(:); + +fprintf('Second-order product moments of xf and u are the same:\n') +norm_E_xf2 = norm(dynare_E_xf2-Andreasen_E_xf2(1:M_.nspred,1:M_.nspred),Inf) +norm_E_uu = norm(M_.Sigma_e-Andreasen_E_xf2(M_.nspred+(1:M_.exo_nbr),M_.nspred+(1:M_.exo_nbr)),Inf) + +% Compute unique sixth-order product moments of xf, i.e. unique(E[kron(kron(kron(kron(kron(xf,xf),xf),xf),xf),xf)],'stable') +dynare_nx6 = dynare_nx*(dynare_nx+1)/2*(dynare_nx+2)/3*(dynare_nx+3)/4*(dynare_nx+4)/5*(dynare_nx+5)/6; +dynare_Q6Px = Q6_plication(dynare_nx); +dynare_COMBOS6 = flipud(allVL1(dynare_nx, 6)); %all possible (unique) combinations of powers that sum up to six +dynare_true_E_xf6 = zeros(dynare_nx6,1); %only unique entries +for j6 = 1:size(dynare_COMBOS6,1) + dynare_true_E_xf6(j6) = prodmom(dynare_E_xf2, 1:dynare_nx, dynare_COMBOS6(j6,:)); +end +dynare_true_E_xf6 = dynare_Q6Px*dynare_true_E_xf6; %add duplicate entries +norm_dynare_E_xf6 = norm(dynare_true_E_xf6 - dynare_E_xf6, Inf); + +Andreasen_nx6 = Andreasen_nx*(Andreasen_nx+1)/2*(Andreasen_nx+2)/3*(Andreasen_nx+3)/4*(Andreasen_nx+4)/5*(Andreasen_nx+5)/6; +Andreasen_Q6Px = Q6_plication(Andreasen_nx); +Andreasen_COMBOS6 = flipud(allVL1(Andreasen_nx, 6)); %all possible (unique) combinations of powers that sum up to six +Andreasen_true_E_xf6 = zeros(Andreasen_nx6,1); %only unique entries +for j6 = 1:size(Andreasen_COMBOS6,1) + Andreasen_true_E_xf6(j6) = prodmom(Andreasen_E_xf2, 1:Andreasen_nx, Andreasen_COMBOS6(j6,:)); +end +Andreasen_true_E_xf6 = Andreasen_Q6Px*Andreasen_true_E_xf6; %add duplicate entries +norm_Andreasen_E_xf6 = norm(Andreasen_true_E_xf6 - Andreasen_E_xf6, Inf); + +fprintf('Sixth-order product moments of xf and u are not the same!\n'); +fprintf(' Dynare maximum absolute deviations of sixth-order product moments of xf: %d\n',norm_dynare_E_xf6) +fprintf(' Andreasen et al maximum absolute deviations of sixth-order product moments of xf: %d\n',norm_Andreasen_E_xf6) +skipline(); +fprintf('Note that the standard deviations are set quite high to make the numerical differences more apparent.\n'); diff --git a/tests/pruning/Andreasen_et_al_2018_Dynare44Pruning_v2.mat b/tests/pruning/Andreasen_et_al_2018_Dynare44Pruning_v2.mat new file mode 100644 index 0000000000000000000000000000000000000000..7bfbab5827dfc26b3676e694d2dc508f6b956b40 GIT binary patch literal 2982862 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%0A<~6bi<_lkapYb|YfEE!44a9BDsd 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