diff --git a/matlab/default_option_values.m b/matlab/default_option_values.m index 712fd6ef185b1cd349de351c45d5b3f20e29a0c9..ca98027a2292251fd883d5a467afd0df8eead2ac 100644 --- a/matlab/default_option_values.m +++ b/matlab/default_option_values.m @@ -52,6 +52,7 @@ options_.lyapunov_complex_threshold = 1e-15; options_.solve_algo = 4; options_.solve_tolf = eps^(1/3); options_.solve_tolx = eps^(2/3); +options_.solve_randomize_initial_guess = true; options_.trust_region_initial_step_bound_factor = 1; options_.dr_display_tol=1e-6; options_.minimal_workspace = false; diff --git a/matlab/dynare_solve.m b/matlab/dynare_solve.m index c0a3fd41ff813f9066628e88b9a87274302081fd..944a3806c4b1017e07dd0d5acc6411ea743584a7 100644 --- a/matlab/dynare_solve.m +++ b/matlab/dynare_solve.m @@ -59,7 +59,6 @@ else end % checking initial values -% TODO We should have an option to deactivate the randomization. if jacobian_flag [fvec, fjac] = feval(f, x, varargin{:}); wrong_initial_guess_flag = false; @@ -70,36 +69,38 @@ if jacobian_flag errorcode = -11; return; end - if any(~isreal(fvec)) || any(~isreal(fjac(:))) - disp_verbose('dynare_solve: starting value results in complex values. Randomize initial guess...', options.verbosity) - else - disp_verbose('dynare_solve: starting value results in nonfinite/NaN value. Randomize initial guess...', options.verbosity) - end - % Let's try random numbers for the variables initialized with the default value. - wrong_initial_guess_flag = true; - % First try with positive numbers. - tentative_number = 0; - while wrong_initial_guess_flag && tentative_number<=in0*10 - tentative_number = tentative_number+1; - x(idx) = rand(in0, 1)*10; - [fvec, fjac] = feval(f, x, varargin{:}); - wrong_initial_guess_flag = ~all(isfinite(fvec)) || any(isinf(fjac(:))) || any(isnan((fjac(:)))); - end - % If all previous attempts failed, try with real numbers. - tentative_number = 0; - while wrong_initial_guess_flag && tentative_number<=in0*10 - tentative_number = tentative_number+1; - x(idx) = randn(in0, 1)*10; - [fvec, fjac] = feval(f, x, varargin{:}); - wrong_initial_guess_flag = ~all(isfinite(fvec)) || any(isinf(fjac(:))) || any(isnan((fjac(:)))); - end - % Last tentative, ff all previous attempts failed, try with negative numbers. - tentative_number = 0; - while wrong_initial_guess_flag && tentative_number<=in0*10 - tentative_number = tentative_number+1; - x(idx) = -rand(in0, 1)*10; - [fvec, fjac] = feval(f, x, varargin{:}); - wrong_initial_guess_flag = ~all(isfinite(fvec)) || any(isinf(fjac(:))) || any(isnan((fjac(:)))); + if options.solve_randomize_initial_guess + if any(~isreal(fvec)) || any(~isreal(fjac(:))) + disp_verbose('dynare_solve: starting value results in complex values. Randomize initial guess...', options.verbosity) + else + disp_verbose('dynare_solve: starting value results in nonfinite/NaN value. Randomize initial guess...', options.verbosity) + end + % Let's try random numbers for the variables initialized with the default value. + wrong_initial_guess_flag = true; + % First try with positive numbers. + tentative_number = 0; + while wrong_initial_guess_flag && tentative_number<=in0*10 + tentative_number = tentative_number+1; + x(idx) = rand(in0, 1)*10; + [fvec, fjac] = feval(f, x, varargin{:}); + wrong_initial_guess_flag = ~all(isfinite(fvec)) || any(isinf(fjac(:))) || any(isnan((fjac(:)))); + end + % If all previous attempts failed, try with real numbers. + tentative_number = 0; + while wrong_initial_guess_flag && tentative_number<=in0*10 + tentative_number = tentative_number+1; + x(idx) = randn(in0, 1)*10; + [fvec, fjac] = feval(f, x, varargin{:}); + wrong_initial_guess_flag = ~all(isfinite(fvec)) || any(isinf(fjac(:))) || any(isnan((fjac(:)))); + end + % Last tentative, ff all previous attempts failed, try with negative numbers. + tentative_number = 0; + while wrong_initial_guess_flag && tentative_number<=in0*10 + tentative_number = tentative_number+1; + x(idx) = -rand(in0, 1)*10; + [fvec, fjac] = feval(f, x, varargin{:}); + wrong_initial_guess_flag = ~all(isfinite(fvec)) || any(isinf(fjac(:))) || any(isnan((fjac(:)))); + end end end else