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 import org.apache.commons.math.TestUtils;
21
22 import junit.framework.TestCase;
23
24
25
26
27 public final class BisectionSolverTest extends TestCase {
28
29
30
31 public void testSinZero() throws MathException {
32 UnivariateRealFunction f = new SinFunction();
33 double result;
34
35 UnivariateRealSolver solver = new BisectionSolver(f);
36 result = solver.solve(3, 4);
37 assertEquals(result, Math.PI, solver.getAbsoluteAccuracy());
38
39 result = solver.solve(1, 4);
40 assertEquals(result, Math.PI, solver.getAbsoluteAccuracy());
41 }
42
43
44
45
46 public void testQuinticZero() throws MathException {
47 UnivariateRealFunction f = new QuinticFunction();
48 double result;
49
50 UnivariateRealSolver solver = new BisectionSolver(f);
51 result = solver.solve(-0.2, 0.2);
52 assertEquals(result, 0, solver.getAbsoluteAccuracy());
53
54 result = solver.solve(-0.1, 0.3);
55 assertEquals(result, 0, solver.getAbsoluteAccuracy());
56
57 result = solver.solve(-0.3, 0.45);
58 assertEquals(result, 0, solver.getAbsoluteAccuracy());
59
60 result = solver.solve(0.3, 0.7);
61 assertEquals(result, 0.5, solver.getAbsoluteAccuracy());
62
63 result = solver.solve(0.2, 0.6);
64 assertEquals(result, 0.5, solver.getAbsoluteAccuracy());
65
66 result = solver.solve(0.05, 0.95);
67 assertEquals(result, 0.5, solver.getAbsoluteAccuracy());
68
69 result = solver.solve(0.85, 1.25);
70 assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
71
72 result = solver.solve(0.8, 1.2);
73 assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
74
75 result = solver.solve(0.85, 1.75);
76 assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
77
78 result = solver.solve(0.55, 1.45);
79 assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
80
81 result = solver.solve(0.85, 5);
82 assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
83
84 assertEquals(result, solver.getResult(), 0);
85 assertTrue(solver.getIterationCount() > 0);
86 }
87
88
89
90
91 public void testSetFunctionValueAccuracy(){
92 double expected = 1.0e-2;
93 UnivariateRealFunction f = new QuinticFunction();
94 UnivariateRealSolver solver = new BisectionSolver(f);
95 solver.setFunctionValueAccuracy(expected);
96 assertEquals(expected, solver.getFunctionValueAccuracy(), 1.0e-2);
97 }
98
99
100
101
102 public void testResetFunctionValueAccuracy(){
103 double newValue = 1.0e-2;
104 UnivariateRealFunction f = new QuinticFunction();
105 UnivariateRealSolver solver = new BisectionSolver(f);
106 double oldValue = solver.getFunctionValueAccuracy();
107 solver.setFunctionValueAccuracy(newValue);
108 solver.resetFunctionValueAccuracy();
109 assertEquals(oldValue, solver.getFunctionValueAccuracy(), 1.0e-2);
110 }
111
112
113
114
115 public void testSetAbsoluteAccuracy(){
116 double expected = 1.0e-2;
117 UnivariateRealFunction f = new QuinticFunction();
118 UnivariateRealSolver solver = new BisectionSolver(f);
119 solver.setAbsoluteAccuracy(expected);
120 assertEquals(expected, solver.getAbsoluteAccuracy(), 1.0e-2);
121 }
122
123
124
125
126 public void testResetAbsoluteAccuracy(){
127 double newValue = 1.0e-2;
128 UnivariateRealFunction f = new QuinticFunction();
129 UnivariateRealSolver solver = new BisectionSolver(f);
130 double oldValue = solver.getAbsoluteAccuracy();
131 solver.setAbsoluteAccuracy(newValue);
132 solver.resetAbsoluteAccuracy();
133 assertEquals(oldValue, solver.getAbsoluteAccuracy(), 1.0e-2);
134 }
135
136
137
138
139 public void testSetMaximalIterationCount(){
140 int expected = 100;
141
142 UnivariateRealFunction f = new QuinticFunction();
143 UnivariateRealSolver solver = new BisectionSolver(f);
144 solver.setMaximalIterationCount(expected);
145 assertEquals(expected, solver.getMaximalIterationCount());
146 }
147
148
149
150
151 public void testResetMaximalIterationCount(){
152 int newValue = 10000;
153
154 UnivariateRealFunction f = new QuinticFunction();
155 UnivariateRealSolver solver = new BisectionSolver(f);
156 int oldValue = solver.getMaximalIterationCount();
157 solver.setMaximalIterationCount(newValue);
158 solver.resetMaximalIterationCount();
159 assertEquals(oldValue, solver.getMaximalIterationCount());
160 }
161
162
163
164
165 public void testSetRelativeAccuracy(){
166 double expected = 1.0e-2;
167
168 UnivariateRealFunction f = new QuinticFunction();
169 UnivariateRealSolver solver = new BisectionSolver(f);
170 solver.setRelativeAccuracy(expected);
171 assertEquals(expected, solver.getRelativeAccuracy(), 1.0e-2);
172 }
173
174
175
176
177 public void testResetRelativeAccuracy(){
178 double newValue = 1.0e-2;
179 UnivariateRealFunction f = new QuinticFunction();
180 UnivariateRealSolver solver = new BisectionSolver(f);
181 double oldValue = solver.getRelativeAccuracy();
182 solver.setRelativeAccuracy(newValue);
183 solver.resetRelativeAccuracy();
184 assertEquals(oldValue, solver.getRelativeAccuracy(), 1.0e-2);
185 }
186
187
188
189
190 public void testSerialization() throws MathException {
191 UnivariateRealFunction f = (UnivariateRealFunction)TestUtils.serializeAndRecover(new QuinticFunction());
192 double result;
193
194 BisectionSolver solver = new BisectionSolver(f);
195 UnivariateRealSolver solver2 = (UnivariateRealSolver)TestUtils.serializeAndRecover(solver);
196
197 result = solver.solve(-0.2, 0.2);
198 assertEquals(result, 0, solver.getAbsoluteAccuracy());
199 assertEquals(solver2.solve(-0.2, 0.2), result, solver2.getAbsoluteAccuracy());
200
201 result = solver.solve(-0.1, 0.3);
202 assertEquals(result, 0, solver.getAbsoluteAccuracy());
203 assertEquals(solver2.solve(-0.1, 0.3), result, solver2.getAbsoluteAccuracy());
204
205 result = solver.solve(-0.3, 0.45);
206 assertEquals(result, 0, solver.getAbsoluteAccuracy());
207 assertEquals(solver2.solve(-0.3, 0.45), result, solver2.getAbsoluteAccuracy());
208
209 result = solver.solve(0.3, 0.7);
210 assertEquals(result, 0.5, solver.getAbsoluteAccuracy());
211 assertEquals(solver2.solve(0.3, 0.7), result, solver2.getAbsoluteAccuracy());
212
213 result = solver.solve(0.2, 0.6);
214 assertEquals(result, 0.5, solver.getAbsoluteAccuracy());
215 assertEquals(solver2.solve(0.2, 0.6), result, solver2.getAbsoluteAccuracy());
216
217 result = solver.solve(0.05, 0.95);
218 assertEquals(result, 0.5, solver.getAbsoluteAccuracy());
219 assertEquals(solver2.solve(0.05, 0.95), result, solver2.getAbsoluteAccuracy());
220
221 result = solver.solve(0.85, 1.25);
222 assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
223 assertEquals(solver2.solve(0.85, 1.25), result, solver2.getAbsoluteAccuracy());
224
225 result = solver.solve(0.8, 1.2);
226 assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
227 assertEquals(solver2.solve(0.8, 1.2), result, solver2.getAbsoluteAccuracy());
228
229 result = solver.solve(0.85, 1.75);
230 assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
231 assertEquals(solver2.solve(0.85, 1.75), result, solver2.getAbsoluteAccuracy());
232
233 result = solver.solve(0.55, 1.45);
234 assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
235 assertEquals(solver2.solve(0.55, 1.45), result, solver2.getAbsoluteAccuracy());
236
237 result = solver.solve(0.85, 5);
238 assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
239 assertEquals(solver2.solve(0.85, 5), result, solver2.getAbsoluteAccuracy());
240
241
242 double newValue = 1.0e-2;
243 f = (UnivariateRealFunction)TestUtils.serializeAndRecover(new QuinticFunction());
244 solver = new BisectionSolver(f);
245
246 double oldValue = solver.getRelativeAccuracy();
247 solver.setRelativeAccuracy(newValue);
248 solver.resetRelativeAccuracy();
249 assertEquals(oldValue, solver.getRelativeAccuracy(), 1.0e-2);
250
251 solver2 = (UnivariateRealSolver)TestUtils.serializeAndRecover(solver);
252
253 assertEquals(oldValue, solver2.getRelativeAccuracy(), 1.0e-2);
254
255 solver2.setRelativeAccuracy(newValue);
256 solver2.resetRelativeAccuracy();
257
258 assertEquals(oldValue, solver2.getRelativeAccuracy(), 1.0e-2);
259
260 }
261
262 }