From 68a33a76d88fd7cd256d5395365a98de9d150c41 Mon Sep 17 00:00:00 2001
From: Johannes Pfeifer <jpfeifer@gmx,de>
Date: Mon, 4 Nov 2013 21:53:44 +0100
Subject: [PATCH] Add function to check covariances for consistency in
 stochastic simulations

---
 matlab/check_consistency_covariances.m | 31 ++++++++++++++++++++++++++
 matlab/check_model.m                   |  9 ++++++++
 2 files changed, 40 insertions(+)
 create mode 100644 matlab/check_consistency_covariances.m

diff --git a/matlab/check_consistency_covariances.m b/matlab/check_consistency_covariances.m
new file mode 100644
index 0000000000..e8245721de
--- /dev/null
+++ b/matlab/check_consistency_covariances.m
@@ -0,0 +1,31 @@
+function correct_flag=check_consistency_covariances(Covariance_matrix)
+% function check_consistency_covariances(Covariance_matrix)
+% checks consistency of covariance matrices by checking whether the
+% covariances imply correlations bigger than 1.
+%
+% Outputs: correct_flag         [scalar] 0 if not consistent, 1 otherwise
+% Inputs: Covariance_matrix     [matrix] covariance matrix to be checked
+
+% Copyright (C) 2013 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 <http://www.gnu.org/licenses/>.
+
+%compute theoretical bound by assuming correlation of 1
+bound=diag(sqrt(diag(Covariance_matrix)))*ones(size(Covariance_matrix))*diag(sqrt(diag(Covariance_matrix)));
+correct_flag=1;
+if any(any(tril(Covariance_matrix,-1)>bound)) || any(any(tril(Covariance_matrix,-1)<-bound))
+    correct_flag=0;
+end
\ No newline at end of file
diff --git a/matlab/check_model.m b/matlab/check_model.m
index 3edf7b7462..60cf7cba1e 100644
--- a/matlab/check_model.m
+++ b/matlab/check_model.m
@@ -30,4 +30,13 @@ end
 if (DynareModel.exo_det_nbr > 0) && (DynareModel.maximum_lag > 1 || DynareModel.maximum_lead > 1)
     error(['Exogenous deterministic variables are currently only allowed in' ...
            ' models with leads and lags on only one period'])
+end
+
+if ~check_consistency_covariances(DynareModel.Sigma_e)
+    error('The specified covariances for the structural errors are not consistent with the variances as they imply a correlation larger than +-1')
+end
+if ~isequal(DynareModel.H,0)
+    if ~check_consistency_covariances(DynareModel.H)
+        error('The specified covariances for the measurement errors are not consistent with the variances as they imply a correlation larger than +-1')
+    end
 end
\ No newline at end of file
-- 
GitLab