Le 22/10/2014 18:31, Phil Steitz a écrit : > On 10/22/14 8:34 AM, l...@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 <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(); > > 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-unsubscr...@commons.apache.org > For additional commands, e-mail: dev-h...@commons.apache.org > > > --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org For additional commands, e-mail: dev-h...@commons.apache.org