You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by lu...@apache.org on 2014/10/22 17:34:44 UTC

git commit: Provide access to state derivatives in ContinuousOutputModel.

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 <lu...@apache.org>
Authored: Wed Oct 22 17:34:29 2014 +0200
Committer: Luc Maisonobe <lu...@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);
 
   }
 


Re: git commit: Provide access to state derivatives in ContinuousOutputModel.

Posted by Phil Steitz <ph...@gmail.com>.
On 10/22/14 11:20 AM, Luc Maisonobe wrote:
> Le 22/10/2014 18:31, Phil Steitz a écrit :
>> On 10/22/14 8:34 AM, luc@apache.org wrote:
>>> 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 <lu...@apache.org>
>>> Authored: Wed Oct 22 17:34:29 2014 +0200
>>> Committer: Luc Maisonobe <lu...@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();
>> Do you maybe want to make a copy here?
> I have followed the same pattern as getInterpolatedState above, which
> returns the array without copying it. The reason for this choice was
> that the method is essentially used to peek at state during the
> integration, and it is called a huge number of time, at each steps.
>
> I agree this choice was wrong, just as passing arrays so user fill them
> in the associated FirstOrderDifferentialEquations interface is not up to
> date design.
>
> Perhaps we should rethink all this for 4.0? As for 3.4, being consistent
> with the existing methods seemed better to me.
>
> Does this seems sensible to you?

Yes, what threw me was
 @return derivatives of the state vector at time {@link
#getInterpolatedTime}
which seemed to indicate a copy would be needed.  Is the
interpolated time invariant over the integration?  If not, the
javadoc should be fixed.

Phil
>
> best regards,
> Luc
>
>> Phil
>>> +  }
>>> +
>>>    /** 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);
>>>  
>>>    }
>>>  
>>>
>>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
>> For additional commands, e-mail: dev-help@commons.apache.org
>>
>>
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
> For additional commands, e-mail: dev-help@commons.apache.org
>
>



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
For additional commands, e-mail: dev-help@commons.apache.org


Re: git commit: Provide access to state derivatives in ContinuousOutputModel.

Posted by Luc Maisonobe <lu...@spaceroots.org>.
Le 22/10/2014 18:31, Phil Steitz a écrit :
> On 10/22/14 8:34 AM, luc@apache.org wrote:
>> 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 <lu...@apache.org>
>> Authored: Wed Oct 22 17:34:29 2014 +0200
>> Committer: Luc Maisonobe <lu...@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();
> 
> Do you maybe want to make a copy here?

I have followed the same pattern as getInterpolatedState above, which
returns the array without copying it. The reason for this choice was
that the method is essentially used to peek at state during the
integration, and it is called a huge number of time, at each steps.

I agree this choice was wrong, just as passing arrays so user fill them
in the associated FirstOrderDifferentialEquations interface is not up to
date design.

Perhaps we should rethink all this for 4.0? As for 3.4, being consistent
with the existing methods seemed better to me.

Does this seems sensible to you?

best regards,
Luc

> 
> Phil
>> +  }
>> +
>>    /** 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);
>>  
>>    }
>>  
>>
>>
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
> For additional commands, e-mail: dev-help@commons.apache.org
> 
> 
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
For additional commands, e-mail: dev-help@commons.apache.org


Re: git commit: Provide access to state derivatives in ContinuousOutputModel.

Posted by Phil Steitz <ph...@gmail.com>.
On 10/22/14 8:34 AM, luc@apache.org wrote:
> 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 <lu...@apache.org>
> Authored: Wed Oct 22 17:34:29 2014 +0200
> Committer: Luc Maisonobe <lu...@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();

Do you maybe want to make a copy here?

Phil
> +  }
> +
>    /** 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);
>  
>    }
>  
>
>


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
For additional commands, e-mail: dev-help@commons.apache.org