Author: luc Date: Mon Jun 3 12:10:36 2013 New Revision: 1488969 URL: http://svn.apache.org/r1488969 Log: Fixed wrong first iteration for midpoint integrator.
Thanks to Gilles for spotting the issue. Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math3/analysis/integration/MidPointIntegrator.java commons/proper/math/trunk/src/test/java/org/apache/commons/math3/analysis/integration/MidPointIntegratorTest.java Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math3/analysis/integration/MidPointIntegrator.java URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/analysis/integration/MidPointIntegrator.java?rev=1488969&r1=1488968&r2=1488969&view=diff ============================================================================== --- commons/proper/math/trunk/src/main/java/org/apache/commons/math3/analysis/integration/MidPointIntegrator.java (original) +++ commons/proper/math/trunk/src/main/java/org/apache/commons/math3/analysis/integration/MidPointIntegrator.java Mon Jun 3 12:10:36 2013 @@ -120,7 +120,7 @@ public class MidPointIntegrator extends final double diff = getMax() - min; if (n == 0) { - final double midPoint = 0.5 * diff; + final double midPoint = min + 0.5 * diff; return diff * computeObjectiveValue(midPoint); } else { final long np = 1L << (n - 1); // number of new points in this stage Modified: commons/proper/math/trunk/src/test/java/org/apache/commons/math3/analysis/integration/MidPointIntegratorTest.java URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math3/analysis/integration/MidPointIntegratorTest.java?rev=1488969&r1=1488968&r2=1488969&view=diff ============================================================================== --- commons/proper/math/trunk/src/test/java/org/apache/commons/math3/analysis/integration/MidPointIntegratorTest.java (original) +++ commons/proper/math/trunk/src/test/java/org/apache/commons/math3/analysis/integration/MidPointIntegratorTest.java Mon Jun 3 12:10:36 2013 @@ -39,6 +39,25 @@ public final class MidPointIntegratorTes * Test of integrator for the sine function. */ @Test + public void testLowAccuracy() { + UnivariateFunction f = new QuinticFunction(); + UnivariateIntegrator integrator = new MidPointIntegrator(0.01, 1.0e-10, 2, 4); + + double min = -10; + double max = -9; + double expected = -3697001.0 / 48.0; + double tolerance = FastMath.abs(expected * integrator.getRelativeAccuracy()); + double result = integrator.integrate(Integer.MAX_VALUE, f, min, max); + Assert.assertTrue(integrator.getEvaluations() < Integer.MAX_VALUE / 2); + Assert.assertTrue(integrator.getIterations() < MidPointIntegrator.MIDPOINT_MAX_ITERATIONS_COUNT / 2); + Assert.assertEquals(expected, result, tolerance); + + } + + /** + * Test of integrator for the sine function. + */ + @Test public void testSinFunction() { UnivariateFunction f = new Sin(); UnivariateIntegrator integrator = new MidPointIntegrator();