From e3e6f4c9b4fc1431ccc16063dc4a89ffb93fecb8 Mon Sep 17 00:00:00 2001 From: Johannes Pfeifer <jpfeifer@gmx.de> Date: Thu, 21 Dec 2023 12:33:53 +0100 Subject: [PATCH] :bug: get_mean.m: fix internal logic --- matlab/accessors/get_mean.m | 53 +++++++++++++++++++++++++------------ 1 file changed, 36 insertions(+), 17 deletions(-) diff --git a/matlab/accessors/get_mean.m b/matlab/accessors/get_mean.m index 3c54cb98a8..377ee5e16e 100644 --- a/matlab/accessors/get_mean.m +++ b/matlab/accessors/get_mean.m @@ -1,14 +1,15 @@ function y0 = get_mean(varargin) -% function x = get_mean(vname1, vname2, <order>) -% returns the steady-state of a variable identified by its name +% function y0 = get_mean(varargin) +% returns the mean of a variable identified by its name % % INPUTS: -% vname1, vname2, ... : list of variable names -% order: if integer 1 or 2, optionally last input can trigger the order -% at which steady state is computed +% vargargin inputs containing +% - vname1, vname2, ... : list of variable names +% - order: if integer 1 or 2, optionally last input can trigger the order +% at which steady state is computed % % OUTPUTS -% x: steady state values +% y0: mean values % % SPECIAL REQUIREMENTS % none @@ -30,27 +31,45 @@ function y0 = get_mean(varargin) % You should have received a copy of the GNU General Public License % along with Dynare. If not, see <https://www.gnu.org/licenses/>. -global M_ oo_ options_ +global M_ options_ oo_ if ~isempty(regexp(varargin{end},'\d','ONCE')) && isempty(regexp(varargin{end},'\D','ONCE')) order=eval(varargin{end}); + nvars=length(varargin)-1; else order=1; + nvars=length(varargin); end if order==1 - ys_ = oo_.steady_state; - ys_ = evaluate_steady_state(ys_,[oo_.exo_steady_state; oo_.exo_det_steady_state],M_,options_,true); + if isfield(oo_,'dr') && isfield(oo_.dr,'ys') + ys_=oo_.dr.ys; + else + ys_ = oo_.steady_state; + ys_ = evaluate_steady_state(ys_,[oo_.exo_steady_state; oo_.exo_det_steady_state],M_,options_,true); + end elseif order==2 - ys_ = oo_.dr.ys; - ys_(oo_.dr.order_var)=ys_(oo_.dr.order_var)+oo_.dr.ghs2./2; + if isfield(oo_,'dr') && isfield(oo_.dr,'ys') + ys_=oo_.dr.ys; + if ~isfield(oo_.dr,'ghs2') + error('get_mean: ghs2 needs to be present in oo_ to compute mean at order=2') + else + ys_(oo_.dr.order_var)=ys_(oo_.dr.order_var)+oo_.dr.ghs2./2; + end + else + error('get_mean: decision rules need to be present in oo_ to compute mean') + end else - return + error('get_mean: order>2 not implemented') end -lgy_ = M_.endo_names; -mfys=nan(length(varargin),1); -for j=1:length(varargin) - mfys(j) = find(strcmp(varargin{j},lgy_)); +mfys=NaN(nvars,1); +for j=1:nvars + endo_index=find(strcmp(varargin{j},M_.endo_names)); + if isempty(endo_index) + error('get_mean: unknown variables %s requested',varargin{j}) + else + mfys(j) = find(strcmp(varargin{j},M_.endo_names)); + end end -y0 = ys_(mfys); +y0 = ys_(mfys); \ No newline at end of file -- GitLab