1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.math.ode.sampling;
18
19 import static org.junit.Assert.assertEquals;
20
21 import org.apache.commons.math.ode.DerivativeException;
22 import org.apache.commons.math.ode.FirstOrderIntegrator;
23 import org.apache.commons.math.ode.IntegratorException;
24 import org.apache.commons.math.ode.TestProblemAbstract;
25
26 public class StepInterpolatorTestUtils {
27
28 public static void checkDerivativesConsistency(final FirstOrderIntegrator integrator,
29 final TestProblemAbstract problem,
30 final double threshold)
31 throws DerivativeException, IntegratorException {
32 integrator.addStepHandler(new StepHandler() {
33
34 public boolean requiresDenseOutput() {
35 return true;
36 }
37
38 public void handleStep(StepInterpolator interpolator, boolean isLast)
39 throws DerivativeException {
40
41 final double h = 0.001 * (interpolator.getCurrentTime() - interpolator.getPreviousTime());
42 final double t = interpolator.getCurrentTime() - 300 * h;
43
44 if (Math.abs(h) < 10 * Math.ulp(t)) {
45 return;
46 }
47
48 interpolator.setInterpolatedTime(t - 4 * h);
49 final double[] yM4h = interpolator.getInterpolatedState().clone();
50 interpolator.setInterpolatedTime(t - 3 * h);
51 final double[] yM3h = interpolator.getInterpolatedState().clone();
52 interpolator.setInterpolatedTime(t - 2 * h);
53 final double[] yM2h = interpolator.getInterpolatedState().clone();
54 interpolator.setInterpolatedTime(t - h);
55 final double[] yM1h = interpolator.getInterpolatedState().clone();
56 interpolator.setInterpolatedTime(t + h);
57 final double[] yP1h = interpolator.getInterpolatedState().clone();
58 interpolator.setInterpolatedTime(t + 2 * h);
59 final double[] yP2h = interpolator.getInterpolatedState().clone();
60 interpolator.setInterpolatedTime(t + 3 * h);
61 final double[] yP3h = interpolator.getInterpolatedState().clone();
62 interpolator.setInterpolatedTime(t + 4 * h);
63 final double[] yP4h = interpolator.getInterpolatedState().clone();
64
65 interpolator.setInterpolatedTime(t);
66 final double[] yDot = interpolator.getInterpolatedDerivatives();
67
68 for (int i = 0; i < yDot.length; ++i) {
69 final double approYDot = ( -3 * (yP4h[i] - yM4h[i]) +
70 32 * (yP3h[i] - yM3h[i]) +
71 -168 * (yP2h[i] - yM2h[i]) +
72 672 * (yP1h[i] - yM1h[i])) / (840 * h);
73 assertEquals(approYDot, yDot[i], threshold);
74 }
75
76 }
77
78 public void reset() {
79 }
80
81 });
82
83 integrator.integrate(problem,
84 problem.getInitialTime(), problem.getInitialState(),
85 problem.getFinalTime(), new double[problem.getDimension()]);
86
87 }
88 }
89