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
23 import junit.framework.TestCase;
24
25
26
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
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
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
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 }