1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package com.irurueta.numerical.integration;
17
18 import com.irurueta.numerical.EvaluationException;
19 import com.irurueta.numerical.SingleDimensionFunctionEvaluatorListener;
20 import com.irurueta.numerical.interpolation.InterpolationException;
21 import com.irurueta.numerical.interpolation.PolynomialInterpolator;
22
23
24
25
26 public class RombergTrapezoidalQuadratureIntegrator extends RombergIntegrator<TrapezoidalQuadrature> {
27
28
29
30
31 public static final double EPS = 1e-10;
32
33
34
35
36 private static final int JMAX = 20;
37
38
39
40
41 private static final int JMAXP = JMAX + 1;
42
43
44
45
46 private static final int K = 5;
47
48
49
50
51 private final double[] s = new double[JMAX];
52
53
54
55
56 private final double[] h = new double[JMAXP];
57
58
59
60
61 private final PolynomialInterpolator interpolator = new PolynomialInterpolator(h, s, K, false);
62
63
64
65
66
67
68
69
70
71 public RombergTrapezoidalQuadratureIntegrator(
72 final double a, final double b, final SingleDimensionFunctionEvaluatorListener listener, final double eps) {
73 super(new TrapezoidalQuadrature(a, b, listener), eps);
74 }
75
76
77
78
79
80
81
82
83 public RombergTrapezoidalQuadratureIntegrator(
84 final double a, final double b, final SingleDimensionFunctionEvaluatorListener listener) {
85 this(a, b, listener, EPS);
86 }
87
88
89
90
91
92
93
94
95 @Override
96 public double integrate() throws IntegrationException {
97 try {
98 h[0] = 1.0;
99 for (var j = 1; j <= JMAX; j++) {
100 s[j - 1] = q.next();
101 if (j >= K) {
102 final var ss = interpolator.rawinterp(j - K, 0.0);
103 if (Math.abs(interpolator.getDy()) <= eps * Math.abs(ss)) {
104 return ss;
105 }
106 }
107 h[j] = 0.25 * h[j - 1];
108 }
109 } catch (final EvaluationException | InterpolationException e) {
110 throw new IntegrationException(e);
111 }
112
113
114 throw new IntegrationException();
115 }
116
117
118
119
120
121
122 @Override
123 public QuadratureType getQuadratureType() {
124 return QuadratureType.TRAPEZOIDAL;
125 }
126 }