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.integration;
23
24 import org.hipparchus.analysis.CalculusFieldUnivariateFunction;
25 import org.hipparchus.exception.MathIllegalArgumentException;
26 import org.hipparchus.util.Binary64;
27 import org.hipparchus.util.Binary64Field;
28 import org.hipparchus.util.FastMath;
29 import org.junit.jupiter.api.Test;
30
31 import static org.junit.jupiter.api.Assertions.assertEquals;
32 import static org.junit.jupiter.api.Assertions.assertTrue;
33 import static org.junit.jupiter.api.Assertions.fail;
34
35
36
37
38
39
40
41
42
43
44 final class FieldRombergIntegratorTest {
45
46
47
48
49 @Test
50 void testSinFunction() {
51 FieldUnivariateIntegrator<Binary64> integrator = new FieldRombergIntegrator<>(Binary64Field.getInstance());
52
53 Binary64 min = new Binary64(0);
54 Binary64 max = new Binary64(FastMath.PI);
55 double expected = 2;
56 double tolerance = FastMath.abs(expected * integrator.getRelativeAccuracy());
57 double result = integrator.integrate(100, x -> x.sin(), min, max).getReal();
58 assertTrue(integrator.getEvaluations() < 50);
59 assertTrue(integrator.getIterations() < 10);
60 assertEquals(expected, result, tolerance);
61
62 min = new Binary64(-FastMath.PI/3);
63 max = new Binary64(0);
64 expected = -0.5;
65 tolerance = FastMath.abs(expected * integrator.getRelativeAccuracy());
66 result = integrator.integrate(100, x -> x.sin(), min, max).getReal();
67 assertTrue(integrator.getEvaluations() < 50);
68 assertTrue(integrator.getIterations() < 10);
69 assertEquals(expected, result, tolerance);
70 }
71
72
73
74
75 @Test
76 void testQuinticFunction() {
77 CalculusFieldUnivariateFunction<Binary64> f =
78 t -> t.subtract(1).multiply(t.subtract(0.5)).multiply(t).multiply(t.add(0.5)).multiply(t.add(1));
79 FieldUnivariateIntegrator<Binary64> integrator = new FieldRombergIntegrator<>(Binary64Field.getInstance());
80
81 Binary64 min = new Binary64(0);
82 Binary64 max = new Binary64(1);
83 double expected = -1.0 / 48;
84 double tolerance = FastMath.abs(expected * integrator.getRelativeAccuracy());
85 double result = integrator.integrate(100, f, min, max).getReal();
86 assertTrue(integrator.getEvaluations() < 10);
87 assertTrue(integrator.getIterations() < 5);
88 assertEquals(expected, result, tolerance);
89
90 min = new Binary64(0);
91 max = new Binary64(0.5);
92 expected = 11.0 / 768;
93 tolerance = FastMath.abs(expected * integrator.getRelativeAccuracy());
94 result = integrator.integrate(100, f, min, max).getReal();
95 assertTrue(integrator.getEvaluations() < 10);
96 assertTrue(integrator.getIterations() < 5);
97 assertEquals(expected, result, tolerance);
98
99 min = new Binary64(-1);
100 max = new Binary64(4);
101 expected = 2048 / 3.0 - 78 + 1.0 / 48;
102 tolerance = FastMath.abs(expected * integrator.getRelativeAccuracy());
103 result = integrator.integrate(100, f, min, max).getReal();
104 assertTrue(integrator.getEvaluations() < 10);
105 assertTrue(integrator.getIterations() < 5);
106 assertEquals(expected, result, tolerance);
107 }
108
109
110
111
112 @Test
113 void testParameters() {
114
115 try {
116
117 new FieldRombergIntegrator<>(Binary64Field.getInstance()).integrate(1000, x -> x.sin(),
118 new Binary64(1), new Binary64(-1));
119 fail("Expecting MathIllegalArgumentException - bad interval");
120 } catch (MathIllegalArgumentException ex) {
121
122 }
123 try {
124
125 new FieldRombergIntegrator<>(Binary64Field.getInstance(), 5, 4);
126 fail("Expecting MathIllegalArgumentException - bad iteration limits");
127 } catch (MathIllegalArgumentException ex) {
128
129 }
130 try {
131
132 new FieldRombergIntegrator<>(Binary64Field.getInstance(), 10, 50);
133 fail("Expecting MathIllegalArgumentException - bad iteration limits");
134 } catch (MathIllegalArgumentException ex) {
135
136 }
137 }
138 }