From caea047c2dc912e4873271e8caa0f056940382c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= Date: Mon, 25 May 2020 17:29:24 +0200 Subject: [PATCH] solve_one_boundary: remove unused codepaths for solve_algo={0,1,2,3} Those cases are handled by dynare_solve. --- matlab/solve_one_boundary.m | 78 ++++--------------------------------- 1 file changed, 7 insertions(+), 71 deletions(-) diff --git a/matlab/solve_one_boundary.m b/matlab/solve_one_boundary.m index 9ab481675..503131c46 100644 --- a/matlab/solve_one_boundary.m +++ b/matlab/solve_one_boundary.m @@ -189,46 +189,7 @@ for it_=start:incr:finish end ya_save=ya; g1a=g1; - if ~is_dynamic && options.solve_algo==0 - if verbose - disp('steady: fsolve') - end - if ~isoctave - if ~user_has_matlab_license('optimization_toolbox') - error('SOLVE_ONE_BOUNDARY: you can''t use solve_algo=0 since you don''t have MATLAB''s Optimization Toolbox') - end - end - options=optimset('fsolve'); - options.MaxFunEvals = 50000; - options.MaxIter = 2000; - options.TolFun=1e-8; - options.Display = 'iter'; - options.Jacobian = 'on'; - if ~isoctave - [yn,fval,exitval,output] = fsolve(@local_fname, y(y_index_eq), ... - options, x, params, steady_state, y, y_index_eq, fname, 0); - else - % Under Octave, use a wrapper, since fsolve() does not have a 4th arg - func = @(z) local_fname(z, x, params, steady_state, y, y_index_eq, fname, 0); - % The Octave version of fsolve does not converge when it starts from the solution - fvec = feval(func,y(y_index_eq)); - if max(abs(fvec)) >= options.solve_tolf - [yn,fval,exitval,output] = fsolve(func,y(y_index_eq),options); - else - yn = y(y_index_eq); - exitval = 3; - end - end - y(y_index_eq) = yn; - if exitval > 0 - info = 0; - else - info = -Block_Num*10; - end - elseif (~is_dynamic && options.solve_algo==2) || (is_dynamic && stack_solve_algo==4) - if verbose && ~is_dynamic - disp('steady: LU + lnsrch1') - end + if is_dynamic && stack_solve_algo==4 lambda=1; stpmx = 100 ; if is_dynamic @@ -240,30 +201,12 @@ for it_=start:incr:finish g = (r'*g1)'; f = 0.5*r'*r; p = -g1\r ; - if is_dynamic - [ya,f,r,check]=lnsrch1(y(it_,:)',f,g,p,stpmax, ... - 'lnsrch1_wrapper_one_boundary',nn, ... - y_index_eq, options.solve_tolx, y_index_eq, fname, y, x, params, steady_state, it_); - dx = ya' - y(it_, :); - else - [ya,f,r,check]=lnsrch1(y,f,g,p,stpmax,fname,nn,y_index_eq, options.solve_tolx, x, ... - params, steady_state,0); - dx = ya - y(y_index_eq); - end - if is_dynamic - y(it_,:) = ya'; - else - y = ya'; - end - elseif ~is_dynamic && options.solve_algo==3 - if verbose - disp('steady: csolve') - end - [yn,info] = csolve(@local_fname, y(y_index_eq),@ ... - local_fname,1e-6,500, x, params, steady_state, y, y_index_eq, fname, 1); - dx = ya - yn; - y(y_index_eq) = yn; - elseif (stack_solve_algo==1 && is_dynamic) || (stack_solve_algo==0 && is_dynamic) || (~is_dynamic && (options.solve_algo==1 || options.solve_algo==6)) + [ya,f,r,check]=lnsrch1(y(it_,:)',f,g,p,stpmax, ... + 'lnsrch1_wrapper_one_boundary',nn, ... + y_index_eq, options.solve_tolx, y_index_eq, fname, y, x, params, steady_state, it_); + dx = ya' - y(it_, :); + y(it_,:) = ya'; + elseif (is_dynamic && (stack_solve_algo==1 || stack_solve_algo==0)) || (~is_dynamic && options.solve_algo==6) if verbose && ~is_dynamic disp('steady: Sparse LU ') end @@ -397,10 +340,3 @@ if is_dynamic else info = 0; end - -function [err, G]=local_fname(yl, x, params, steady_state, y, y_index_eq, fname, is_csolve) -y(y_index_eq) = yl; -[err, y, G] = feval(fname, y, x, params, steady_state, 0); -if(is_csolve) - G = full(G); -end