1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.math.analysis.solvers;
18
19 import org.apache.commons.math.FunctionEvaluationException;
20 import org.apache.commons.math.MaxIterationsExceededException;
21 import org.apache.commons.math.analysis.UnivariateRealFunction;
22
23
24
25
26
27
28
29
30
31 public class BisectionSolver extends UnivariateRealSolverImpl {
32
33
34
35
36
37
38
39
40
41
42 @Deprecated
43 public BisectionSolver(UnivariateRealFunction f) {
44 super(f, 100, 1E-6);
45 }
46
47
48
49
50
51 public BisectionSolver() {
52 super(100, 1E-6);
53 }
54
55
56 @Deprecated
57 public double solve(double min, double max, double initial)
58 throws MaxIterationsExceededException, FunctionEvaluationException {
59 return solve(f, min, max);
60 }
61
62
63 @Deprecated
64 public double solve(double min, double max)
65 throws MaxIterationsExceededException, FunctionEvaluationException {
66 return solve(f, min, max);
67 }
68
69
70 public double solve(final UnivariateRealFunction f, double min, double max, double initial)
71 throws MaxIterationsExceededException, FunctionEvaluationException {
72 return solve(min, max);
73 }
74
75
76 public double solve(final UnivariateRealFunction f, double min, double max)
77 throws MaxIterationsExceededException, FunctionEvaluationException {
78
79 clearResult();
80 verifyInterval(min,max);
81 double m;
82 double fm;
83 double fmin;
84
85 int i = 0;
86 while (i < maximalIterationCount) {
87 m = UnivariateRealSolverUtils.midpoint(min, max);
88 fmin = f.value(min);
89 fm = f.value(m);
90
91 if (fm * fmin > 0.0) {
92
93 min = m;
94 } else {
95
96 max = m;
97 }
98
99 if (Math.abs(max - min) <= absoluteAccuracy) {
100 m = UnivariateRealSolverUtils.midpoint(min, max);
101 setResult(m, i);
102 return m;
103 }
104 ++i;
105 }
106
107 throw new MaxIterationsExceededException(maximalIterationCount);
108 }
109 }