From de903324903d441b3224b2170476629b979d2ad8 Mon Sep 17 00:00:00 2001 From: Luc Maisonobe Date: Wed, 6 Jan 2016 12:41:06 +0100 Subject: [PATCH] Added tests for derivatives consistency. --- ...AbstractRungeKuttaFieldIntegratorTest.java | 11 +++ ...lassicalRungeKuttaFieldIntegratorTest.java | 5 ++ .../nonstiff/EulerFieldIntegratorTest.java | 5 ++ .../ode/nonstiff/GillFieldIntegratorTest.java | 82 +++++++++---------- 4 files changed, 62 insertions(+), 41 deletions(-) diff --git a/src/test/java/org/apache/commons/math4/ode/nonstiff/AbstractRungeKuttaFieldIntegratorTest.java b/src/test/java/org/apache/commons/math4/ode/nonstiff/AbstractRungeKuttaFieldIntegratorTest.java index f670a9f8f..cc66cd15f 100644 --- a/src/test/java/org/apache/commons/math4/ode/nonstiff/AbstractRungeKuttaFieldIntegratorTest.java +++ b/src/test/java/org/apache/commons/math4/ode/nonstiff/AbstractRungeKuttaFieldIntegratorTest.java @@ -42,6 +42,7 @@ import org.apache.commons.math4.ode.events.Action; import org.apache.commons.math4.ode.events.FieldEventHandler; import org.apache.commons.math4.ode.sampling.FieldStepHandler; import org.apache.commons.math4.ode.sampling.FieldStepInterpolator; +import org.apache.commons.math4.ode.sampling.StepInterpolatorTestUtils; import org.apache.commons.math4.util.FastMath; import org.apache.commons.math4.util.MathArrays; import org.junit.Assert; @@ -507,4 +508,14 @@ public abstract class AbstractRungeKuttaFieldIntegratorTest { Assert.assertEquals(8.0, result.getState()[0].getReal(), epsilon); } + @Test + public abstract void testDerivativesConsistency(); + + protected > void doTestDerivativesConsistency(final Field field, double epsilon) { + TestFieldProblem3 pb = new TestFieldProblem3(field); + T step = pb.getFinalTime().subtract(pb.getInitialState().getTime()).multiply(0.001); + RungeKuttaFieldIntegrator integ = createIntegrator(field, step); + StepInterpolatorTestUtils.checkDerivativesConsistency(integ, pb, 1.0e-10); + } + } diff --git a/src/test/java/org/apache/commons/math4/ode/nonstiff/ClassicalRungeKuttaFieldIntegratorTest.java b/src/test/java/org/apache/commons/math4/ode/nonstiff/ClassicalRungeKuttaFieldIntegratorTest.java index 4c3ec4758..f2ece2743 100644 --- a/src/test/java/org/apache/commons/math4/ode/nonstiff/ClassicalRungeKuttaFieldIntegratorTest.java +++ b/src/test/java/org/apache/commons/math4/ode/nonstiff/ClassicalRungeKuttaFieldIntegratorTest.java @@ -91,4 +91,9 @@ public class ClassicalRungeKuttaFieldIntegratorTest extends AbstractRungeKuttaFi doTestUnstableDerivative(Decimal64Field.getInstance(), 1.0e-12); } + @Test + public void testDerivativesConsistency() { + doTestDerivativesConsistency(Decimal64Field.getInstance(), 1.0e-10); + } + } diff --git a/src/test/java/org/apache/commons/math4/ode/nonstiff/EulerFieldIntegratorTest.java b/src/test/java/org/apache/commons/math4/ode/nonstiff/EulerFieldIntegratorTest.java index 76e830af7..4d93ca35e 100644 --- a/src/test/java/org/apache/commons/math4/ode/nonstiff/EulerFieldIntegratorTest.java +++ b/src/test/java/org/apache/commons/math4/ode/nonstiff/EulerFieldIntegratorTest.java @@ -92,4 +92,9 @@ public class EulerFieldIntegratorTest extends AbstractRungeKuttaFieldIntegratorT doTestUnstableDerivative(Decimal64Field.getInstance(), 1.0e-12); } + @Test + public void testDerivativesConsistency() { + doTestDerivativesConsistency(Decimal64Field.getInstance(), 1.0e-10); + } + } diff --git a/src/test/java/org/apache/commons/math4/ode/nonstiff/GillFieldIntegratorTest.java b/src/test/java/org/apache/commons/math4/ode/nonstiff/GillFieldIntegratorTest.java index 91d38fe12..7b4ad505d 100644 --- a/src/test/java/org/apache/commons/math4/ode/nonstiff/GillFieldIntegratorTest.java +++ b/src/test/java/org/apache/commons/math4/ode/nonstiff/GillFieldIntegratorTest.java @@ -20,12 +20,7 @@ package org.apache.commons.math4.ode.nonstiff; import org.apache.commons.math4.Field; import org.apache.commons.math4.RealFieldElement; -import org.apache.commons.math4.ode.FieldExpandableODE; -import org.apache.commons.math4.ode.FieldODEState; -import org.apache.commons.math4.ode.FieldODEStateAndDerivative; import org.apache.commons.math4.util.Decimal64Field; -import org.apache.commons.math4.util.MathArrays; -import org.junit.Assert; import org.junit.Test; public class GillFieldIntegratorTest extends AbstractRungeKuttaFieldIntegratorTest { @@ -45,55 +40,60 @@ public class GillFieldIntegratorTest extends AbstractRungeKuttaFieldIntegratorTe doTestMissedEndEvent(Decimal64Field.getInstance(), 1.0e-15, 6.0e-5); } - @Test - public void testSanityChecks() { - doTestSanityChecks(Decimal64Field.getInstance()); - } + @Test + public void testSanityChecks() { + doTestSanityChecks(Decimal64Field.getInstance()); + } - @Test - public void testDecreasingSteps() { - doTestDecreasingSteps(Decimal64Field.getInstance(), 1.0, 1.0, 1.0e-10); - } + @Test + public void testDecreasingSteps() { + doTestDecreasingSteps(Decimal64Field.getInstance(), 1.0, 1.0, 1.0e-10); + } - @Test - public void testSmallStep() { - doTestSmallStep(Decimal64Field.getInstance(), 2.0e-13, 4.0e-12, 1.0e-12, "Gill"); - } + @Test + public void testSmallStep() { + doTestSmallStep(Decimal64Field.getInstance(), 2.0e-13, 4.0e-12, 1.0e-12, "Gill"); + } - @Test - public void testBigStep() { - doTestBigStep(Decimal64Field.getInstance(), 0.0004, 0.005, 1.0e-12, "Gill"); + @Test + public void testBigStep() { + doTestBigStep(Decimal64Field.getInstance(), 0.0004, 0.005, 1.0e-12, "Gill"); - } + } - @Test - public void testBackward() { - doTestBackward(Decimal64Field.getInstance(), 5.0e-10, 7.0e-10, 1.0e-12, "Gill"); - } + @Test + public void testBackward() { + doTestBackward(Decimal64Field.getInstance(), 5.0e-10, 7.0e-10, 1.0e-12, "Gill"); + } - @Test - public void testKepler() { - doTestKepler(Decimal64Field.getInstance(), 1.72e-3, 1.0e-5); - } + @Test + public void testKepler() { + doTestKepler(Decimal64Field.getInstance(), 1.72e-3, 1.0e-5); + } - @Test - public void testStepSize() { - doTestStepSize(Decimal64Field.getInstance(), 1.0e-12); - } + @Test + public void testStepSize() { + doTestStepSize(Decimal64Field.getInstance(), 1.0e-12); + } - @Test - public void testSingleStep() { - doTestSingleStep(Decimal64Field.getInstance(), 0.21); - } + @Test + public void testSingleStep() { + doTestSingleStep(Decimal64Field.getInstance(), 0.21); + } - @Test - public void testTooLargeFirstStep() { - doTestTooLargeFirstStep(Decimal64Field.getInstance()); - } + @Test + public void testTooLargeFirstStep() { + doTestTooLargeFirstStep(Decimal64Field.getInstance()); + } @Test public void testUnstableDerivative() { doTestUnstableDerivative(Decimal64Field.getInstance(), 1.0e-12); } + @Test + public void testDerivativesConsistency() { + doTestDerivativesConsistency(Decimal64Field.getInstance(), 1.0e-10); + } + }