Dynamic-Calibration/utils/YALMIP-master/extras/bisection.m

48 lines
1.7 KiB
Mathematica
Raw Normal View History

2019-12-18 11:25:45 +00:00
function diagnostic = bisection(varargin)
%BISECTION Solve simple quasi-convex MAXIMIZATION problem by bisection
%
% DIAGNOSTIC = BISECTION(F,h,options,tolerance)
%
% min t
% subject to
% F(x,t) >=0
%
% NOTES
% It is assumed that the problem is quasi-convex in the scalar simple
% variable t.
%
% Lower and upper bounds are automatically derived
% (you are adviced not to add simple bounds on the t-variable)
%
% Default bisection tolerance 1e-5.
%
% The algorithm simply solves a series of feasibility problems where the
% parameter t is fixed, and hones in on an optimal value using bisection
%
% It is recommended to explicitly set a solver. Otherwise YALMIP will
% have to try to figure out a suitable solver for the feasibility
% problems
solvertime = tic;
Constraints = varargin{1};
Objective = varargin{2};
if isequal(getbase(Objective),[0 -1])
% User wants to maximize something, so we can reuse old code format
varargin{2} = -Objective;
options = varargin{3};
options.bisection.switchedsign = 0;
options.solver = options.bisection.solver;
varargin{3} = options;
diagnostic = bisection_core(varargin{:});
elseif isequal(getbase(Objective),[0 1])
% User wants to minimize something. Rewrite as old max code
options = varargin{3};
options.bisection.switchedsign = 1;
options.solver = options.bisection.solver;
varargin{3} = options;
Constraints = replace(Constraints, Objective, -Objective);
varargin{1} = Constraints;
diagnostic = bisection_core(varargin{:});
end
diagnostic.yalmiptime = toc(solvertime)-diagnostic.solvertime;
diagnostic.info = yalmiperror(diagnostic.problem,'bisection');