1   /*
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
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
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.
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   * @version $Revision: 480442 $ $Date: 2006-11-29 00:21:22 -0700 (Wed, 29 Nov 2006) $
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      * Test Serialization and Recovery
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        /* Test Reset */
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 }