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);
 
   }
 

Reply via email to