diff --git a/matlab/optimization/dynare_minimize_objective.m b/matlab/optimization/dynare_minimize_objective.m index 740534d56..18e19c7a3 100644 --- a/matlab/optimization/dynare_minimize_objective.m +++ b/matlab/optimization/dynare_minimize_objective.m @@ -70,21 +70,37 @@ switch minimizer_algorithm error('Optimization algorithm 1 requires the Optimization Toolbox') end % Set default optimization options for fmincon. - optim_options = optimoptions('fmincon','display','iter', 'MaxFunEvals',100000, 'TolFun',1e-8, 'TolX',1e-6); + if ~isoctave + optim_options = optimoptions('fmincon','display','iter', 'MaxFunEvals',100000, 'TolFun',1e-8, 'TolX',1e-6); + else + optim_options = optimset('display','iter', 'MaxFunEvals',100000, 'TolFun',1e-8, 'TolX',1e-6); + end if isoctave % Under Octave, use the active-set (i.e. octave_sqp of nonlin_min) % algorithm. On a simple example (fs2000.mod), the default algorithm % is not able to even move away from the initial point. - optim_options = optimoptions(optim_options, 'Algorithm','active-set'); + optim_options = optimset(optim_options, 'Algorithm','active-set'); end if options_.analytic_derivation || (isfield(options_,'mom') && options_.mom.analytic_jacobian==1) - optim_options = optimoptions(optim_options,'GradObj','on','TolX',1e-7); %alter default TolX + if ~isoctave + optim_options = optimoptions(optim_options,'GradObj','on','TolX',1e-7); %alter default TolX + else + optim_options = optimset('GradObj','on','TolX',1e-7); + end end if ~isempty(options_.optim_opt) - eval(['optim_options = optimoptions(optim_options,' options_.optim_opt ');']); + if ~isoctave + eval(['optim_options = optimoptions(optim_options,' options_.optim_opt ');']); + else + eval(['optim_options = optimset(optim_options,' options_.optim_opt ');']); + end end if options_.silent_optimizer - optim_options = optimoptions(optim_options,'display','off'); + if ~isoctave + optim_options = optimoptions(optim_options,'display','off'); + else + optim_options = optimset(optim_options,'display','off'); + end end if options_.analytic_derivation || (isfield(options_,'mom') && options_.mom.analytic_jacobian==1) %use wrapper func = @(x) analytic_gradient_wrapper(x,objective_function,varargin{:}); @@ -168,19 +184,32 @@ switch minimizer_algorithm error('Optimization algorithm 3 requires the Optimization Toolbox') end % Set default optimization options for fminunc. - optim_options = optimoptions('fminunc','display','iter','MaxFunEvals',100000,'TolFun',1e-8,'TolX',1e-6); + if ~isoctave + optim_options = optimoptions('fminunc','display','iter','MaxFunEvals',100000,'TolFun',1e-8,'TolX',1e-6); + else + optim_options = optimset('display','iter','MaxFunEvals',100000,'TolFun',1e-8,'TolX',1e-6); + end if ~isempty(options_.optim_opt) - eval(['optim_options = optimoptions(optim_options,' options_.optim_opt ');']); + if ~isoctave + eval(['optim_options = optimoptions(optim_options,' options_.optim_opt ');']); + else + eval(['optim_options = optimset(optim_options,' options_.optim_opt ');']); + end end if options_.silent_optimizer - optim_options = optimoptions(optim_options,'display','off'); + if ~isoctave + optim_options = optimoptions(optim_options,'display','off'); + else + optim_options = optimset(optim_options,'display','off'); + end end if options_.analytic_derivation || (isfield(options_,'mom') && options_.mom.analytic_jacobian==1) - optim_options = optimoptions(optim_options,'GradObj','on'); if ~isoctave + optim_options = optimoptions(optim_options,'GradObj','on'); func = @(x) analytic_gradient_wrapper(x,objective_function,varargin{:}); [opt_par_values,fval,exitflag] = fminunc(func,start_par_value,optim_options); else + optim_options = optimset(optim_options,'display','off'); % Under Octave, use a wrapper, since fminunc() does not have a 4th arg func = @(x) analytic_gradient_wrapper(x,objective_function,varargin{:}); [opt_par_values,fval,exitflag] = fminunc(func,start_par_value,optim_options); @@ -507,9 +536,17 @@ switch minimizer_algorithm elseif ~isoctave && ~user_has_matlab_license('optimization_toolbox') error('Option mode_compute=13 requires the Optimization Toolbox') end - optim_options = optimoptions('lsqnonlin','display','iter','MaxFunEvals',5000,'MaxIter',5000,'TolFun',1e-6,'TolX',1e-6); + if ~isoctave + optim_options = optimoptions('lsqnonlin','display','iter','MaxFunEvals',5000,'MaxIter',5000,'TolFun',1e-6,'TolX',1e-6); + else + optim_options = optimset('display','iter','MaxFunEvals',5000,'MaxIter',5000,'TolFun',1e-6,'TolX',1e-6); + end if ~isempty(options_.optim_opt) - eval(['optim_options = optimoptions(optim_options,' options_.optim_opt ');']); + if ~isoctave + eval(['optim_options = optimoptions(optim_options,' options_.optim_opt ');']); + else + eval(['optim_options = optimset(optim_options,' options_.optim_opt ');']); + end end if options_.silent_optimizer optim_options.Display='off'; @@ -567,12 +604,24 @@ switch minimizer_algorithm error('Optimization algorithm 2 requires the Global Optimization Toolbox') end % Set default optimization options for simulannealbnd. - optim_options = optimoptions('simulannealbnd','display','iter','TolFun',1e-8); + if ~isoctave + optim_options = optimoptions('simulannealbnd','display','iter','TolFun',1e-8); + else + optim_options = saoptimset('display','iter','TolFun',1e-8); + end if ~isempty(options_.optim_opt) - eval(['optim_options = optimoptions(optim_options,' options_.optim_opt ');']); + if ~isoctave + eval(['optim_options = optimoptions(optim_options,' options_.optim_opt ');']); + else + eval(['optim_options = saoptimset(optim_options,' options_.optim_opt ');']); + end end if options_.silent_optimizer - optim_options = optimoptions(optim_options,'display','off'); + if ~isoctave + optim_options = optimoptions(optim_options,'display','off'); + else + optim_options = saoptimset(optim_options,'display','off'); + end end func = @(x)objective_function(x,varargin{:}); [opt_par_values,fval,exitflag,output] = simulannealbnd(func,start_par_value,bounds(:,1),bounds(:,2),optim_options);