1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.math.analysis;
18
19 import org.apache.commons.math.MathException;
20
21 import junit.framework.Test;
22 import junit.framework.TestCase;
23 import junit.framework.TestSuite;
24
25
26
27
28
29
30
31
32
33
34
35
36 public final class BrentSolverTest extends TestCase {
37
38 public BrentSolverTest(String name) {
39 super(name);
40 }
41
42 public static Test suite() {
43 TestSuite suite = new TestSuite(BrentSolverTest.class);
44 suite.setName("UnivariateRealSolver Tests");
45 return suite;
46 }
47
48 public void testSinZero() throws MathException {
49
50
51
52 UnivariateRealFunction f = new SinFunction();
53 double result;
54 UnivariateRealSolver solver = new BrentSolver(f);
55
56 result = solver.solve(3, 4);
57
58
59 assertEquals(result, Math.PI, solver.getAbsoluteAccuracy());
60
61 assertTrue(solver.getIterationCount() <= 5);
62
63 result = solver.solve(1, 4);
64
65
66 assertEquals(result, Math.PI, solver.getAbsoluteAccuracy());
67
68 assertTrue(solver.getIterationCount() <= 6);
69 solver = new SecantSolver(f);
70 result = solver.solve(3, 4);
71
72
73 assertEquals(result, Math.PI, solver.getAbsoluteAccuracy());
74
75 assertTrue(solver.getIterationCount() <= 5);
76 result = solver.solve(1, 4);
77
78
79 assertEquals(result, Math.PI, solver.getAbsoluteAccuracy());
80
81 assertTrue(solver.getIterationCount() <= 6);
82 assertEquals(result, solver.getResult(), 0);
83 }
84
85 public void testQuinticZero() throws MathException {
86
87
88
89
90
91
92
93 UnivariateRealFunction f = new QuinticFunction();
94 double result;
95
96 UnivariateRealSolver solver = new BrentSolver(f);
97
98
99 result = solver.solve(-0.2, 0.2);
100
101
102 assertEquals(result, 0, solver.getAbsoluteAccuracy());
103 assertTrue(solver.getIterationCount() <= 2);
104
105
106 result = solver.solve(-0.1, 0.3);
107
108
109 assertEquals(result, 0, solver.getAbsoluteAccuracy());
110
111 assertTrue(solver.getIterationCount() <= 6);
112
113 result = solver.solve(-0.3, 0.45);
114
115
116 assertEquals(result, 0, solver.getAbsoluteAccuracy());
117
118 assertTrue(solver.getIterationCount() <= 7);
119
120 result = solver.solve(0.3, 0.7);
121
122
123 assertEquals(result, 0.5, solver.getAbsoluteAccuracy());
124
125 assertTrue(solver.getIterationCount() <= 7);
126
127 result = solver.solve(0.2, 0.6);
128
129
130 assertEquals(result, 0.5, solver.getAbsoluteAccuracy());
131
132 assertTrue(solver.getIterationCount() <= 7);
133
134 result = solver.solve(0.05, 0.95);
135
136
137 assertEquals(result, 0.5, solver.getAbsoluteAccuracy());
138
139 assertTrue(solver.getIterationCount() <= 9);
140
141
142 result = solver.solve(0.85, 1.25);
143
144
145 assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
146
147 assertTrue(solver.getIterationCount() <= 9);
148
149 result = solver.solve(0.8, 1.2);
150
151
152 assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
153
154 assertTrue(solver.getIterationCount() <= 9);
155
156 result = solver.solve(0.85, 1.75);
157
158
159 assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
160
161 assertTrue(solver.getIterationCount() <= 11);
162
163 result = solver.solve(0.55, 1.45);
164
165
166 assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
167
168 assertTrue(solver.getIterationCount() <= 8);
169
170 result = solver.solve(0.85, 5);
171
172
173 assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
174
175 assertTrue(solver.getIterationCount() <= 13);
176
177 solver = new SecantSolver(f);
178 result = solver.solve(-0.2, 0.2);
179
180
181 assertEquals(result, 0, solver.getAbsoluteAccuracy());
182
183 assertTrue(solver.getIterationCount() <= 2);
184 result = solver.solve(-0.1, 0.3);
185
186
187 assertEquals(result, 0, solver.getAbsoluteAccuracy());
188
189 assertTrue(solver.getIterationCount() <= 6);
190 result = solver.solve(-0.3, 0.45);
191
192
193 assertEquals(result, 0, solver.getAbsoluteAccuracy());
194
195 assertTrue(solver.getIterationCount() <= 7);
196 result = solver.solve(0.3, 0.7);
197
198
199 assertEquals(result, 0.5, solver.getAbsoluteAccuracy());
200
201 assertTrue(solver.getIterationCount() <= 8);
202 result = solver.solve(0.2, 0.6);
203
204
205 assertEquals(result, 0.5, solver.getAbsoluteAccuracy());
206
207 assertTrue(solver.getIterationCount() <= 7);
208 result = solver.solve(0.05, 0.95);
209
210
211 assertEquals(result, 0.5, solver.getAbsoluteAccuracy());
212
213 assertTrue(solver.getIterationCount() <= 9);
214 result = solver.solve(0.85, 1.25);
215
216
217 assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
218
219 assertTrue(solver.getIterationCount() <= 11);
220 result = solver.solve(0.8, 1.2);
221
222
223 assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
224
225 assertTrue(solver.getIterationCount() <= 9);
226 result = solver.solve(0.85, 1.75);
227
228
229 assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
230
231 assertTrue(solver.getIterationCount() <= 15);
232
233
234 result = solver.solve(0.55, 1.45);
235
236
237 assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
238
239 assertTrue(solver.getIterationCount() <= 8);
240 result = solver.solve(0.85, 5);
241
242
243 assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
244
245 assertTrue(solver.getIterationCount() <= 15);
246
247 result = UnivariateRealSolverUtils.solve(f, -0.2, 0.2);
248 assertEquals(result, 0, solver.getAbsoluteAccuracy());
249 result = UnivariateRealSolverUtils.solve(f, -0.1, 0.3);
250 assertEquals(result, 0, 1E-8);
251 result = UnivariateRealSolverUtils.solve(f, -0.3, 0.45);
252 assertEquals(result, 0, 1E-6);
253 result = UnivariateRealSolverUtils.solve(f, 0.3, 0.7);
254 assertEquals(result, 0.5, 1E-6);
255 result = UnivariateRealSolverUtils.solve(f, 0.2, 0.6);
256 assertEquals(result, 0.5, 1E-6);
257 result = UnivariateRealSolverUtils.solve(f, 0.05, 0.95);
258 assertEquals(result, 0.5, 1E-6);
259 result = UnivariateRealSolverUtils.solve(f, 0.85, 1.25);
260 assertEquals(result, 1.0, 1E-6);
261 result = UnivariateRealSolverUtils.solve(f, 0.8, 1.2);
262 assertEquals(result, 1.0, 1E-6);
263 result = UnivariateRealSolverUtils.solve(f, 0.85, 1.75);
264 assertEquals(result, 1.0, 1E-6);
265 result = UnivariateRealSolverUtils.solve(f, 0.55, 1.45);
266 assertEquals(result, 1.0, 1E-6);
267 result = UnivariateRealSolverUtils.solve(f, 0.85, 5);
268 assertEquals(result, 1.0, 1E-6);
269 }
270
271 public void testBadEndpoints() throws Exception {
272 UnivariateRealFunction f = new SinFunction();
273 UnivariateRealSolver solver = new BrentSolver(f);
274 try {
275 solver.solve(1, -1);
276 fail("Expecting IllegalArgumentException - bad interval");
277 } catch (IllegalArgumentException ex) {
278
279 }
280 try {
281 solver.solve(1, 1.5);
282 fail("Expecting IllegalArgumentException - non-bracketing");
283 } catch (IllegalArgumentException ex) {
284
285 }
286 }
287
288 public void testInitialGuess() throws MathException {
289
290 MonitoredFunction f = new MonitoredFunction(new QuinticFunction());
291 UnivariateRealSolver solver = new BrentSolver(f);
292 double result;
293
294
295 result = solver.solve(0.6, 7.0);
296 assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
297 int referenceCallsCount = f.getCallsCount();
298 assertTrue(referenceCallsCount >= 13);
299
300
301 try {
302 result = solver.solve(0.6, 7.0, 0.0);
303 fail("an IllegalArgumentException was expected");
304 } catch (IllegalArgumentException iae) {
305
306 } catch (Exception e) {
307 fail("wrong exception caught: " + e.getMessage());
308 }
309
310
311 f.setCallsCount(0);
312 result = solver.solve(0.6, 7.0, 0.61);
313 assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
314 assertTrue(f.getCallsCount() > referenceCallsCount);
315
316
317 f.setCallsCount(0);
318 result = solver.solve(0.6, 7.0, 0.999999);
319 assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
320 assertTrue(f.getCallsCount() < referenceCallsCount);
321
322
323 f.setCallsCount(0);
324 result = solver.solve(0.6, 7.0, 1.0);
325 assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
326 assertEquals(0, solver.getIterationCount());
327 assertEquals(1, f.getCallsCount());
328
329 }
330
331 }