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