1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.commons.math.ode;
19
20 import org.apache.commons.math.ode.DerivativeException;
21 import org.apache.commons.math.ode.StepHandler;
22 import org.apache.commons.math.ode.StepInterpolator;
23
24
25
26
27
28 class TestProblemHandler
29 implements StepHandler {
30
31
32 private TestProblemAbstract problem;
33
34
35 private double maxValueError;
36 private double maxTimeError;
37
38
39 private double lastError;
40
41
42 private double lastTime;
43
44
45 private FirstOrderIntegrator integrator;
46
47
48 private double expectedStepStart;
49
50
51
52
53
54
55 public TestProblemHandler(TestProblemAbstract problem, FirstOrderIntegrator integrator) {
56 this.problem = problem;
57 this.integrator = integrator;
58 reset();
59 }
60
61 public boolean requiresDenseOutput() {
62 return true;
63 }
64
65 public void reset() {
66 maxValueError = 0;
67 maxTimeError = 0;
68 lastError = 0;
69 expectedStepStart = problem.getInitialTime();
70 }
71
72 public void handleStep(StepInterpolator interpolator,
73 boolean isLast)
74 throws DerivativeException {
75
76 double start = integrator.getCurrentStepStart();
77 maxTimeError = Math.max(maxTimeError, Math.abs(start - expectedStepStart));
78 expectedStepStart = start + integrator.getCurrentSignedStepsize();
79
80 double pT = interpolator.getPreviousTime();
81 double cT = interpolator.getCurrentTime();
82 double[] errorScale = problem.getErrorScale();
83
84
85 if (isLast) {
86 double[] interpolatedY = interpolator.getInterpolatedState();
87 double[] theoreticalY = problem.computeTheoreticalState(cT);
88 for (int i = 0; i < interpolatedY.length; ++i) {
89 double error = Math.abs(interpolatedY[i] - theoreticalY[i]);
90 if (error > lastError) {
91 lastError = error;
92 }
93 }
94 lastTime = cT;
95 }
96
97
98 for (int k = 0; k <= 20; ++k) {
99
100 double time = pT + (k * (cT - pT)) / 20;
101 interpolator.setInterpolatedTime(time);
102 double[] interpolatedY = interpolator.getInterpolatedState();
103 double[] theoreticalY = problem.computeTheoreticalState(interpolator.getInterpolatedTime());
104
105
106 for (int i = 0; i < interpolatedY.length; ++i) {
107 double error = errorScale[i] * Math.abs(interpolatedY[i] - theoreticalY[i]);
108 if (error > maxValueError) {
109 maxValueError = error;
110 }
111 }
112
113 }
114 }
115
116
117
118
119
120 public double getMaximalValueError() {
121 return maxValueError;
122 }
123
124
125
126
127
128 public double getMaximalTimeError() {
129 return maxTimeError;
130 }
131
132
133
134
135
136 public double getLastError() {
137 return lastError;
138 }
139
140
141
142
143
144 public double getLastTime() {
145 return lastTime;
146 }
147
148 }