forked from ndwork/dworkLib
-
Notifications
You must be signed in to change notification settings - Fork 0
/
binarySearch.m
58 lines (48 loc) · 1.41 KB
/
binarySearch.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
function out = binarySearch( f, LB, UB, varargin )
% out = binarySearch( f, LB, UB [, 'tol', tol, 'nMax', nMax ] )
%
% finds the root of the function f using a binary search
%
% Inputs:
% f - function handle
% LB - the lower bound of the root
% UB - the upper bound of the root
%
% Optional Inputs:
% tol - the tolerance to use when finding the root (default is 1d-6)
% nMax - the maximum number of iterations (default is 1000)
%
% Written by Nicholas Dwork, Copyright 2019
%
% This software is offered under the GNU General Public License 3.0. It
% is offered without any warranty expressed or implied, including the
% implied warranties of merchantability or fitness for a particular
% purpose.
if nargin < 3
disp( 'Usage: out = binarySearch( f, LB, UB [, ''tol'', tol, ''nMax'', nMax ] )' );
return
end
p = inputParser;
p.addParameter( 'nMax', 1000, @ispositive );
p.addParameter( 'tol', 1d-6, @ispositive );
p.parse( varargin{:} );
nMax = p.Results.nMax;
tol = p.Results.tol;
thisLB = LB; fLB = f( thisLB );
thisUB = UB; %fUB = f( thisUB ); % fUB is never used
i = 0;
while i < nMax
mid = 0.5 * ( thisUB + thisLB );
if thisUB - thisLB < tol, break; end
fMid = f( mid );
if fMid == 0, break; end
if sign( fLB ) == sign( fMid )
thisLB = mid;
fLB = fMid;
else
thisUB = mid;
end
i = i + 1;
end
out = mid;
end