commons-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Luc Maisonobe <...@spaceroots.org>
Subject Re: git commit: Provide access to state derivatives in ContinuousOutputModel.
Date Wed, 22 Oct 2014 18:20:01 GMT
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 <luc@apache.org>
>> Authored: Wed Oct 22 17:34:29 2014 +0200
>> Committer: Luc Maisonobe <luc@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


Mime
View raw message