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 junit.framework.TestCase;
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 public final class MullerSolverTest extends TestCase {
36
37
38
39
40 public void testSinFunction() throws MathException {
41 UnivariateRealFunction f = new SinFunction();
42 UnivariateRealSolver solver = new MullerSolver(f);
43 double min, max, expected, result, tolerance;
44
45 min = 3.0; max = 4.0; expected = Math.PI;
46 tolerance = Math.max(solver.getAbsoluteAccuracy(),
47 Math.abs(expected * solver.getRelativeAccuracy()));
48 result = solver.solve(min, max);
49 assertEquals(expected, result, tolerance);
50
51 min = -1.0; max = 1.5; expected = 0.0;
52 tolerance = Math.max(solver.getAbsoluteAccuracy(),
53 Math.abs(expected * solver.getRelativeAccuracy()));
54 result = solver.solve(min, max);
55 assertEquals(expected, result, tolerance);
56 }
57
58
59
60
61 public void testSinFunction2() throws MathException {
62 UnivariateRealFunction f = new SinFunction();
63 MullerSolver solver = new MullerSolver(f);
64 double min, max, expected, result, tolerance;
65
66 min = 3.0; max = 4.0; expected = Math.PI;
67 tolerance = Math.max(solver.getAbsoluteAccuracy(),
68 Math.abs(expected * solver.getRelativeAccuracy()));
69 result = solver.solve2(min, max);
70 assertEquals(expected, result, tolerance);
71
72 min = -1.0; max = 1.5; expected = 0.0;
73 tolerance = Math.max(solver.getAbsoluteAccuracy(),
74 Math.abs(expected * solver.getRelativeAccuracy()));
75 result = solver.solve2(min, max);
76 assertEquals(expected, result, tolerance);
77 }
78
79
80
81
82 public void testQuinticFunction() throws MathException {
83 UnivariateRealFunction f = new QuinticFunction();
84 UnivariateRealSolver solver = new MullerSolver(f);
85 double min, max, expected, result, tolerance;
86
87 min = -0.4; max = 0.2; expected = 0.0;
88 tolerance = Math.max(solver.getAbsoluteAccuracy(),
89 Math.abs(expected * solver.getRelativeAccuracy()));
90 result = solver.solve(min, max);
91 assertEquals(expected, result, tolerance);
92
93 min = 0.75; max = 1.5; expected = 1.0;
94 tolerance = Math.max(solver.getAbsoluteAccuracy(),
95 Math.abs(expected * solver.getRelativeAccuracy()));
96 result = solver.solve(min, max);
97 assertEquals(expected, result, tolerance);
98
99 min = -0.9; max = -0.2; expected = -0.5;
100 tolerance = Math.max(solver.getAbsoluteAccuracy(),
101 Math.abs(expected * solver.getRelativeAccuracy()));
102 result = solver.solve(min, max);
103 assertEquals(expected, result, tolerance);
104 }
105
106
107
108
109 public void testQuinticFunction2() throws MathException {
110 UnivariateRealFunction f = new QuinticFunction();
111 MullerSolver solver = new MullerSolver(f);
112 double min, max, expected, result, tolerance;
113
114 min = -0.4; max = 0.2; expected = 0.0;
115 tolerance = Math.max(solver.getAbsoluteAccuracy(),
116 Math.abs(expected * solver.getRelativeAccuracy()));
117 result = solver.solve2(min, max);
118 assertEquals(expected, result, tolerance);
119
120 min = 0.75; max = 1.5; expected = 1.0;
121 tolerance = Math.max(solver.getAbsoluteAccuracy(),
122 Math.abs(expected * solver.getRelativeAccuracy()));
123 result = solver.solve2(min, max);
124 assertEquals(expected, result, tolerance);
125
126 min = -0.9; max = -0.2; expected = -0.5;
127 tolerance = Math.max(solver.getAbsoluteAccuracy(),
128 Math.abs(expected * solver.getRelativeAccuracy()));
129 result = solver.solve2(min, max);
130 assertEquals(expected, result, tolerance);
131 }
132
133
134
135
136
137
138
139
140 public void testExpm1Function() throws MathException {
141 UnivariateRealFunction f = new Expm1Function();
142 UnivariateRealSolver solver = new MullerSolver(f);
143 double min, max, expected, result, tolerance;
144
145 min = -1.0; max = 2.0; expected = 0.0;
146 tolerance = Math.max(solver.getAbsoluteAccuracy(),
147 Math.abs(expected * solver.getRelativeAccuracy()));
148 result = solver.solve(min, max);
149 assertEquals(expected, result, tolerance);
150
151 min = -20.0; max = 10.0; expected = 0.0;
152 tolerance = Math.max(solver.getAbsoluteAccuracy(),
153 Math.abs(expected * solver.getRelativeAccuracy()));
154 result = solver.solve(min, max);
155 assertEquals(expected, result, tolerance);
156
157 min = -50.0; max = 100.0; expected = 0.0;
158 tolerance = Math.max(solver.getAbsoluteAccuracy(),
159 Math.abs(expected * solver.getRelativeAccuracy()));
160 result = solver.solve(min, max);
161 assertEquals(expected, result, tolerance);
162 }
163
164
165
166
167
168
169 public void testExpm1Function2() throws MathException {
170 UnivariateRealFunction f = new Expm1Function();
171 MullerSolver solver = new MullerSolver(f);
172 double min, max, expected, result, tolerance;
173
174 min = -1.0; max = 2.0; expected = 0.0;
175 tolerance = Math.max(solver.getAbsoluteAccuracy(),
176 Math.abs(expected * solver.getRelativeAccuracy()));
177 result = solver.solve2(min, max);
178 assertEquals(expected, result, tolerance);
179
180 min = -20.0; max = 10.0; expected = 0.0;
181 tolerance = Math.max(solver.getAbsoluteAccuracy(),
182 Math.abs(expected * solver.getRelativeAccuracy()));
183 result = solver.solve2(min, max);
184 assertEquals(expected, result, tolerance);
185
186 min = -50.0; max = 100.0; expected = 0.0;
187 tolerance = Math.max(solver.getAbsoluteAccuracy(),
188 Math.abs(expected * solver.getRelativeAccuracy()));
189 result = solver.solve2(min, max);
190 assertEquals(expected, result, tolerance);
191 }
192
193
194
195
196 public void testParameters() throws Exception {
197 UnivariateRealFunction f = new SinFunction();
198 UnivariateRealSolver solver = new MullerSolver(f);
199
200 try {
201
202 solver.solve(1, -1);
203 fail("Expecting IllegalArgumentException - bad interval");
204 } catch (IllegalArgumentException ex) {
205
206 }
207 try {
208
209 solver.solve(2, 3);
210 fail("Expecting IllegalArgumentException - no bracketing");
211 } catch (IllegalArgumentException ex) {
212
213 }
214 }
215 }