1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 package ffx.numerics.special;
39
40 import ffx.utilities.FFXTest;
41 import org.junit.Assert;
42 import org.junit.Test;
43 import org.junit.runner.RunWith;
44 import org.junit.runners.Parameterized;
45 import org.junit.runners.Parameterized.Parameters;
46
47 import java.util.Arrays;
48 import java.util.Collection;
49
50
51
52
53 @RunWith(Parameterized.class)
54 public class ModifiedBesselTest extends FFXTest {
55
56
57
58
59
60 private final String info;
61 private final double x;
62 private final double i0;
63 private final double i1;
64 private final double tolerance = 1e-15;
65
66 public ModifiedBesselTest(String info, double x, double i0, double i1) {
67 this.info = info;
68 this.x = x;
69 this.i0 = i0;
70 this.i1 = i1;
71 }
72
73
74
75
76
77 @Parameters
78 public static Collection<Object[]> data() {
79 return Arrays.asList(
80 new Object[][]{
81
82 {"Test 0.0", 0.0, 1.0, 0.0},
83 {"Test 1.0", 1.0, 1.2660658777520081841, 0.56515910399248503460},
84 {"Test -1.0", -1.0, 1.2660658777520081841, -0.56515910399248503460},
85 {"Test 4.0", 4.0, 11.301921952136330773, 9.7594651537044505574},
86 {"Test -4.0", -4.0, 11.301921952136330773, -9.7594651537044505574},
87 {"Test 7.9", 7.9, 389.40628328215802867, 363.85394408450838455},
88 {"Test -7.9", -7.9, 389.40628328215802867, -363.85394408450838455},
89 {"Test 8.0", 8.0, 427.56411572180473968, 399.87313678256009553},
90 {"Test -8.0", -8.0, 427.56411572180473968, -399.87313678256009553},
91 {"Test 8.0001", 8.0001, 427.60410492344237809, 399.91089657459764339},
92 {"Test -8.0001", -8.0001, 427.60410492344237809, -399.91089657459764339},
93 {"Test 10.0", 10.0, 2815.7166284662530416, 2670.9883037012536988},
94 {"Test -10.0", -10.0, 2815.7166284662530416, -2670.9883037012536988},
95
96
97 {"Test 1e-10", 1e-10, 1.0, 5.0000000000000001822e-11},
98 {"Test -1e-10", -1e-10, 1.0, -5.0000000000000001822e-11},
99
100
101 {"Test 50.0", 50.0, 2.9325537838493361766e20, 2.9030785901035562598e20},
102 {"Test -50.0", -50.0, 2.9325537838493361766e20, -2.9030785901035562598e20},
103 {"Test 100.0", 100.0, 1.0737517071310739546e42, 1.0683693903381626553e42},
104 {"Test -100.0", -100.0, 1.0737517071310739546e42, -1.0683693903381626553e42},
105
106
107 {"Test 7.9999", 7.9999, 427.52413029596664273, 399.83538057975886204},
108 {"Test -7.9999", -7.9999, 427.52413029596664273, -399.83538057975886204},
109
110
111 {"Test 0.1", 0.1, 1.0025015629340954249, 0.050062526047092693882},
112 {"Test -0.1", -0.1, 1.0025015629340954249, -0.050062526047092693882},
113 {"Test 20.0", 20.0, 4.3558282559553526342e7, 4.2454973385127782822e7},
114 {"Test -20.0", -20.0, 4.3558282559553526342e7, -4.2454973385127782822e7}
115 });
116 }
117
118
119
120
121 @Test
122 public void testZeroOrderModifiedBessel() {
123 double actual = ModifiedBessel.i0(x);
124 Assert.assertEquals(info, i0 / actual, 1.0, tolerance);
125 }
126
127
128
129
130 @Test
131 public void testFirstOrderModifiedBessel() {
132 double actual = ModifiedBessel.i1(x);
133 if (actual != 0.0) {
134 Assert.assertEquals(info, i1 / actual, 1.0, tolerance);
135 } else {
136 Assert.assertEquals(info, i1, actual, tolerance);
137 }
138 }
139
140
141
142
143 @Test
144 public void testSpecialValues() {
145
146 double nanResult = ModifiedBessel.i0(Double.NaN);
147 Assert.assertTrue("i0(NaN) should be NaN", Double.isNaN(nanResult));
148
149 nanResult = ModifiedBessel.i1(Double.NaN);
150 Assert.assertTrue("i1(NaN) should be NaN", Double.isNaN(nanResult));
151
152
153
154 double infResult = ModifiedBessel.i0(Double.POSITIVE_INFINITY);
155 Assert.assertEquals("i0(Infinity) should be 0.0", 0.0, infResult, 0.0);
156
157 infResult = ModifiedBessel.i0(Double.NEGATIVE_INFINITY);
158 Assert.assertEquals("i0(-Infinity) should be 0.0", 0.0, infResult, 0.0);
159
160 infResult = ModifiedBessel.i1(Double.POSITIVE_INFINITY);
161 Assert.assertEquals("i1(Infinity) should be 0.0", 0.0, infResult, 0.0);
162
163 infResult = ModifiedBessel.i1(Double.NEGATIVE_INFINITY);
164 Assert.assertEquals("i1(-Infinity) should be 0.0", 0.0, infResult, 0.0);
165 }
166
167
168
169
170 @Test
171 public void testi1OverI0() {
172
173 double expected = ModifiedBessel.i1(x) / ModifiedBessel.i0(x);
174 double actual = ModifiedBessel.i1OverI0(x);
175 Assert.assertEquals("i1OverI0(" + x + ")", expected, actual, tolerance);
176 }
177
178
179
180
181 @Test
182 public void testlnI0() {
183 double expected = Math.log(ModifiedBessel.i0(x));
184 double actual = ModifiedBessel.lnI0(x);
185 double testTolerance = 1e-13;
186 Assert.assertEquals("lnI0(" + x + ")", expected, actual, testTolerance);
187 }
188
189 }