Fixed bugs (initialization of the Kalman filter with the fixed point of the Riccatti equation).

time-shift
Stéphane Adjemian (Charybdis) 2012-05-30 17:59:05 +02:00
parent 0caaeddb46
commit 3cbd702b3e
1 changed files with 7 additions and 5 deletions

View File

@ -361,7 +361,7 @@ if (kalman_algo == 2) || (kalman_algo == 4)
else else
if all(all(abs(H-diag(diag(H)))<1e-14))% ie, the covariance matrix is diagonal... if all(all(abs(H-diag(diag(H)))<1e-14))% ie, the covariance matrix is diagonal...
H = diag(H); H = diag(H);
mmm = mm; mmm = mm;
else else
Z = [Z, eye(pp)]; Z = [Z, eye(pp)];
T = blkdiag(T,zeros(pp)); T = blkdiag(T,zeros(pp));
@ -410,7 +410,7 @@ switch DynareOptions.lik_init
% Use standard kalman filter except if the univariate filter is explicitely choosen. % Use standard kalman filter except if the univariate filter is explicitely choosen.
if kalman_algo == 0 if kalman_algo == 0
kalman_algo = 3; kalman_algo = 3;
elseif ~((kalman_algo == 3) || (kalman_algo == 4)) elseif ~((kalman_algo == 3) || (kalman_algo == 4))
error(['diffuse filter: options_.kalman_algo can only be equal ' ... error(['diffuse filter: options_.kalman_algo can only be equal ' ...
'to 0 (default), 3 or 4']) 'to 0 (default), 3 or 4'])
end end
@ -475,16 +475,18 @@ switch DynareOptions.lik_init
kalman_algo = 1; kalman_algo = 1;
end end
if isequal(H,0) if isequal(H,0)
[err,Pstar] = kalman_steady_state(transpose(T),R*Q*transpose(R),transpose(build_selection_matrix(Z,np,length(Z)))); [err,Pstar] = kalman_steady_state(transpose(T),R*Q*transpose(R),transpose(build_selection_matrix(Z,mm,length(Z))));
else else
[err,Pstar] = kalman_steady_state(transpose(T),R*Q*transpose(R),transpose(build_selection_matrix(Z,np,length(Z))),H); [err,Pstar] = kalman_steady_state(transpose(T),R*Q*transpose(R),transpose(build_selection_matrix(Z,mm,length(Z))),H);
end end
if err if err
disp(['dsge_likelihood:: I am not able to solve the Riccati equation, so I switch to lik_init=1!']); disp(['dsge_likelihood:: I am not able to solve the Riccati equation, so I switch to lik_init=1!']);
DynareOptions.lik_init = 1; DynareOptions.lik_init = 1;
Pstar = lyapunov_symm(T,R*Q*R',DynareOptions.qz_criterium,DynareOptions.lyapunov_complex_threshold); Pstar = lyapunov_symm(T,R*Q*R',DynareOptions.qz_criterium,DynareOptions.lyapunov_complex_threshold);
end end
Pinf = []; Pinf = [];
a = zeros(mm,1);
Zflag = 0;
otherwise otherwise
error('dsge_likelihood:: Unknown initialization approach for the Kalman filter!') error('dsge_likelihood:: Unknown initialization approach for the Kalman filter!')
end end