1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package org.hipparchus.analysis.solvers;
23
24 import org.hipparchus.analysis.QuinticFunction;
25 import org.hipparchus.analysis.UnivariateFunction;
26 import org.hipparchus.analysis.function.Expm1;
27 import org.hipparchus.analysis.function.Sin;
28 import org.hipparchus.exception.MathIllegalArgumentException;
29 import org.hipparchus.util.FastMath;
30 import org.junit.Assert;
31 import org.junit.Test;
32
33
34
35
36
37
38
39
40
41
42
43
44
45 public final class MullerSolver2Test {
46
47
48
49 @Test
50 public void testSinFunction() {
51 UnivariateFunction f = new Sin();
52 UnivariateSolver solver = new MullerSolver2();
53 double min, max, expected, result, tolerance;
54
55 min = 3.0; max = 4.0; expected = FastMath.PI;
56 tolerance = FastMath.max(solver.getAbsoluteAccuracy(),
57 FastMath.abs(expected * solver.getRelativeAccuracy()));
58 result = solver.solve(100, f, min, max);
59 Assert.assertEquals(expected, result, tolerance);
60
61 min = -1.0; max = 1.5; expected = 0.0;
62 tolerance = FastMath.max(solver.getAbsoluteAccuracy(),
63 FastMath.abs(expected * solver.getRelativeAccuracy()));
64 result = solver.solve(100, f, min, max);
65 Assert.assertEquals(expected, result, tolerance);
66 }
67
68
69
70
71 @Test
72 public void testQuinticFunction() {
73 UnivariateFunction f = new QuinticFunction();
74 UnivariateSolver solver = new MullerSolver2();
75 double min, max, expected, result, tolerance;
76
77 min = -0.4; max = 0.2; expected = 0.0;
78 tolerance = FastMath.max(solver.getAbsoluteAccuracy(),
79 FastMath.abs(expected * solver.getRelativeAccuracy()));
80 result = solver.solve(100, f, min, max);
81 Assert.assertEquals(expected, result, tolerance);
82
83 min = 0.75; max = 1.5; expected = 1.0;
84 tolerance = FastMath.max(solver.getAbsoluteAccuracy(),
85 FastMath.abs(expected * solver.getRelativeAccuracy()));
86 result = solver.solve(100, f, min, max);
87 Assert.assertEquals(expected, result, tolerance);
88
89 min = -0.9; max = -0.2; expected = -0.5;
90 tolerance = FastMath.max(solver.getAbsoluteAccuracy(),
91 FastMath.abs(expected * solver.getRelativeAccuracy()));
92 result = solver.solve(100, f, min, max);
93 Assert.assertEquals(expected, result, tolerance);
94 }
95
96
97
98
99
100
101 @Test
102 public void testExpm1Function() {
103 UnivariateFunction f = new Expm1();
104 UnivariateSolver solver = new MullerSolver2();
105 double min, max, expected, result, tolerance;
106
107 min = -1.0; max = 2.0; expected = 0.0;
108 tolerance = FastMath.max(solver.getAbsoluteAccuracy(),
109 FastMath.abs(expected * solver.getRelativeAccuracy()));
110 result = solver.solve(100, f, min, max);
111 Assert.assertEquals(expected, result, tolerance);
112
113 min = -20.0; max = 10.0; expected = 0.0;
114 tolerance = FastMath.max(solver.getAbsoluteAccuracy(),
115 FastMath.abs(expected * solver.getRelativeAccuracy()));
116 result = solver.solve(100, f, min, max);
117 Assert.assertEquals(expected, result, tolerance);
118
119 min = -50.0; max = 100.0; expected = 0.0;
120 tolerance = FastMath.max(solver.getAbsoluteAccuracy(),
121 FastMath.abs(expected * solver.getRelativeAccuracy()));
122 result = solver.solve(100, f, min, max);
123 Assert.assertEquals(expected, result, tolerance);
124 }
125
126
127
128
129 @Test
130 public void testParameters() {
131 UnivariateFunction f = new Sin();
132 UnivariateSolver solver = new MullerSolver2();
133
134 try {
135
136 solver.solve(100, f, 1, -1);
137 Assert.fail("Expecting MathIllegalArgumentException - bad interval");
138 } catch (MathIllegalArgumentException ex) {
139
140 }
141 try {
142
143 solver.solve(100, f, 2, 3);
144 Assert.fail("Expecting MathIllegalArgumentException - no bracketing");
145 } catch (MathIllegalArgumentException ex) {
146
147 }
148 }
149 }