48 lines
1.7 KiB
Matlab
Executable File
48 lines
1.7 KiB
Matlab
Executable File
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'); |