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  
23  import junit.framework.TestCase;
24  
25  /**
26   * @version $Revision: 480442 $ $Date: 2006-11-29 00:21:22 -0700 (Wed, 29 Nov 2006) $
27   */
28  public final class NewtonSolverTest extends TestCase {
29      /**
30       *
31       */
32      public void testSinZero() throws MathException {
33          DifferentiableUnivariateRealFunction f = new SinFunction();
34          double result;
35          
36          UnivariateRealSolver solver = new NewtonSolver(f);
37          result = solver.solve(3, 4);
38          assertEquals(result, Math.PI, solver.getAbsoluteAccuracy());
39  
40          result = solver.solve(1, 4);
41          assertEquals(result, Math.PI, solver.getAbsoluteAccuracy());
42          
43          //TODO:  create abstract solver test class, move these there
44          assertEquals(result, solver.getResult(), 0);
45          assertTrue(solver.getIterationCount() > 0);
46      }
47  
48      /**
49       *
50       */
51      public void testQuinticZero() throws MathException {
52          DifferentiableUnivariateRealFunction f = new QuinticFunction();
53          double result;
54  
55          UnivariateRealSolver solver = new BisectionSolver(f);
56          result = solver.solve(-0.2, 0.2);
57          assertEquals(result, 0, solver.getAbsoluteAccuracy());
58  
59          result = solver.solve(-0.1, 0.3);
60          assertEquals(result, 0, solver.getAbsoluteAccuracy());
61  
62          result = solver.solve(-0.3, 0.45);
63          assertEquals(result, 0, solver.getAbsoluteAccuracy());
64  
65          result = solver.solve(0.3, 0.7);
66          assertEquals(result, 0.5, solver.getAbsoluteAccuracy());
67  
68          result = solver.solve(0.2, 0.6);
69          assertEquals(result, 0.5, solver.getAbsoluteAccuracy());
70  
71          result = solver.solve(0.05, 0.95);
72          assertEquals(result, 0.5, solver.getAbsoluteAccuracy());
73  
74          result = solver.solve(0.85, 1.25);
75          assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
76  
77          result = solver.solve(0.8, 1.2);
78          assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
79  
80          result = solver.solve(0.85, 1.75);
81          assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
82  
83          result = solver.solve(0.55, 1.45);
84          assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
85  
86          result = solver.solve(0.85, 5);
87          assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
88      }
89      
90      /**
91       * Test Serialization and Recovery
92       */
93      public void testSerialization() throws MathException {
94          DifferentiableUnivariateRealFunction f = new QuinticFunction();
95          double result;
96          
97          NewtonSolver solver = new NewtonSolver(f);
98          NewtonSolver solver2 = (NewtonSolver)TestUtils.serializeAndRecover(solver);
99          
100         result = solver.solve(-0.2, 0.2);
101         assertEquals(result, 0, solver.getAbsoluteAccuracy());
102         assertEquals(solver2.solve(-0.2, 0.2), result, solver2.getAbsoluteAccuracy());
103         
104         result = solver.solve(-0.1, 0.3);
105         assertEquals(result, 0, solver.getAbsoluteAccuracy());
106         assertEquals(solver2.solve(-0.1, 0.3), result, solver2.getAbsoluteAccuracy());
107         
108         result = solver.solve(-0.3, 0.45);
109         assertEquals(result, 0, solver.getAbsoluteAccuracy());
110         assertEquals(solver2.solve(-0.3, 0.45), result, solver2.getAbsoluteAccuracy());
111         
112         result = solver.solve(0.3, 0.7);
113         assertEquals(result, 0.5, solver.getAbsoluteAccuracy());
114         assertEquals(solver2.solve(0.3, 0.7), result, solver2.getAbsoluteAccuracy());
115         
116         result = solver.solve(0.2, 0.6);
117         assertEquals(result, 0.5, solver.getAbsoluteAccuracy());
118         assertEquals(solver2.solve(0.2, 0.6), result, solver2.getAbsoluteAccuracy());
119         
120         result = solver.solve(0.05, 0.95);
121         assertEquals(result, 0.5, solver.getAbsoluteAccuracy());
122         assertEquals(solver2.solve(0.05, 0.95), result, solver2.getAbsoluteAccuracy());
123         
124         result = solver.solve(0.85, 1.25);
125         assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
126         assertEquals(solver2.solve(0.85, 1.25), result, solver2.getAbsoluteAccuracy());
127         
128         result = solver.solve(0.8, 1.2);
129         assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
130         assertEquals(solver2.solve(0.8, 1.2), result, solver2.getAbsoluteAccuracy());
131         
132         result = solver.solve(0.85, 1.75);
133         assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
134         assertEquals(solver2.solve(0.85, 1.75), result, solver2.getAbsoluteAccuracy());
135         
136         result = solver.solve(0.55, 1.45);
137         assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
138         assertEquals(solver2.solve(0.55, 1.45), result, solver2.getAbsoluteAccuracy());
139         
140         result = solver.solve(0.85, 5);
141         assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
142         assertEquals(solver2.solve(0.85, 5), result, solver2.getAbsoluteAccuracy());
143         
144         /* Test Reset */
145         double newValue = 1.0e-2;
146         f = new QuinticFunction();
147         solver = new NewtonSolver(f);
148         
149         double oldValue = solver.getRelativeAccuracy();
150         solver.setRelativeAccuracy(newValue);
151         solver.resetRelativeAccuracy();
152         assertEquals(oldValue, solver.getRelativeAccuracy(), 1.0e-2);
153         
154         solver2 = (NewtonSolver)TestUtils.serializeAndRecover(solver); 
155         
156         assertEquals(oldValue, solver2.getRelativeAccuracy(), 1.0e-2);
157         
158         solver2.setRelativeAccuracy(newValue);
159         solver2.resetRelativeAccuracy();
160         
161         assertEquals(oldValue, solver2.getRelativeAccuracy(), 1.0e-2);
162         
163     }
164 }