Repository: commons-math Updated Branches: refs/heads/master 79ae77fda -> 25aa4bd36
Provide access to state derivatives in ContinuousOutputModel. JIRA: MATH-1160 Project: http://git-wip-us.apache.org/repos/asf/commons-math/repo Commit: http://git-wip-us.apache.org/repos/asf/commons-math/commit/25aa4bd3 Tree: http://git-wip-us.apache.org/repos/asf/commons-math/tree/25aa4bd3 Diff: http://git-wip-us.apache.org/repos/asf/commons-math/diff/25aa4bd3 Branch: refs/heads/master Commit: 25aa4bd3665d8b265f03fa2b3e7ab6ee68256367 Parents: 79ae77f Author: Luc Maisonobe <l...@apache.org> Authored: Wed Oct 22 17:34:29 2014 +0200 Committer: Luc Maisonobe <l...@apache.org> Committed: Wed Oct 22 17:34:29 2014 +0200 ---------------------------------------------------------------------- src/changes/changes.xml | 3 +++ .../math3/ode/ContinuousOutputModel.java | 14 +++++++++++++ .../math3/ode/ContinuousOutputModelTest.java | 21 +++++++++++++------- 3 files changed, 31 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-math/blob/25aa4bd3/src/changes/changes.xml ---------------------------------------------------------------------- diff --git a/src/changes/changes.xml b/src/changes/changes.xml index bb5c525..9350d6b 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -73,6 +73,9 @@ Users are encouraged to upgrade to this version as this release not 2. A few methods in the FastMath class are in fact slower that their counterpart in either Math or StrictMath (cf. MATH-740 and MATH-901). "> + <action dev="luc" type="fix" issue="MATH-1160" > + Provide access to state derivatives in ContinuousOutputModel. + </action> <action dev="luc" type="fix" issue="MATH-1138" due-to="Hank Grabowski"> Fixed bicubic spline interpolator, using Akima splines. </action> http://git-wip-us.apache.org/repos/asf/commons-math/blob/25aa4bd3/src/main/java/org/apache/commons/math3/ode/ContinuousOutputModel.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/math3/ode/ContinuousOutputModel.java b/src/main/java/org/apache/commons/math3/ode/ContinuousOutputModel.java index 599eab9..d9f6192 100644 --- a/src/main/java/org/apache/commons/math3/ode/ContinuousOutputModel.java +++ b/src/main/java/org/apache/commons/math3/ode/ContinuousOutputModel.java @@ -332,12 +332,25 @@ public class ContinuousOutputModel * Get the state vector of the interpolated point. * @return state vector at time {@link #getInterpolatedTime} * @exception MaxCountExceededException if the number of functions evaluations is exceeded + * @see #getInterpolatedDerivatives() * @see #getInterpolatedSecondaryState(int) */ public double[] getInterpolatedState() throws MaxCountExceededException { return steps.get(index).getInterpolatedState(); } + /** + * Get the derivatives of the state vector of the interpolated point. + * @return derivatives of the state vector at time {@link #getInterpolatedTime} + * @exception MaxCountExceededException if the number of functions evaluations is exceeded + * @see #getInterpolatedState() + * @see #getInterpolatedSecondaryState(int) + * @since 3.4 + */ + public double[] getInterpolatedDerivatives() throws MaxCountExceededException { + return steps.get(index).getInterpolatedDerivatives(); + } + /** Get the interpolated secondary state corresponding to the secondary equations. * @param secondaryStateIndex index of the secondary set, as returned by {@link * org.apache.commons.math3.ode.ExpandableStatefulODE#addSecondaryEquations( @@ -345,6 +358,7 @@ public class ContinuousOutputModel * ExpandableStatefulODE.addSecondaryEquations(SecondaryEquations)} * @return interpolated secondary state at the current interpolation date * @see #getInterpolatedState() + * @see #getInterpolatedDerivatives() * @since 3.2 * @exception MaxCountExceededException if the number of functions evaluations is exceeded */ http://git-wip-us.apache.org/repos/asf/commons-math/blob/25aa4bd3/src/test/java/org/apache/commons/math3/ode/ContinuousOutputModelTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/commons/math3/ode/ContinuousOutputModelTest.java b/src/test/java/org/apache/commons/math3/ode/ContinuousOutputModelTest.java index 2f4053d..3a098ba 100644 --- a/src/test/java/org/apache/commons/math3/ode/ContinuousOutputModelTest.java +++ b/src/test/java/org/apache/commons/math3/ode/ContinuousOutputModelTest.java @@ -63,22 +63,29 @@ public class ContinuousOutputModelTest { pb.getFinalTime(), new double[pb.getDimension()]); Random random = new Random(347588535632l); - double maxError = 0.0; + double maxError = 0.0; + double maxErrorDot = 0.0; for (int i = 0; i < 1000; ++i) { double r = random.nextDouble(); double time = r * pb.getInitialTime() + (1.0 - r) * pb.getFinalTime(); cm.setInterpolatedTime(time); - double[] interpolatedY = cm.getInterpolatedState (); - double[] theoreticalY = pb.computeTheoreticalState(time); + double[] interpolatedY = cm.getInterpolatedState(); + double[] interpolatedYDot = cm.getInterpolatedDerivatives(); + double[] theoreticalY = pb.computeTheoreticalState(time); + double[] theoreticalYDot = new double[pb.getDimension()]; + pb.doComputeDerivatives(time, theoreticalY, theoreticalYDot); double dx = interpolatedY[0] - theoreticalY[0]; double dy = interpolatedY[1] - theoreticalY[1]; double error = dx * dx + dy * dy; - if (error > maxError) { - maxError = error; - } + maxError = FastMath.max(maxError, error); + double dxDot = interpolatedYDot[0] - theoreticalYDot[0]; + double dyDot = interpolatedYDot[1] - theoreticalYDot[1]; + double errorDot = dxDot * dxDot + dyDot * dyDot; + maxErrorDot = FastMath.max(maxErrorDot, errorDot); } - Assert.assertTrue(maxError < 1.0e-9); + Assert.assertEquals(0.0, maxError, 1.0e-9); + Assert.assertEquals(0.0, maxErrorDot, 4.0e-7); }