You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by lu...@apache.org on 2009/06/20 20:15:54 UTC
svn commit: r786877 [2/2] - in /commons/proper/math/trunk/src:
java/org/apache/commons/math/ode/ java/org/apache/commons/math/ode/nonstiff/
java/org/apache/commons/math/ode/sampling/
test/org/apache/commons/math/ode/nonstiff/ test/org/apache/commons/ma...
Modified: commons/proper/math/trunk/src/test/org/apache/commons/math/ode/nonstiff/AdamsMoultonIntegratorTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/org/apache/commons/math/ode/nonstiff/AdamsMoultonIntegratorTest.java?rev=786877&r1=786876&r2=786877&view=diff
==============================================================================
--- commons/proper/math/trunk/src/test/org/apache/commons/math/ode/nonstiff/AdamsMoultonIntegratorTest.java (original)
+++ commons/proper/math/trunk/src/test/org/apache/commons/math/ode/nonstiff/AdamsMoultonIntegratorTest.java Sat Jun 20 18:15:54 2009
@@ -29,137 +29,127 @@
import org.apache.commons.math.ode.DerivativeException;
import org.apache.commons.math.ode.FirstOrderIntegrator;
import org.apache.commons.math.ode.IntegratorException;
-import org.apache.commons.math.ode.events.EventHandler;
import org.junit.Test;
public class AdamsMoultonIntegratorTest {
@Test(expected=IntegratorException.class)
- public void dimensionCheck()
- throws DerivativeException, IntegratorException {
+ public void dimensionCheck() throws DerivativeException, IntegratorException {
TestProblem1 pb = new TestProblem1();
- new AdamsMoultonIntegrator(3, 0.01).integrate(pb,
- 0.0, new double[pb.getDimension()+10],
- 1.0, new double[pb.getDimension()+10]);
+ FirstOrderIntegrator integ =
+ new AdamsMoultonIntegrator(3, 0.0, 1.0, 1.0e-10, 1.0e-10);
+ integ.integrate(pb,
+ 0.0, new double[pb.getDimension()+10],
+ 1.0, new double[pb.getDimension()+10]);
}
- @Test
- public void decreasingSteps()
- throws DerivativeException, IntegratorException {
-
- TestProblemAbstract[] problems = TestProblemFactory.getProblems();
- for (int k = 0; k < problems.length; ++k) {
-
- double previousError = Double.NaN;
- for (int i = 6; i < 10; ++i) {
-
- TestProblemAbstract pb = (TestProblemAbstract) problems[k].clone();
- double step = (pb.getFinalTime() - pb.getInitialTime()) * Math.pow(2.0, -i);
-
- FirstOrderIntegrator integ = new AdamsMoultonIntegrator(5, step);
- TestProblemHandler handler = new TestProblemHandler(pb, integ);
- integ.addStepHandler(handler);
- EventHandler[] functions = pb.getEventsHandlers();
- for (int l = 0; l < functions.length; ++l) {
- integ.addEventHandler(functions[l],
- Double.POSITIVE_INFINITY, 1.0e-3 * step, 1000);
- }
- double stopTime = integ.integrate(pb, pb.getInitialTime(), pb.getInitialState(),
- pb.getFinalTime(), new double[pb.getDimension()]);
- if (functions.length == 0) {
- assertEquals(pb.getFinalTime(), stopTime, 1.0e-10);
- }
-
- double error = handler.getMaximalValueError();
- if ((i > 6) && !(pb instanceof TestProblem4) && !(pb instanceof TestProblem6)) {
- assertTrue(error <= Math.abs(1.05 * previousError));
- }
- previousError = error;
+ @Test(expected=IntegratorException.class)
+ public void testMinStep() throws DerivativeException, IntegratorException {
- }
+ TestProblem1 pb = new TestProblem1();
+ double minStep = 0.1 * (pb.getFinalTime() - pb.getInitialTime());
+ double maxStep = pb.getFinalTime() - pb.getInitialTime();
+ double[] vecAbsoluteTolerance = { 1.0e-15, 1.0e-16 };
+ double[] vecRelativeTolerance = { 1.0e-15, 1.0e-16 };
- }
+ FirstOrderIntegrator integ = new AdamsMoultonIntegrator(5, minStep, maxStep,
+ vecAbsoluteTolerance,
+ vecRelativeTolerance);
+ TestProblemHandler handler = new TestProblemHandler(pb, integ);
+ integ.addStepHandler(handler);
+ integ.integrate(pb,
+ pb.getInitialTime(), pb.getInitialState(),
+ pb.getFinalTime(), new double[pb.getDimension()]);
}
@Test
- public void smallStep()
+ public void testIncreasingTolerance()
throws DerivativeException, IntegratorException {
- TestProblem1 pb = new TestProblem1();
- double range = pb.getFinalTime() - pb.getInitialTime();
- double step = range * 0.001;
+ int previousCalls = Integer.MAX_VALUE;
+ for (int i = -12; i < -2; ++i) {
+ TestProblem1 pb = new TestProblem1();
+ double minStep = 0;
+ double maxStep = pb.getFinalTime() - pb.getInitialTime();
+ double scalAbsoluteTolerance = Math.pow(10.0, i);
+ double scalRelativeTolerance = 0.01 * scalAbsoluteTolerance;
- AdamsMoultonIntegrator integ = new AdamsMoultonIntegrator(3, step);
- integ.setStarterIntegrator(new DormandPrince853Integrator(0, range, 1.0e-12, 1.0e-12));
- TestProblemHandler handler = new TestProblemHandler(pb, integ);
- integ.addStepHandler(handler);
- integ.integrate(pb,
- pb.getInitialTime(), pb.getInitialState(),
- pb.getFinalTime(), new double[pb.getDimension()]);
+ FirstOrderIntegrator integ = new AdamsMoultonIntegrator(5, minStep, maxStep,
+ scalAbsoluteTolerance,
+ scalRelativeTolerance);
+ TestProblemHandler handler = new TestProblemHandler(pb, integ);
+ integ.addStepHandler(handler);
+ integ.integrate(pb,
+ pb.getInitialTime(), pb.getInitialState(),
+ pb.getFinalTime(), new double[pb.getDimension()]);
- assertTrue(handler.getLastError() < 2.0e-10);
- assertTrue(handler.getMaximalValueError() < 1.0e-9);
- assertEquals(0, handler.getMaximalTimeError(), 1.0e-15);
- assertEquals("Adams-Moulton", integ.getName());
+ // the 0.4 and 3.0 factors are only valid for this test
+ // and has been obtained from trial and error
+ // there is no general relation between local and global errors
+ assertTrue(handler.getMaximalValueError() > (0.4 * scalAbsoluteTolerance));
+ assertTrue(handler.getMaximalValueError() < (3.0 * scalAbsoluteTolerance));
+ assertEquals(0, handler.getMaximalTimeError(), 1.0e-16);
+
+ int calls = pb.getCalls();
+ assertEquals(integ.getEvaluations(), calls);
+ assertTrue(calls <= previousCalls);
+ previousCalls = calls;
+
+ }
}
- @Test
- public void bigStep()
- throws DerivativeException, IntegratorException {
+ @Test(expected = DerivativeException.class)
+ public void exceedMaxEvaluations() throws DerivativeException, IntegratorException {
TestProblem1 pb = new TestProblem1();
- double step = (pb.getFinalTime() - pb.getInitialTime()) * 0.2;
+ double range = pb.getFinalTime() - pb.getInitialTime();
- FirstOrderIntegrator integ = new AdamsMoultonIntegrator(3, step);
+ AdamsMoultonIntegrator integ = new AdamsMoultonIntegrator(3, 0, range, 1.0e-12, 1.0e-12);
TestProblemHandler handler = new TestProblemHandler(pb, integ);
integ.addStepHandler(handler);
+ integ.setMaxEvaluations(650);
integ.integrate(pb,
- pb.getInitialTime(), pb.getInitialState(),
- pb.getFinalTime(), new double[pb.getDimension()]);
-
- assertTrue(handler.getMaximalValueError() > 6.0e-6);
+ pb.getInitialTime(), pb.getInitialState(),
+ pb.getFinalTime(), new double[pb.getDimension()]);
}
@Test
- public void backward()
- throws DerivativeException, IntegratorException {
+ public void backward() throws DerivativeException, IntegratorException {
TestProblem5 pb = new TestProblem5();
- double step = Math.abs(pb.getFinalTime() - pb.getInitialTime()) * 0.001;
+ double range = Math.abs(pb.getFinalTime() - pb.getInitialTime());
- FirstOrderIntegrator integ = new AdamsMoultonIntegrator(5, step);
+ FirstOrderIntegrator integ = new AdamsMoultonIntegrator(5, 0, range, 1.0e-12, 1.0e-12);
TestProblemHandler handler = new TestProblemHandler(pb, integ);
integ.addStepHandler(handler);
integ.integrate(pb, pb.getInitialTime(), pb.getInitialState(),
pb.getFinalTime(), new double[pb.getDimension()]);
- assertTrue(handler.getLastError() < 4.0e-12);
- assertTrue(handler.getMaximalValueError() < 4.0e-12);
- assertEquals(0, handler.getMaximalTimeError(), 1.0e-15);
+ assertTrue(handler.getLastError() < 1.0e-9);
+ assertTrue(handler.getMaximalValueError() < 1.0e-9);
+ assertEquals(0, handler.getMaximalTimeError(), 1.0e-16);
assertEquals("Adams-Moulton", integ.getName());
}
@Test
- public void polynomial()
- throws DerivativeException, IntegratorException {
- final TestProblem6 pb = new TestProblem6();
- double step = Math.abs(pb.getFinalTime() - pb.getInitialTime()) * 0.02;
+ public void polynomial() throws DerivativeException, IntegratorException {
+ TestProblem6 pb = new TestProblem6();
+ double range = Math.abs(pb.getFinalTime() - pb.getInitialTime());
- for (int order = 2; order < 9; ++order) {
- AdamsMoultonIntegrator integ = new AdamsMoultonIntegrator(order, step);
- integ.setStarterIntegrator(new DormandPrince853Integrator(1.0e-3 * step, 1.0e3 * step,
- 1.0e-5, 1.0e-5));
- final TestProblemHandler handler = new TestProblemHandler(pb, integ);
+ for (int order = 2; order < 8; ++order) {
+ AdamsMoultonIntegrator integ =
+ new AdamsMoultonIntegrator(order, 1.0e-6 * range, 0.1 * range, 1.0e-9, 1.0e-9);
+ TestProblemHandler handler = new TestProblemHandler(pb, integ);
integ.addStepHandler(handler);
integ.integrate(pb, pb.getInitialTime(), pb.getInitialState(),
pb.getFinalTime(), new double[pb.getDimension()]);
if (order < 5) {
- assertTrue(handler.getMaximalValueError() > 1.0e-6);
+ assertTrue(integ.getEvaluations() > 150);
} else {
- assertTrue(handler.getMaximalValueError() < 4.0e-13);
+ assertTrue(integ.getEvaluations() < 90);
}
}
@@ -171,12 +161,14 @@
IOException, ClassNotFoundException {
TestProblem6 pb = new TestProblem6();
- double step = Math.abs(pb.getFinalTime() - pb.getInitialTime()) * 0.01;
+ double range = Math.abs(pb.getFinalTime() - pb.getInitialTime());
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
- oos.writeObject(new AdamsMoultonIntegrator(8, step));
-
+ oos.writeObject(new AdamsMoultonIntegrator(5, 0, range, 1.0e-12, 1.0e-12));
+ assertTrue(bos.size() > 2800);
+ assertTrue(bos.size() < 3000);
+
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
FirstOrderIntegrator integ = (AdamsMoultonIntegrator) ois.readObject();
@@ -185,7 +177,7 @@
integ.addStepHandler(handler);
integ.integrate(pb, pb.getInitialTime(), pb.getInitialState(),
pb.getFinalTime(), new double[pb.getDimension()]);
- assertTrue(handler.getMaximalValueError() < 2.0e-13);
+ assertTrue(handler.getMaximalValueError() < 8.0e-11);
}
Modified: commons/proper/math/trunk/src/test/org/apache/commons/math/ode/sampling/NordsieckStepInterpolatorTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/org/apache/commons/math/ode/sampling/NordsieckStepInterpolatorTest.java?rev=786877&r1=786876&r2=786877&view=diff
==============================================================================
--- commons/proper/math/trunk/src/test/org/apache/commons/math/ode/sampling/NordsieckStepInterpolatorTest.java (original)
+++ commons/proper/math/trunk/src/test/org/apache/commons/math/ode/sampling/NordsieckStepInterpolatorTest.java Sat Jun 20 18:15:54 2009
@@ -40,9 +40,8 @@
public void derivativesConsistency()
throws DerivativeException, IntegratorException {
TestProblem3 pb = new TestProblem3();
- double step = (pb.getFinalTime() - pb.getInitialTime()) * 0.001;
- AdamsBashforthIntegrator integ = new AdamsBashforthIntegrator(5, step);
- StepInterpolatorTestUtils.checkDerivativesConsistency(integ, pb, 1.0e-10);
+ AdamsBashforthIntegrator integ = new AdamsBashforthIntegrator(5, 0.0, 1.0, 1.0e-10, 1.0e-10);
+ StepInterpolatorTestUtils.checkDerivativesConsistency(integ, pb, 7e-10);
}
@Test
@@ -51,8 +50,7 @@
IOException, ClassNotFoundException {
TestProblem1 pb = new TestProblem1();
- double step = (pb.getFinalTime() - pb.getInitialTime()) * 0.001;
- AdamsBashforthIntegrator integ = new AdamsBashforthIntegrator(5, step);
+ AdamsBashforthIntegrator integ = new AdamsBashforthIntegrator(5, 0.0, 1.0, 1.0e-10, 1.0e-10);
integ.addStepHandler(new ContinuousOutputModel());
integ.integrate(pb,
pb.getInitialTime(), pb.getInitialState(),
@@ -64,8 +62,8 @@
oos.writeObject(handler);
}
- assertTrue(bos.size () > 148000);
- assertTrue(bos.size () < 149000);
+ assertTrue(bos.size () > 16000);
+ assertTrue(bos.size () < 17000);
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);