2
* Licensed to the Apache Software Foundation (ASF) under one or more
3
* contributor license agreements. See the NOTICE file distributed with
4
* this work for additional information regarding copyright ownership.
5
* The ASF licenses this file to You under the Apache License, Version 2.0
6
* (the "License"); you may not use this file except in compliance with
7
* the License. You may obtain a copy of the License at
9
* http://www.apache.org/licenses/LICENSE-2.0
11
* Unless required by applicable law or agreed to in writing, software
12
* distributed under the License is distributed on an "AS IS" BASIS,
13
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
* See the License for the specific language governing permissions and
15
* limitations under the License.
17
package org.apache.commons.math.analysis;
19
import org.apache.commons.math.MathException;
20
import org.apache.commons.math.TestUtils;
22
import junit.framework.TestCase;
25
* @version $Revision: 480442 $ $Date: 2006-11-29 00:21:22 -0700 (Wed, 29 Nov 2006) $
27
public final class BisectionSolverTest extends TestCase {
31
public void testSinZero() throws MathException {
32
UnivariateRealFunction f = new SinFunction();
35
UnivariateRealSolver solver = new BisectionSolver(f);
36
result = solver.solve(3, 4);
37
assertEquals(result, Math.PI, solver.getAbsoluteAccuracy());
39
result = solver.solve(1, 4);
40
assertEquals(result, Math.PI, solver.getAbsoluteAccuracy());
46
public void testQuinticZero() throws MathException {
47
UnivariateRealFunction f = new QuinticFunction();
50
UnivariateRealSolver solver = new BisectionSolver(f);
51
result = solver.solve(-0.2, 0.2);
52
assertEquals(result, 0, solver.getAbsoluteAccuracy());
54
result = solver.solve(-0.1, 0.3);
55
assertEquals(result, 0, solver.getAbsoluteAccuracy());
57
result = solver.solve(-0.3, 0.45);
58
assertEquals(result, 0, solver.getAbsoluteAccuracy());
60
result = solver.solve(0.3, 0.7);
61
assertEquals(result, 0.5, solver.getAbsoluteAccuracy());
63
result = solver.solve(0.2, 0.6);
64
assertEquals(result, 0.5, solver.getAbsoluteAccuracy());
66
result = solver.solve(0.05, 0.95);
67
assertEquals(result, 0.5, solver.getAbsoluteAccuracy());
69
result = solver.solve(0.85, 1.25);
70
assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
72
result = solver.solve(0.8, 1.2);
73
assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
75
result = solver.solve(0.85, 1.75);
76
assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
78
result = solver.solve(0.55, 1.45);
79
assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
81
result = solver.solve(0.85, 5);
82
assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
84
assertEquals(result, solver.getResult(), 0);
85
assertTrue(solver.getIterationCount() > 0);
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);
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);
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);
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);
139
public void testSetMaximalIterationCount(){
142
UnivariateRealFunction f = new QuinticFunction();
143
UnivariateRealSolver solver = new BisectionSolver(f);
144
solver.setMaximalIterationCount(expected);
145
assertEquals(expected, solver.getMaximalIterationCount());
151
public void testResetMaximalIterationCount(){
152
int newValue = 10000;
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());
165
public void testSetRelativeAccuracy(){
166
double expected = 1.0e-2;
168
UnivariateRealFunction f = new QuinticFunction();
169
UnivariateRealSolver solver = new BisectionSolver(f);
170
solver.setRelativeAccuracy(expected);
171
assertEquals(expected, solver.getRelativeAccuracy(), 1.0e-2);
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);
188
* Test Serialization and Recovery
190
public void testSerialization() throws MathException {
191
UnivariateRealFunction f = (UnivariateRealFunction)TestUtils.serializeAndRecover(new QuinticFunction());
194
BisectionSolver solver = new BisectionSolver(f);
195
UnivariateRealSolver solver2 = (UnivariateRealSolver)TestUtils.serializeAndRecover(solver);
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());
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());
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());
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());
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());
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());
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());
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());
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());
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());
237
result = solver.solve(0.85, 5);
238
assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
239
assertEquals(solver2.solve(0.85, 5), result, solver2.getAbsoluteAccuracy());
242
double newValue = 1.0e-2;
243
f = (UnivariateRealFunction)TestUtils.serializeAndRecover(new QuinticFunction());
244
solver = new BisectionSolver(f);
246
double oldValue = solver.getRelativeAccuracy();
247
solver.setRelativeAccuracy(newValue);
248
solver.resetRelativeAccuracy();
249
assertEquals(oldValue, solver.getRelativeAccuracy(), 1.0e-2);
251
solver2 = (UnivariateRealSolver)TestUtils.serializeAndRecover(solver);
253
assertEquals(oldValue, solver2.getRelativeAccuracy(), 1.0e-2);
255
solver2.setRelativeAccuracy(newValue);
256
solver2.resetRelativeAccuracy();
258
assertEquals(oldValue, solver2.getRelativeAccuracy(), 1.0e-2);