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