1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.commons.math4.legacy.ode.nonstiff;
19
20
21 import java.io.ByteArrayInputStream;
22 import java.io.ByteArrayOutputStream;
23 import java.io.IOException;
24 import java.io.ObjectInputStream;
25 import java.io.ObjectOutputStream;
26 import java.util.Random;
27
28 import org.apache.commons.math4.legacy.exception.DimensionMismatchException;
29 import org.apache.commons.math4.legacy.exception.MaxCountExceededException;
30 import org.apache.commons.math4.legacy.exception.NoBracketingException;
31 import org.apache.commons.math4.legacy.exception.NumberIsTooSmallException;
32 import org.apache.commons.math4.legacy.ode.ContinuousOutputModel;
33 import org.apache.commons.math4.legacy.ode.TestProblem1;
34 import org.apache.commons.math4.legacy.ode.TestProblem3;
35 import org.apache.commons.math4.legacy.ode.sampling.StepHandler;
36 import org.apache.commons.math4.legacy.ode.sampling.StepInterpolatorTestUtils;
37 import org.junit.Assert;
38 import org.junit.Test;
39
40 public class MidpointStepInterpolatorTest {
41
42 @Test
43 public void testDerivativesConsistency()
44 throws DimensionMismatchException, NumberIsTooSmallException,
45 MaxCountExceededException, NoBracketingException {
46 TestProblem3 pb = new TestProblem3();
47 double step = (pb.getFinalTime() - pb.getInitialTime()) * 0.001;
48 MidpointIntegrator integ = new MidpointIntegrator(step);
49 StepInterpolatorTestUtils.checkDerivativesConsistency(integ, pb, 0.01, 6.6e-12);
50 }
51
52 @Test
53 public void serialization()
54 throws IOException, ClassNotFoundException,
55 DimensionMismatchException, NumberIsTooSmallException,
56 MaxCountExceededException, NoBracketingException {
57
58 TestProblem1 pb = new TestProblem1();
59 double step = (pb.getFinalTime() - pb.getInitialTime()) * 0.001;
60 MidpointIntegrator integ = new MidpointIntegrator(step);
61 integ.addStepHandler(new ContinuousOutputModel());
62 integ.integrate(pb,
63 pb.getInitialTime(), pb.getInitialState(),
64 pb.getFinalTime(), new double[pb.getDimension()]);
65
66 ByteArrayOutputStream bos = new ByteArrayOutputStream();
67 ObjectOutputStream oos = new ObjectOutputStream(bos);
68 for (StepHandler handler : integ.getStepHandlers()) {
69 oos.writeObject(handler);
70 }
71
72 Assert.assertTrue(bos.size () > 135000);
73 Assert.assertTrue(bos.size () < 145000);
74
75 ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
76 ObjectInputStream ois = new ObjectInputStream(bis);
77 ContinuousOutputModel cm = (ContinuousOutputModel) ois.readObject();
78
79 Random random = new Random(347588535632L);
80 double maxError = 0.0;
81 for (int i = 0; i < 1000; ++i) {
82 double r = random.nextDouble();
83 double time = r * pb.getInitialTime() + (1.0 - r) * pb.getFinalTime();
84 cm.setInterpolatedTime(time);
85 double[] interpolatedY = cm.getInterpolatedState ();
86 double[] theoreticalY = pb.computeTheoreticalState(time);
87 double dx = interpolatedY[0] - theoreticalY[0];
88 double dy = interpolatedY[1] - theoreticalY[1];
89 double error = dx * dx + dy * dy;
90 if (error > maxError) {
91 maxError = error;
92 }
93 }
94
95 Assert.assertTrue(maxError < 1.0e-6);
96 }
97 }