3535public final class MidPointIntegratorTest {
3636 private static final int NUM_ITER = 30 ;
3737
38+ /**
39+ * The initial iteration contributes 1 evaluation. Each successive iteration
40+ * contributes 2 points to each previous slice.
41+ *
42+ * The total evaluation count == 1 + 2*3^0 + 2*3^1 + ... 2*3^n
43+ *
44+ * the series 3^0 + 3^1 + ... + 3^n sums to 3^(n-1) / (3-1), so the total
45+ * expected evaluations == 1 + 2*(3^(n-1) - 1)/2 == 3^(n-1).
46+ *
47+ * The n in the series above is offset by 1 from the MidPointIntegrator
48+ * iteration count so the actual result == 3^n.
49+ *
50+ * Without the incremental implementation, the same result would require
51+ * (3^(n + 1) - 1) / 2 evaluations; just under 50% more.
52+ */
53+ private long expectedEvaluations (int iterations ) {
54+ return (long ) FastMath .pow (3 , iterations );
55+ }
56+
3857 /**
3958 * Test of integrator for the sine function.
4059 */
@@ -48,8 +67,9 @@ public void testLowAccuracy() {
4867 double expected = -3697001.0 / 48.0 ;
4968 double tolerance = FastMath .abs (expected * integrator .getRelativeAccuracy ());
5069 double result = integrator .integrate (Integer .MAX_VALUE , f , min , max );
51- Assert .assertTrue (integrator .getEvaluations () < Integer .MAX_VALUE / 2 );
70+ Assert .assertTrue (integrator .getEvaluations () < Integer .MAX_VALUE / 3 );
5271 Assert .assertTrue (integrator .getIterations () < NUM_ITER );
72+ Assert .assertEquals (expectedEvaluations (integrator .getIterations ()), integrator .getEvaluations ());
5373 Assert .assertEquals (expected , result , tolerance );
5474
5575 }
@@ -67,17 +87,19 @@ public void testSinFunction() {
6787 double expected = 2 ;
6888 double tolerance = FastMath .abs (expected * integrator .getRelativeAccuracy ());
6989 double result = integrator .integrate (Integer .MAX_VALUE , f , min , max );
70- Assert .assertTrue (integrator .getEvaluations () < Integer .MAX_VALUE / 2 );
90+ Assert .assertTrue (integrator .getEvaluations () < Integer .MAX_VALUE / 3 );
7191 Assert .assertTrue (integrator .getIterations () < NUM_ITER );
92+ Assert .assertEquals (expectedEvaluations (integrator .getIterations ()), integrator .getEvaluations ());
7293 Assert .assertEquals (expected , result , tolerance );
7394
7495 min = -FastMath .PI /3 ;
7596 max = 0 ;
7697 expected = -0.5 ;
7798 tolerance = FastMath .abs (expected * integrator .getRelativeAccuracy ());
7899 result = integrator .integrate (Integer .MAX_VALUE , f , min , max );
79- Assert .assertTrue (integrator .getEvaluations () < Integer .MAX_VALUE / 2 );
100+ Assert .assertTrue (integrator .getEvaluations () < Integer .MAX_VALUE / 3 );
80101 Assert .assertTrue (integrator .getIterations () < NUM_ITER );
102+ Assert .assertEquals (expectedEvaluations (integrator .getIterations ()), integrator .getEvaluations ());
81103 Assert .assertEquals (expected , result , tolerance );
82104
83105 }
@@ -95,16 +117,17 @@ public void testQuinticFunction() {
95117 double expected = -1.0 / 48 ;
96118 double tolerance = FastMath .abs (expected * integrator .getRelativeAccuracy ());
97119 double result = integrator .integrate (Integer .MAX_VALUE , f , min , max );
98- Assert .assertTrue (integrator .getEvaluations () < Integer .MAX_VALUE / 2 );
120+ Assert .assertTrue (integrator .getEvaluations () < Integer .MAX_VALUE / 3 );
99121 Assert .assertTrue (integrator .getIterations () < NUM_ITER );
122+ Assert .assertEquals (expectedEvaluations (integrator .getIterations ()), integrator .getEvaluations ());
100123 Assert .assertEquals (expected , result , tolerance );
101124
102125 min = 0 ;
103126 max = 0.5 ;
104127 expected = 11.0 / 768 ;
105128 tolerance = FastMath .abs (expected * integrator .getRelativeAccuracy ());
106129 result = integrator .integrate (Integer .MAX_VALUE , f , min , max );
107- Assert .assertTrue (integrator .getEvaluations () < Integer .MAX_VALUE / 2 );
130+ Assert .assertTrue (integrator .getEvaluations () < Integer .MAX_VALUE / 3 );
108131 Assert .assertTrue (integrator .getIterations () < NUM_ITER );
109132 Assert .assertEquals (expected , result , tolerance );
110133
@@ -113,8 +136,9 @@ public void testQuinticFunction() {
113136 expected = 2048 / 3.0 - 78 + 1.0 / 48 ;
114137 tolerance = FastMath .abs (expected * integrator .getRelativeAccuracy ());
115138 result = integrator .integrate (Integer .MAX_VALUE , f , min , max );
116- Assert .assertTrue (integrator .getEvaluations () < Integer .MAX_VALUE / 2 );
139+ Assert .assertTrue (integrator .getEvaluations () < Integer .MAX_VALUE / 3 );
117140 Assert .assertTrue (integrator .getIterations () < NUM_ITER );
141+ Assert .assertEquals (expectedEvaluations (integrator .getIterations ()), integrator .getEvaluations ());
118142 Assert .assertEquals (expected , result , tolerance );
119143
120144 }
0 commit comments