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