http://git-wip-us.apache.org/repos/asf/commons-math/blob/07e2b944/src/main/java/org/apache/commons/math3/ode/nonstiff/GillFieldStepInterpolator.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/math3/ode/nonstiff/GillFieldStepInterpolator.java b/src/main/java/org/apache/commons/math3/ode/nonstiff/GillFieldStepInterpolator.java index 8a6b38e..8990dc5 100644 --- a/src/main/java/org/apache/commons/math3/ode/nonstiff/GillFieldStepInterpolator.java +++ b/src/main/java/org/apache/commons/math3/ode/nonstiff/GillFieldStepInterpolator.java @@ -22,7 +22,6 @@ import org.apache.commons.math3.ode.AbstractFieldIntegrator; import org.apache.commons.math3.ode.FieldEquationsMapper; import org.apache.commons.math3.ode.FieldODEStateAndDerivative; import org.apache.commons.math3.util.FastMath; -import org.apache.commons.math3.util.MathArrays; /** * This class implements a step interpolator for the Gill fourth @@ -68,17 +67,13 @@ class GillFieldStepInterpolator<T extends RealFieldElement<T>> /** Simple constructor. * @param rkIntegrator integrator being used - * @param y reference to the integrator array holding the state at - * the end of the step - * @param yDotArray reference to the integrator array holding all the - * intermediate slopes * @param forward integration direction indicator * @param mapper equations mapper for the all equations */ GillFieldStepInterpolator(final AbstractFieldIntegrator<T> rkIntegrator, - final T[] y, final T[][] yDotArray, final boolean forward, + final boolean forward, final FieldEquationsMapper<T> mapper) { - super(rkIntegrator, y, yDotArray, forward, mapper); + super(rkIntegrator, forward, mapper); } /** Copy constructor. @@ -98,6 +93,7 @@ class GillFieldStepInterpolator<T extends RealFieldElement<T>> /** {@inheritDoc} */ + @SuppressWarnings("unchecked") @Override protected FieldODEStateAndDerivative<T> computeInterpolatedStateAndDerivatives(final FieldEquationsMapper<T> mapper, final T time, final T theta, @@ -111,48 +107,30 @@ class GillFieldStepInterpolator<T extends RealFieldElement<T>> final T coeffDot2 = cDot23.multiply(ONE_MINUS_INV_SQRT_2); final T coeffDot3 = cDot23.multiply(ONE_PLUS_INV_SQRT_2); final T coeffDot4 = theta.multiply(twoTheta.subtract(1)); - final T[] interpolatedState = MathArrays.buildArray(theta.getField(), previousState.length); - final T[] interpolatedDerivatives = MathArrays.buildArray(theta.getField(), previousState.length); - - if ((previousState != null) && (theta.getReal() <= 0.5)) { - final T s = theta.multiply(h).divide(6.0); - final T c23 = s.multiply(theta.multiply(6).subtract(fourTheta2)); - final T coeff1 = s.multiply(fourTheta2.subtract(theta.multiply(6)).add(6)); - final T coeff2 = c23.multiply(ONE_MINUS_INV_SQRT_2); - final T coeff3 = c23.multiply(ONE_PLUS_INV_SQRT_2); - final T coeff4 = s.multiply(fourTheta2.subtract(theta.multiply(3))); - for (int i = 0; i < interpolatedState.length; ++i) { - final T yDot1 = yDotK[0][i]; - final T yDot2 = yDotK[1][i]; - final T yDot3 = yDotK[2][i]; - final T yDot4 = yDotK[3][i]; - interpolatedState[i] = previousState[i]. - add(coeff1.multiply(yDot1)).add(coeff2.multiply(yDot2)). - add(coeff3.multiply(yDot3)).add(coeff4.multiply(yDot4)); - interpolatedDerivatives[i] = coeffDot1.multiply(yDot1).add(coeffDot2.multiply(yDot2)). - add(coeffDot3.multiply(yDot3)).add(coeffDot4.multiply(yDot4)); - } + final T[] interpolatedState; + final T[] interpolatedDerivatives; + + if (getGlobalPreviousState() != null && theta.getReal() <= 0.5) { + final T s = theta.multiply(h).divide(6.0); + final T c23 = s.multiply(theta.multiply(6).subtract(fourTheta2)); + final T coeff1 = s.multiply(fourTheta2.subtract(theta.multiply(6)).add(6)); + final T coeff2 = c23.multiply(ONE_MINUS_INV_SQRT_2); + final T coeff3 = c23.multiply(ONE_PLUS_INV_SQRT_2); + final T coeff4 = s.multiply(fourTheta2.subtract(theta.multiply(3))); + interpolatedState = previousStateLinearCombination(coeff1, coeff2, coeff3, coeff4); + interpolatedDerivatives = derivativeLinearCombination(coeffDot1, coeffDot2, coeffDot3, coeffDot4); } else { - final T s = oneMinusThetaH.divide(6.0); - final T c23 = s .multiply(twoTheta.add(2).subtract(fourTheta2)); + final T s = oneMinusThetaH.divide(-6.0); + final T c23 = s.multiply(twoTheta.add(2).subtract(fourTheta2)); final T coeff1 = s.multiply(fourTheta2.subtract(theta.multiply(5)).add(1)); final T coeff2 = c23.multiply(ONE_MINUS_INV_SQRT_2); final T coeff3 = c23.multiply(ONE_PLUS_INV_SQRT_2); final T coeff4 = s.multiply(fourTheta2.add(theta).add(1)); - for (int i = 0; i < interpolatedState.length; ++i) { - final T yDot1 = yDotK[0][i]; - final T yDot2 = yDotK[1][i]; - final T yDot3 = yDotK[2][i]; - final T yDot4 = yDotK[3][i]; - interpolatedState[i] = currentState[i]. - subtract(coeff1.multiply(yDot1)).subtract(coeff2.multiply(yDot2)). - subtract(coeff3.multiply(yDot3)).subtract(coeff4.multiply(yDot4)); - interpolatedDerivatives[i] = coeffDot1.multiply(yDot1).add(coeffDot2.multiply(yDot2)). - add(coeffDot3.multiply(yDot3)).add(coeffDot4.multiply(yDot4)); - } + interpolatedState = previousStateLinearCombination(coeff1, coeff2, coeff3, coeff4); + interpolatedDerivatives = derivativeLinearCombination(coeffDot1, coeffDot2, coeffDot3, coeffDot4); } - return new FieldODEStateAndDerivative<T>(time, interpolatedState, yDotK[0]); + return new FieldODEStateAndDerivative<T>(time, interpolatedState, interpolatedDerivatives); }
http://git-wip-us.apache.org/repos/asf/commons-math/blob/07e2b944/src/main/java/org/apache/commons/math3/ode/nonstiff/HighamHall54FieldIntegrator.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/math3/ode/nonstiff/HighamHall54FieldIntegrator.java b/src/main/java/org/apache/commons/math3/ode/nonstiff/HighamHall54FieldIntegrator.java index 092393a..8ee90b7 100644 --- a/src/main/java/org/apache/commons/math3/ode/nonstiff/HighamHall54FieldIntegrator.java +++ b/src/main/java/org/apache/commons/math3/ode/nonstiff/HighamHall54FieldIntegrator.java @@ -19,7 +19,6 @@ package org.apache.commons.math3.ode.nonstiff; import org.apache.commons.math3.Field; import org.apache.commons.math3.RealFieldElement; -import org.apache.commons.math3.ode.AbstractFieldIntegrator; import org.apache.commons.math3.ode.FieldEquationsMapper; import org.apache.commons.math3.util.MathArrays; import org.apache.commons.math3.util.MathUtils; @@ -64,7 +63,7 @@ public class HighamHall54FieldIntegrator<T extends RealFieldElement<T>> final double minStep, final double maxStep, final double scalAbsoluteTolerance, final double scalRelativeTolerance) { - super(field, METHOD_NAME, false, + super(field, METHOD_NAME, -1, minStep, maxStep, scalAbsoluteTolerance, scalRelativeTolerance); e = MathArrays.buildArray(field, 7); e[0] = fraction(-1, 20); @@ -92,7 +91,7 @@ public class HighamHall54FieldIntegrator<T extends RealFieldElement<T>> final double minStep, final double maxStep, final double[] vecAbsoluteTolerance, final double[] vecRelativeTolerance) { - super(field, METHOD_NAME, false, + super(field, METHOD_NAME, -1, minStep, maxStep, vecAbsoluteTolerance, vecRelativeTolerance); e = MathArrays.buildArray(field, 7); e[0] = fraction(-1, 20); @@ -165,10 +164,8 @@ public class HighamHall54FieldIntegrator<T extends RealFieldElement<T>> /** {@inheritDoc} */ @Override protected HighamHall54FieldStepInterpolator<T> - createInterpolator(final AbstractFieldIntegrator<T> rkIntegrator, final T[] y, - final T[][] yDotArray, final boolean forward, - final FieldEquationsMapper<T> mapper) { - return new HighamHall54FieldStepInterpolator<T>(rkIntegrator, y, yDotArray, forward, mapper); + createInterpolator(final boolean forward, final FieldEquationsMapper<T> mapper) { + return new HighamHall54FieldStepInterpolator<T>(this, forward, mapper); } /** {@inheritDoc} */ http://git-wip-us.apache.org/repos/asf/commons-math/blob/07e2b944/src/main/java/org/apache/commons/math3/ode/nonstiff/HighamHall54FieldStepInterpolator.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/math3/ode/nonstiff/HighamHall54FieldStepInterpolator.java b/src/main/java/org/apache/commons/math3/ode/nonstiff/HighamHall54FieldStepInterpolator.java index 3ee52a9..3f8499c 100644 --- a/src/main/java/org/apache/commons/math3/ode/nonstiff/HighamHall54FieldStepInterpolator.java +++ b/src/main/java/org/apache/commons/math3/ode/nonstiff/HighamHall54FieldStepInterpolator.java @@ -21,7 +21,6 @@ import org.apache.commons.math3.RealFieldElement; import org.apache.commons.math3.ode.AbstractFieldIntegrator; import org.apache.commons.math3.ode.FieldEquationsMapper; import org.apache.commons.math3.ode.FieldODEStateAndDerivative; -import org.apache.commons.math3.util.MathArrays; /** * This class represents an interpolator over the last step during an @@ -38,17 +37,13 @@ class HighamHall54FieldStepInterpolator<T extends RealFieldElement<T>> /** Simple constructor. * @param rkIntegrator integrator being used - * @param y reference to the integrator array holding the state at - * the end of the step - * @param yDotArray reference to the integrator array holding all the - * intermediate slopes * @param forward integration direction indicator * @param mapper equations mapper for the all equations */ HighamHall54FieldStepInterpolator(final AbstractFieldIntegrator<T> rkIntegrator, - final T[] y, final T[][] yDotArray, final boolean forward, + final boolean forward, final FieldEquationsMapper<T> mapper) { - super(rkIntegrator, y, yDotArray, forward, mapper); + super(rkIntegrator, forward, mapper); } /** Copy constructor. @@ -68,72 +63,44 @@ class HighamHall54FieldStepInterpolator<T extends RealFieldElement<T>> /** {@inheritDoc} */ + @SuppressWarnings("unchecked") @Override protected FieldODEStateAndDerivative<T> computeInterpolatedStateAndDerivatives(final FieldEquationsMapper<T> mapper, final T time, final T theta, final T oneMinusThetaH) { final T bDot0 = theta.multiply(theta.multiply(theta.multiply( -10.0 ).add( 16.0 )).add(-15.0 / 2.0)).add(1); + final T bDot1 = time.getField().getZero(); final T bDot2 = theta.multiply(theta.multiply(theta.multiply( 135.0 / 2.0).add(-729.0 / 8.0)).add(459.0 / 16.0)); final T bDot3 = theta.multiply(theta.multiply(theta.multiply(-120.0 ).add( 152.0 )).add(-44.0 )); final T bDot4 = theta.multiply(theta.multiply(theta.multiply( 125.0 / 2.0).add(-625.0 / 8.0)).add(375.0 / 16.0)); final T bDot5 = theta.multiply( 5.0 / 8.0).multiply(theta.multiply(2).subtract(1)); - final T[] interpolatedState = MathArrays.buildArray(theta.getField(), previousState.length); - final T[] interpolatedDerivatives = MathArrays.buildArray(theta.getField(), previousState.length); + final T[] interpolatedState; + final T[] interpolatedDerivatives; - if ((previousState != null) && (theta.getReal() <= 0.5)) { + if (getGlobalPreviousState() != null && theta.getReal() <= 0.5) { final T hTheta = h.multiply(theta); final T b0 = hTheta.multiply(theta.multiply(theta.multiply(theta.multiply( -5.0 / 2.0).add( 16.0 / 3.0)).add(-15.0 / 4.0)).add(1)); + final T b1 = time.getField().getZero(); final T b2 = hTheta.multiply(theta.multiply(theta.multiply(theta.multiply(135.0 / 8.0).add(-243.0 / 8.0)).add(459.0 / 32.0))); final T b3 = hTheta.multiply(theta.multiply(theta.multiply(theta.multiply(-30.0 ).add( 152.0 / 3.0)).add(-22.0 ))); final T b4 = hTheta.multiply(theta.multiply(theta.multiply(theta.multiply(125.0 / 8.0).add(-625.0 / 24.0)).add(375.0 / 32.0))); final T b5 = hTheta.multiply(theta.multiply(theta.multiply( 5.0 / 12.0)).add( -5.0 / 16.0)); - for (int i = 0; i < interpolatedState.length; ++i) { - final T yDot0 = yDotK[0][i]; - final T yDot2 = yDotK[2][i]; - final T yDot3 = yDotK[3][i]; - final T yDot4 = yDotK[4][i]; - final T yDot5 = yDotK[5][i]; - interpolatedState[i] = previousState[i]. - add(b0.multiply(yDot0)). - add(b2.multiply(yDot2)). - add(b3.multiply(yDot3)). - add(b4.multiply(yDot4)). - add(b5.multiply(yDot5)); - interpolatedDerivatives[i] = bDot0.multiply(yDot0). - add(bDot2.multiply(yDot2)). - add(bDot3.multiply(yDot3)). - add(bDot4.multiply(yDot4)). - add(bDot5.multiply(yDot5)); - } + interpolatedState = previousStateLinearCombination(b0, b1, b2, b3, b4, b5); + interpolatedDerivatives = derivativeLinearCombination(bDot0, bDot1, bDot2, bDot3, bDot4, bDot5); } else { final T theta2 = theta.multiply(theta); final T b0 = h.multiply( theta.multiply(theta.multiply(theta.multiply(theta.multiply(-5.0 / 2.0).add( 16.0 / 3.0)).add( -15.0 / 4.0)).add( 1.0 )).add( -1.0 / 12.0)); + final T b1 = time.getField().getZero(); final T b2 = h.multiply(theta2.multiply(theta.multiply(theta.multiply( 135.0 / 8.0 ).add(-243.0 / 8.0)).add(459.0 / 32.0)).add( -27.0 / 32.0)); final T b3 = h.multiply(theta2.multiply(theta.multiply(theta.multiply( -30.0 ).add( 152.0 / 3.0)).add(-22.0 )).add( 4.0 / 3.0)); final T b4 = h.multiply(theta2.multiply(theta.multiply(theta.multiply( 125.0 / 8.0 ).add(-625.0 / 24.0)).add(375.0 / 32.0)).add(-125.0 / 96.0)); final T b5 = h.multiply(theta2.multiply(theta.multiply( 5.0 / 12.0 ).add(-5.0 / 16.0)).add( -5.0 / 48.0)); - for (int i = 0; i < interpolatedState.length; ++i) { - final T yDot0 = yDotK[0][i]; - final T yDot2 = yDotK[2][i]; - final T yDot3 = yDotK[3][i]; - final T yDot4 = yDotK[4][i]; - final T yDot5 = yDotK[5][i]; - interpolatedState[i] = currentState[i]. - add(b0.multiply(yDot0)). - add(b2.multiply(yDot2)). - add(b3.multiply(yDot3)). - add(b4.multiply(yDot4)). - add(b5.multiply(yDot5)); - interpolatedDerivatives[i] = bDot0.multiply(yDot0). - add(bDot2.multiply(yDot2)). - add(bDot3.multiply(yDot3)). - add(bDot4.multiply(yDot4)). - add(bDot5.multiply(yDot5)); - } + interpolatedState = currentStateLinearCombination(b0, b1, b2, b3, b4, b5); + interpolatedDerivatives = derivativeLinearCombination(bDot0, bDot1, bDot2, bDot3, bDot4, bDot5); } - return new FieldODEStateAndDerivative<T>(time, interpolatedState, yDotK[0]); + return new FieldODEStateAndDerivative<T>(time, interpolatedState, interpolatedDerivatives); } http://git-wip-us.apache.org/repos/asf/commons-math/blob/07e2b944/src/main/java/org/apache/commons/math3/ode/nonstiff/LutherFieldIntegrator.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/math3/ode/nonstiff/LutherFieldIntegrator.java b/src/main/java/org/apache/commons/math3/ode/nonstiff/LutherFieldIntegrator.java index 363e042..c36e5dd 100644 --- a/src/main/java/org/apache/commons/math3/ode/nonstiff/LutherFieldIntegrator.java +++ b/src/main/java/org/apache/commons/math3/ode/nonstiff/LutherFieldIntegrator.java @@ -19,7 +19,6 @@ package org.apache.commons.math3.ode.nonstiff; import org.apache.commons.math3.Field; import org.apache.commons.math3.RealFieldElement; -import org.apache.commons.math3.ode.AbstractFieldIntegrator; import org.apache.commons.math3.ode.FieldEquationsMapper; import org.apache.commons.math3.util.MathArrays; @@ -138,10 +137,8 @@ public class LutherFieldIntegrator<T extends RealFieldElement<T>> /** {@inheritDoc} */ @Override protected LutherFieldStepInterpolator<T> - createInterpolator(final AbstractFieldIntegrator<T> rkIntegrator, final T[] y, - final T[][] yDotArray, final boolean forward, - final FieldEquationsMapper<T> mapper) { - return new LutherFieldStepInterpolator<T>(rkIntegrator, y, yDotArray, forward, mapper); + createInterpolator(final boolean forward, final FieldEquationsMapper<T> mapper) { + return new LutherFieldStepInterpolator<T>(this, forward, mapper); } } http://git-wip-us.apache.org/repos/asf/commons-math/blob/07e2b944/src/main/java/org/apache/commons/math3/ode/nonstiff/LutherFieldStepInterpolator.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/math3/ode/nonstiff/LutherFieldStepInterpolator.java b/src/main/java/org/apache/commons/math3/ode/nonstiff/LutherFieldStepInterpolator.java index 8a0d407..6f643d5 100644 --- a/src/main/java/org/apache/commons/math3/ode/nonstiff/LutherFieldStepInterpolator.java +++ b/src/main/java/org/apache/commons/math3/ode/nonstiff/LutherFieldStepInterpolator.java @@ -21,7 +21,6 @@ import org.apache.commons.math3.RealFieldElement; import org.apache.commons.math3.ode.AbstractFieldIntegrator; import org.apache.commons.math3.ode.FieldEquationsMapper; import org.apache.commons.math3.ode.FieldODEStateAndDerivative; -import org.apache.commons.math3.util.MathArrays; /** * This class represents an interpolator over the last step during an @@ -83,17 +82,13 @@ class LutherFieldStepInterpolator<T extends RealFieldElement<T>> /** Simple constructor. * @param rkIntegrator integrator being used - * @param y reference to the integrator array holding the state at - * the end of the step - * @param yDotArray reference to the integrator array holding all the - * intermediate slopes * @param forward integration direction indicator * @param mapper equations mapper for the all equations */ LutherFieldStepInterpolator(final AbstractFieldIntegrator<T> rkIntegrator, - final T[] y, final T[][] yDotArray, final boolean forward, + final boolean forward, final FieldEquationsMapper<T> mapper) { - super(rkIntegrator, y, yDotArray, forward, mapper); + super(rkIntegrator, forward, mapper); final T q = rkIntegrator.getField().getOne().multiply(21).sqrt(); c5a = q.multiply( -49).add( -49); c5b = q.multiply( 287).add( 392); @@ -143,6 +138,7 @@ class LutherFieldStepInterpolator<T extends RealFieldElement<T>> /** {@inheritDoc} */ + @SuppressWarnings("unchecked") @Override protected FieldODEStateAndDerivative<T> computeInterpolatedStateAndDerivatives(final FieldEquationsMapper<T> mapper, final T time, final T theta, @@ -192,86 +188,42 @@ class LutherFieldStepInterpolator<T extends RealFieldElement<T>> // At the end, we get the b_i as polynomials in theta. final T coeffDot1 = theta.multiply(theta.multiply(theta.multiply(theta.multiply( 21 ).add( -47 )).add( 36 )).add( -54 / 5.0)).add(1); - // not really needed as it is zero: final T coeffDot2 = theta.getField().getZero(); + final T coeffDot2 = theta.getField().getZero(); final T coeffDot3 = theta.multiply(theta.multiply(theta.multiply(theta.multiply( 112 ).add(-608 / 3.0)).add( 320 / 3.0 )).add(-208 / 15.0)); final T coeffDot4 = theta.multiply(theta.multiply(theta.multiply(theta.multiply( -567 / 5.0).add( 972 / 5.0)).add( -486 / 5.0 )).add( 324 / 25.0)); final T coeffDot5 = theta.multiply(theta.multiply(theta.multiply(theta.multiply(c5a.divide(5)).add(c5b.divide(15))).add(c5c.divide(30))).add(c5d.divide(150))); final T coeffDot6 = theta.multiply(theta.multiply(theta.multiply(theta.multiply(c6a.divide(5)).add(c6b.divide(15))).add(c6c.divide(30))).add(c6d.divide(150))); final T coeffDot7 = theta.multiply(theta.multiply(theta.multiply( 3 )).add( -3 )).add( 3 / 5.0); - final T[] interpolatedState = MathArrays.buildArray(theta.getField(), previousState.length); - final T[] interpolatedDerivatives = MathArrays.buildArray(theta.getField(), previousState.length); - - if ((previousState != null) && (theta.getReal() <= 0.5)) { - - final T coeff1 = theta.multiply(theta.multiply(theta.multiply(theta.multiply( 21 / 5.0).add( -47 / 4.0)).add( 12 )).add( -27 / 5.0)).add(1); - // not really needed as it is zero: final T coeff2 = theta.getField().getZero(); - final T coeff3 = theta.multiply(theta.multiply(theta.multiply(theta.multiply( 112 / 5.0).add(-152 / 3.0)).add( 320 / 9.0 )).add(-104 / 15.0)); - final T coeff4 = theta.multiply(theta.multiply(theta.multiply(theta.multiply(-567 / 25.0).add( 243 / 5.0)).add( -162 / 5.0 )).add( 162 / 25.0)); - final T coeff5 = theta.multiply(theta.multiply(theta.multiply(theta.multiply(c5a.divide(25)).add(c5b.divide(60))).add(c5c.divide(90))).add(c5d.divide(300))); - final T coeff6 = theta.multiply(theta.multiply(theta.multiply(theta.multiply(c5a.divide(25)).add(c6b.divide(60))).add(c6c.divide(90))).add(c6d.divide(300))); - final T coeff7 = theta.multiply(theta.multiply(theta.multiply( 3 / 4.0)).add( -1 )).add( 3 / 10.0); - for (int i = 0; i < interpolatedState.length; ++i) { - final T yDot1 = yDotK[0][i]; - // not really needed as associated coefficients are zero: final T yDot2 = yDotK[1][i]; - final T yDot3 = yDotK[2][i]; - final T yDot4 = yDotK[3][i]; - final T yDot5 = yDotK[4][i]; - final T yDot6 = yDotK[5][i]; - final T yDot7 = yDotK[6][i]; - interpolatedState[i] = previousState[i]. - add(theta.multiply(h). - multiply( coeff1.multiply(yDot1). - // not really needed as it is zero: add(coeff2.multiply(yDot2)). - add(coeff3.multiply(yDot3)). - add(coeff4.multiply(yDot4)). - add(coeff5.multiply(yDot5)). - add(coeff6.multiply(yDot6)). - add(coeff7.multiply(yDot7)))); - interpolatedDerivatives[i] = coeffDot1.multiply(yDot1). - // not really needed as it is zero: add(coeffDot2.multiply(yDot2)). - add(coeffDot3.multiply(yDot3)). - add(coeffDot4.multiply(yDot4)). - add(coeffDot5.multiply(yDot5)). - add(coeffDot6.multiply(yDot6)). - add(coeffDot7.multiply(yDot7)); - } + final T[] interpolatedState; + final T[] interpolatedDerivatives; + + if (getGlobalPreviousState() != null && theta.getReal() <= 0.5) { + + final T s = theta.multiply(theta.multiply(h)); + final T coeff1 = s.multiply(theta.multiply(theta.multiply(theta.multiply( 21 / 5.0).add( -47 / 4.0)).add( 12 )).add( -27 / 5.0)).add(1); + final T coeff2 = s.getField().getZero(); + final T coeff3 = s.multiply(theta.multiply(theta.multiply(theta.multiply( 112 / 5.0).add(-152 / 3.0)).add( 320 / 9.0 )).add(-104 / 15.0)); + final T coeff4 = s.multiply(theta.multiply(theta.multiply(theta.multiply(-567 / 25.0).add( 243 / 5.0)).add( -162 / 5.0 )).add( 162 / 25.0)); + final T coeff5 = s.multiply(theta.multiply(theta.multiply(theta.multiply(c5a.divide(25)).add(c5b.divide(60))).add(c5c.divide(90))).add(c5d.divide(300))); + final T coeff6 = s.multiply(theta.multiply(theta.multiply(theta.multiply(c5a.divide(25)).add(c6b.divide(60))).add(c6c.divide(90))).add(c6d.divide(300))); + final T coeff7 = s.multiply(theta.multiply(theta.multiply( 3 / 4.0)).add( -1 )).add( 3 / 10.0); + interpolatedState = previousStateLinearCombination(coeff1, coeff2, coeff3, coeff4, coeff5, coeff6, coeff7); + interpolatedDerivatives = derivativeLinearCombination(coeffDot1, coeffDot2, coeffDot3, coeffDot4, coeffDot5, coeffDot6, coeffDot7); } else { - final T coeff1 = theta.multiply(theta.multiply(theta.multiply(theta.multiply( -21 / 5.0).add( 151 / 20.0)).add( -89 / 20.0)).add( 19 / 20.0)).add( -1 / 20.0); - // not really needed as it is zero: final T coeff2 = theta.getField().getZero(); - final T coeff3 = theta.multiply(theta.multiply(theta.multiply(theta.multiply(-112 / 5.0).add( 424 / 15.0)).add( -328 / 45.0)).add( -16 / 45.0)).add(-16 / 45.0); - final T coeff4 = theta.multiply(theta.multiply(theta.multiply(theta.multiply( 567 / 25.0).add( -648 / 25.0)).add( 162 / 25.0))); - final T coeff5 = theta.multiply(theta.multiply(theta.multiply(theta.multiply(d5a.divide(25)).add(d5b.divide(300))).add(d5c.divide(900))).add( -49 / 180.0)).add(-49 / 180.0); - final T coeff6 = theta.multiply(theta.multiply(theta.multiply(theta.multiply(d6a.divide(25)).add(d6b.divide(300))).add(d6c.divide(900))).add( -49 / 180.0)).add(-49 / 180.0); - final T coeff7 = theta.multiply(theta.multiply(theta.multiply( -3 / 4.0 ).add( 1 / 4.0)).add( -1 / 20.0)).add( -1 / 20.0); - for (int i = 0; i < interpolatedState.length; ++i) { - final T yDot1 = yDotK[0][i]; - // not really needed as associated coefficients are zero: final T yDot2 = yDotK[1][i]; - final T yDot3 = yDotK[2][i]; - final T yDot4 = yDotK[3][i]; - final T yDot5 = yDotK[4][i]; - final T yDot6 = yDotK[5][i]; - final T yDot7 = yDotK[6][i]; - interpolatedState[i] = currentState[i]. - add(oneMinusThetaH. - multiply( coeff1.multiply(yDot1). - // not really needed as it is zero: add(coeff2.multiply(yDot2)). - add(coeff3.multiply(yDot3)). - add(coeff4.multiply(yDot4)). - add(coeff5.multiply(yDot5)). - add(coeff6.multiply(yDot6)). - add(coeff7.multiply(yDot7)))); - interpolatedDerivatives[i] = coeffDot1.multiply(yDot1). - // not really needed as it is zero: add(coeffDot2.multiply(yDot2)). - add(coeffDot3.multiply(yDot3)). - add(coeffDot4.multiply(yDot4)). - add(coeffDot5.multiply(yDot5)). - add(coeffDot6.multiply(yDot6)). - add(coeffDot7.multiply(yDot7)); - } + final T s = oneMinusThetaH.multiply(theta); + final T coeff1 = s.multiply(theta.multiply(theta.multiply(theta.multiply( -21 / 5.0).add( 151 / 20.0)).add( -89 / 20.0)).add( 19 / 20.0)).add( -1 / 20.0); + final T coeff2 = s.getField().getZero(); + final T coeff3 = s.multiply(theta.multiply(theta.multiply(theta.multiply(-112 / 5.0).add( 424 / 15.0)).add( -328 / 45.0)).add( -16 / 45.0)).add(-16 / 45.0); + final T coeff4 = s.multiply(theta.multiply(theta.multiply(theta.multiply( 567 / 25.0).add( -648 / 25.0)).add( 162 / 25.0))); + final T coeff5 = s.multiply(theta.multiply(theta.multiply(theta.multiply(d5a.divide(25)).add(d5b.divide(300))).add(d5c.divide(900))).add( -49 / 180.0)).add(-49 / 180.0); + final T coeff6 = s.multiply(theta.multiply(theta.multiply(theta.multiply(d6a.divide(25)).add(d6b.divide(300))).add(d6c.divide(900))).add( -49 / 180.0)).add(-49 / 180.0); + final T coeff7 = s.multiply(theta.multiply(theta.multiply( -3 / 4.0 ).add( 1 / 4.0)).add( -1 / 20.0)).add( -1 / 20.0); + interpolatedState = currentStateLinearCombination(coeff1, coeff2, coeff3, coeff4, coeff5, coeff6, coeff7); + interpolatedDerivatives = derivativeLinearCombination(coeffDot1, coeffDot2, coeffDot3, coeffDot4, coeffDot5, coeffDot6, coeffDot7); } - return new FieldODEStateAndDerivative<T>(time, interpolatedState, yDotK[0]); + return new FieldODEStateAndDerivative<T>(time, interpolatedState, interpolatedDerivatives); } http://git-wip-us.apache.org/repos/asf/commons-math/blob/07e2b944/src/main/java/org/apache/commons/math3/ode/nonstiff/MidpointFieldIntegrator.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/math3/ode/nonstiff/MidpointFieldIntegrator.java b/src/main/java/org/apache/commons/math3/ode/nonstiff/MidpointFieldIntegrator.java index f74fdba..3cc4c71 100644 --- a/src/main/java/org/apache/commons/math3/ode/nonstiff/MidpointFieldIntegrator.java +++ b/src/main/java/org/apache/commons/math3/ode/nonstiff/MidpointFieldIntegrator.java @@ -19,7 +19,6 @@ package org.apache.commons.math3.ode.nonstiff; import org.apache.commons.math3.Field; import org.apache.commons.math3.RealFieldElement; -import org.apache.commons.math3.ode.AbstractFieldIntegrator; import org.apache.commons.math3.ode.FieldEquationsMapper; import org.apache.commons.math3.util.MathArrays; @@ -86,10 +85,8 @@ public class MidpointFieldIntegrator<T extends RealFieldElement<T>> extends Rung /** {@inheritDoc} */ @Override protected MidpointFieldStepInterpolator<T> - createInterpolator(final AbstractFieldIntegrator<T> rkIntegrator, final T[] y, - final T[][] yDotArray, final boolean forward, - final FieldEquationsMapper<T> mapper) { - return new MidpointFieldStepInterpolator<T>(rkIntegrator, y, yDotArray, forward, mapper); + createInterpolator(final boolean forward, final FieldEquationsMapper<T> mapper) { + return new MidpointFieldStepInterpolator<T>(this, forward, mapper); } } http://git-wip-us.apache.org/repos/asf/commons-math/blob/07e2b944/src/main/java/org/apache/commons/math3/ode/nonstiff/MidpointFieldStepInterpolator.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/math3/ode/nonstiff/MidpointFieldStepInterpolator.java b/src/main/java/org/apache/commons/math3/ode/nonstiff/MidpointFieldStepInterpolator.java index 6569c4c..943533a 100644 --- a/src/main/java/org/apache/commons/math3/ode/nonstiff/MidpointFieldStepInterpolator.java +++ b/src/main/java/org/apache/commons/math3/ode/nonstiff/MidpointFieldStepInterpolator.java @@ -21,7 +21,6 @@ import org.apache.commons.math3.RealFieldElement; import org.apache.commons.math3.ode.AbstractFieldIntegrator; import org.apache.commons.math3.ode.FieldEquationsMapper; import org.apache.commons.math3.ode.FieldODEStateAndDerivative; -import org.apache.commons.math3.util.MathArrays; /** * This class implements a step interpolator for second order @@ -54,17 +53,13 @@ class MidpointFieldStepInterpolator<T extends RealFieldElement<T>> /** Simple constructor. * @param rkIntegrator integrator being used - * @param y reference to the integrator array holding the state at - * the end of the step - * @param yDotArray reference to the integrator array holding all the - * intermediate slopes * @param forward integration direction indicator * @param mapper equations mapper for the all equations */ MidpointFieldStepInterpolator(final AbstractFieldIntegrator<T> rkIntegrator, - final T[] y, final T[][] yDotArray, final boolean forward, + final boolean forward, final FieldEquationsMapper<T> mapper) { - super(rkIntegrator, y, yDotArray, forward, mapper); + super(rkIntegrator, forward, mapper); } /** Copy constructor. @@ -84,37 +79,30 @@ class MidpointFieldStepInterpolator<T extends RealFieldElement<T>> /** {@inheritDoc} */ + @SuppressWarnings("unchecked") @Override protected FieldODEStateAndDerivative<T> computeInterpolatedStateAndDerivatives(final FieldEquationsMapper<T> mapper, final T time, final T theta, final T oneMinusThetaH) { - final T coeffDot2 = theta.multiply(2); - final T coeffDot1 = time.getField().getOne().subtract(coeffDot2); - final T[] interpolatedState = MathArrays.buildArray(theta.getField(), previousState.length); - final T[] interpolatedDerivatives = MathArrays.buildArray(theta.getField(), previousState.length); + final T coeffDot2 = theta.multiply(2); + final T coeffDot1 = time.getField().getOne().subtract(coeffDot2); + final T[] interpolatedState; + final T[] interpolatedDerivatives; - if ((previousState != null) && (theta.getReal() <= 0.5)) { + if (getGlobalPreviousState() != null && theta.getReal() <= 0.5) { final T coeff1 = theta.multiply(oneMinusThetaH); final T coeff2 = theta.multiply(theta).multiply(h); - for (int i = 0; i < previousState.length; ++i) { - final T yDot1 = yDotK[0][i]; - final T yDot2 = yDotK[1][i]; - interpolatedState[i] = previousState[i].add(coeff1.multiply(yDot1)).add(coeff2.multiply(yDot2)); - interpolatedDerivatives[i] = coeffDot1.multiply(yDot1).add(coeffDot2.multiply(yDot2)); - } + interpolatedState = previousStateLinearCombination(coeff1, coeff2); + interpolatedDerivatives = derivativeLinearCombination(coeffDot1, coeffDot2); } else { final T coeff1 = oneMinusThetaH.multiply(theta); - final T coeff2 = oneMinusThetaH.multiply(theta.add(1)); - for (int i = 0; i < previousState.length; ++i) { - final T yDot1 = yDotK[0][i]; - final T yDot2 = yDotK[1][i]; - interpolatedState[i] = currentState[i].add(coeff1.multiply(yDot1)).subtract(coeff2.multiply(yDot2)); - interpolatedDerivatives[i] = coeffDot1.multiply(yDot1).add(coeffDot2.multiply(yDot2)); - } + final T coeff2 = oneMinusThetaH.multiply(theta.add(1)).negate(); + interpolatedState = currentStateLinearCombination(coeff1, coeff2); + interpolatedDerivatives = derivativeLinearCombination(coeffDot1, coeffDot2); } - return new FieldODEStateAndDerivative<T>(time, interpolatedState, yDotK[0]); + return new FieldODEStateAndDerivative<T>(time, interpolatedState, interpolatedDerivatives); } http://git-wip-us.apache.org/repos/asf/commons-math/blob/07e2b944/src/main/java/org/apache/commons/math3/ode/nonstiff/RungeKuttaFieldIntegrator.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/math3/ode/nonstiff/RungeKuttaFieldIntegrator.java b/src/main/java/org/apache/commons/math3/ode/nonstiff/RungeKuttaFieldIntegrator.java index 61750f6..a511ac8 100644 --- a/src/main/java/org/apache/commons/math3/ode/nonstiff/RungeKuttaFieldIntegrator.java +++ b/src/main/java/org/apache/commons/math3/ode/nonstiff/RungeKuttaFieldIntegrator.java @@ -112,18 +112,11 @@ public abstract class RungeKuttaFieldIntegrator<T extends RealFieldElement<T>> protected abstract T[] getB(); /** Create an interpolator. - * @param rkIntegrator integrator being used - * @param y reference to the integrator array holding the state at - * the end of the step - * @param yDotArray reference to the integrator array holding all the - * intermediate slopes * @param forward integration direction indicator * @param mapper equations mapper for the all equations * @return external weights for the high order method from Butcher array */ - protected abstract RungeKuttaFieldStepInterpolator<T> createInterpolator(AbstractFieldIntegrator<T> rkIntegrator, - T[] y, T[][] yDotArray, - boolean forward, + protected abstract RungeKuttaFieldStepInterpolator<T> createInterpolator(boolean forward, FieldEquationsMapper<T> mapper); /** {@inheritDoc} */ @@ -147,7 +140,7 @@ public abstract class RungeKuttaFieldIntegrator<T extends RealFieldElement<T>> // set up an interpolator sharing the integrator arrays final RungeKuttaFieldStepInterpolator<T> interpolator = - createInterpolator(this, y0, yDotK, forward, equations.getMapper()); + createInterpolator(forward, equations.getMapper()); interpolator.storeState(stepStart); // set up integration control objects @@ -172,6 +165,7 @@ public abstract class RungeKuttaFieldIntegrator<T extends RealFieldElement<T>> interpolator.shift(); // first stage + y = equations.getMapper().mapState(stepStart); yDotK[0] = equations.getMapper().mapDerivative(stepStart); // next stages @@ -202,6 +196,7 @@ public abstract class RungeKuttaFieldIntegrator<T extends RealFieldElement<T>> final FieldODEStateAndDerivative<T> stateTmp = new FieldODEStateAndDerivative<T>(stepEnd, yTmp, yDotTmp); // discrete events handling + interpolator.setSlopes(yDotK); interpolator.storeState(stateTmp); System.arraycopy(yTmp, 0, y, 0, y0.length); stepStart = acceptStep(interpolator, finalTime); http://git-wip-us.apache.org/repos/asf/commons-math/blob/07e2b944/src/main/java/org/apache/commons/math3/ode/nonstiff/RungeKuttaFieldStepInterpolator.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/math3/ode/nonstiff/RungeKuttaFieldStepInterpolator.java b/src/main/java/org/apache/commons/math3/ode/nonstiff/RungeKuttaFieldStepInterpolator.java index fcc0396..9a86d82 100644 --- a/src/main/java/org/apache/commons/math3/ode/nonstiff/RungeKuttaFieldStepInterpolator.java +++ b/src/main/java/org/apache/commons/math3/ode/nonstiff/RungeKuttaFieldStepInterpolator.java @@ -36,31 +36,23 @@ import org.apache.commons.math3.util.MathArrays; abstract class RungeKuttaFieldStepInterpolator<T extends RealFieldElement<T>> extends AbstractFieldStepInterpolator<T> { - /** Previous state. */ - protected T[] previousState; - - /** Slopes at the intermediate points */ - protected T[][] yDotK; - /** Reference to the integrator. */ protected AbstractFieldIntegrator<T> integrator; + /** Slopes at the intermediate points. */ + private T[][] yDotK; + /** Simple constructor. * @param rkIntegrator integrator being used - * @param y reference to the integrator array holding the state at - * the end of the step - * @param yDotArray reference to the integrator array holding all the - * intermediate slopes * @param forward integration direction indicator * @param mapper equations mapper for the all equations */ protected RungeKuttaFieldStepInterpolator(final AbstractFieldIntegrator<T> rkIntegrator, - final T[] y, final T[][] yDotArray, final boolean forward, + final boolean forward, final FieldEquationsMapper<T> mapper) { - super(y, forward, mapper); - this.previousState = null; - this.yDotK = yDotArray; - this.integrator = rkIntegrator; + super(forward, mapper); + this.yDotK = null; + this.integrator = rkIntegrator; } /** Copy constructor. @@ -84,18 +76,14 @@ abstract class RungeKuttaFieldStepInterpolator<T extends RealFieldElement<T>> super(interpolator); - if (interpolator.currentState != null) { - - previousState = interpolator.previousState.clone(); - + if (yDotK != null) { yDotK = MathArrays.buildArray(interpolator.integrator.getField(), - interpolator.yDotK.length, interpolator.yDotK[0].length); - for (int k = 0; k < interpolator.yDotK.length; ++k) { - System.arraycopy(interpolator.yDotK[k], 0, yDotK[k], 0, interpolator.yDotK[k].length); + interpolator.yDotK.length, -1); + for (int k = 0; k < yDotK.length; ++k) { + yDotK[k] = interpolator.yDotK[k].clone(); } } else { - previousState = null; yDotK = null; } @@ -105,11 +93,56 @@ abstract class RungeKuttaFieldStepInterpolator<T extends RealFieldElement<T>> } - /** {@inheritDoc} */ - @Override - public void shift() { - previousState = currentState.clone(); - super.shift(); + /** Store the slopes at the intermediate points. + * @param slopes slopes at the intermediate points + */ + void setSlopes(final T[][] slopes) { + this.yDotK = slopes.clone(); + } + + /** Compute a state by linear combination added to previous state. + * @param coefficients coefficients to apply to the method staged derivatives + * @return combined state + */ + @SafeVarargs + protected final T[] previousStateLinearCombination(final T ... coefficients) { + return combine(getPreviousState().getState(), + coefficients); + } + + /** Compute a state by linear combination added to current state. + * @param coefficients coefficients to apply to the method staged derivatives + * @return combined state + */ + @SuppressWarnings("unchecked") + protected T[] currentStateLinearCombination(final T ... coefficients) { + return combine(getCurrentState().getState(), + coefficients); + } + + /** Compute a state derivative by linear combination. + * @param coefficients coefficients to apply to the method staged derivatives + * @return combined state + */ + @SuppressWarnings("unchecked") + protected T[] derivativeLinearCombination(final T ... coefficients) { + return combine(MathArrays.buildArray(integrator.getField(), yDotK[0].length), + coefficients); + } + + /** Linearly combine arrays. + * @param a array to add to + * @param coefficients coefficients to apply to the method staged derivatives + * @return a itself, as a conveniency for fluent API + */ + @SuppressWarnings("unchecked") + private T[] combine(final T[] a, final T ... coefficients) { + for (int i = 0; i < a.length; ++i) { + for (int k = 0; k < coefficients.length; ++k) { + a[i] = a[i].add(coefficients[k].multiply(yDotK[k][i])); + } + } + return a; } } http://git-wip-us.apache.org/repos/asf/commons-math/blob/07e2b944/src/main/java/org/apache/commons/math3/ode/nonstiff/ThreeEighthesFieldIntegrator.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/math3/ode/nonstiff/ThreeEighthesFieldIntegrator.java b/src/main/java/org/apache/commons/math3/ode/nonstiff/ThreeEighthesFieldIntegrator.java index 6ba4b72..e0d5044 100644 --- a/src/main/java/org/apache/commons/math3/ode/nonstiff/ThreeEighthesFieldIntegrator.java +++ b/src/main/java/org/apache/commons/math3/ode/nonstiff/ThreeEighthesFieldIntegrator.java @@ -19,7 +19,6 @@ package org.apache.commons.math3.ode.nonstiff; import org.apache.commons.math3.Field; import org.apache.commons.math3.RealFieldElement; -import org.apache.commons.math3.ode.AbstractFieldIntegrator; import org.apache.commons.math3.ode.FieldEquationsMapper; import org.apache.commons.math3.util.MathArrays; @@ -100,10 +99,8 @@ public class ThreeEighthesFieldIntegrator<T extends RealFieldElement<T>> /** {@inheritDoc} */ @Override protected ThreeEighthesFieldStepInterpolator<T> - createInterpolator(final AbstractFieldIntegrator<T> rkIntegrator, final T[] y, - final T[][] yDotArray, final boolean forward, - final FieldEquationsMapper<T> mapper) { - return new ThreeEighthesFieldStepInterpolator<T>(rkIntegrator, y, yDotArray, forward, mapper); + createInterpolator(final boolean forward, final FieldEquationsMapper<T> mapper) { + return new ThreeEighthesFieldStepInterpolator<T>(this, forward, mapper); } } http://git-wip-us.apache.org/repos/asf/commons-math/blob/07e2b944/src/main/java/org/apache/commons/math3/ode/nonstiff/ThreeEighthesFieldStepInterpolator.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/math3/ode/nonstiff/ThreeEighthesFieldStepInterpolator.java b/src/main/java/org/apache/commons/math3/ode/nonstiff/ThreeEighthesFieldStepInterpolator.java index 3de88f6..39cdc1c 100644 --- a/src/main/java/org/apache/commons/math3/ode/nonstiff/ThreeEighthesFieldStepInterpolator.java +++ b/src/main/java/org/apache/commons/math3/ode/nonstiff/ThreeEighthesFieldStepInterpolator.java @@ -21,7 +21,6 @@ import org.apache.commons.math3.RealFieldElement; import org.apache.commons.math3.ode.AbstractFieldIntegrator; import org.apache.commons.math3.ode.FieldEquationsMapper; import org.apache.commons.math3.ode.FieldODEStateAndDerivative; -import org.apache.commons.math3.util.MathArrays; /** * This class implements a step interpolator for the 3/8 fourth @@ -64,17 +63,13 @@ class ThreeEighthesFieldStepInterpolator<T extends RealFieldElement<T>> /** Simple constructor. * @param rkIntegrator integrator being used - * @param y reference to the integrator array holding the state at - * the end of the step - * @param yDotArray reference to the integrator array holding all the - * intermediate slopes * @param forward integration direction indicator * @param mapper equations mapper for the all equations */ ThreeEighthesFieldStepInterpolator(final AbstractFieldIntegrator<T> rkIntegrator, - final T[] y, final T[][] yDotArray, final boolean forward, + final boolean forward, final FieldEquationsMapper<T> mapper) { - super(rkIntegrator, y, yDotArray, forward, mapper); + super(rkIntegrator, forward, mapper); } /** Copy constructor. @@ -94,6 +89,7 @@ class ThreeEighthesFieldStepInterpolator<T extends RealFieldElement<T>> /** {@inheritDoc} */ + @SuppressWarnings("unchecked") @Override protected FieldODEStateAndDerivative<T> computeInterpolatedStateAndDerivatives(final FieldEquationsMapper<T> mapper, final T time, final T theta, @@ -103,51 +99,31 @@ class ThreeEighthesFieldStepInterpolator<T extends RealFieldElement<T>> final T coeffDot1 = coeffDot3.multiply(theta.multiply(4).subtract(5)).add(1); final T coeffDot2 = coeffDot3.multiply(theta.multiply(-6).add(5)); final T coeffDot4 = coeffDot3.multiply(theta.multiply(2).subtract(1)); - final T[] interpolatedState = MathArrays.buildArray(theta.getField(), previousState.length); - final T[] interpolatedDerivatives = MathArrays.buildArray(theta.getField(), previousState.length); + final T[] interpolatedState; + final T[] interpolatedDerivatives; - if ((previousState != null) && (theta.getReal() <= 0.5)) { + if (getGlobalPreviousState() != null && theta.getReal() <= 0.5) { final T s = theta.multiply(h).divide(8); final T fourTheta2 = theta.multiply(theta).multiply(4); final T coeff1 = s.multiply(fourTheta2.multiply(2).subtract(theta.multiply(15)).add(8)); final T coeff2 = s.multiply(theta.multiply(5).subtract(fourTheta2)).multiply(3); final T coeff3 = s.multiply(theta).multiply(3); final T coeff4 = s.multiply(fourTheta2.subtract(theta.multiply(3))); - for (int i = 0; i < interpolatedState.length; ++i) { - final T yDot1 = yDotK[0][i]; - final T yDot2 = yDotK[1][i]; - final T yDot3 = yDotK[2][i]; - final T yDot4 = yDotK[3][i]; - interpolatedState[i] = previousState[i]. - add(coeff1.multiply(yDot1)).add(coeff2.multiply(yDot2)). - add(coeff3.multiply(yDot3)).add(coeff4.multiply(yDot4)); - interpolatedDerivatives[i] = coeffDot1.multiply(yDot1).add(coeffDot2.multiply(yDot2)). - add(coeffDot3.multiply(yDot3)).add(coeffDot4.multiply(yDot4)); - - } + interpolatedState = previousStateLinearCombination(coeff1, coeff2, coeff3, coeff4); + interpolatedDerivatives = derivativeLinearCombination(coeffDot1, coeffDot2, coeffDot3, coeffDot4); } else { - final T s = oneMinusThetaH.divide(8); + final T s = oneMinusThetaH.divide(-8); final T fourTheta2 = theta.multiply(theta).multiply(4); final T thetaPlus1 = theta.add(1); final T coeff1 = s.multiply(fourTheta2.multiply(2).subtract(theta.multiply(7)).add(1)); final T coeff2 = s.multiply(thetaPlus1.subtract(fourTheta2)).multiply(3); final T coeff3 = s.multiply(thetaPlus1).multiply(3); final T coeff4 = s.multiply(thetaPlus1.add(fourTheta2)); - for (int i = 0; i < interpolatedState.length; ++i) { - final T yDot1 = yDotK[0][i]; - final T yDot2 = yDotK[1][i]; - final T yDot3 = yDotK[2][i]; - final T yDot4 = yDotK[3][i]; - interpolatedState[i] = currentState[i]. - subtract(coeff1.multiply(yDot1)).subtract(coeff2.multiply(yDot2)). - subtract(coeff3.multiply(yDot3)).subtract(coeff4.multiply(yDot4)); - interpolatedDerivatives[i] = coeffDot1.multiply(yDot1).add(coeffDot2.multiply(yDot2)). - add(coeffDot3.multiply(yDot3)).add(coeffDot4.multiply(yDot4)); - - } + interpolatedState = currentStateLinearCombination(coeff1, coeff2, coeff3, coeff4); + interpolatedDerivatives = derivativeLinearCombination(coeffDot1, coeffDot2, coeffDot3, coeffDot4); } - return new FieldODEStateAndDerivative<T>(time, interpolatedState, yDotK[0]); + return new FieldODEStateAndDerivative<T>(time, interpolatedState, interpolatedDerivatives); } http://git-wip-us.apache.org/repos/asf/commons-math/blob/07e2b944/src/main/java/org/apache/commons/math3/ode/sampling/AbstractFieldStepInterpolator.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/math3/ode/sampling/AbstractFieldStepInterpolator.java b/src/main/java/org/apache/commons/math3/ode/sampling/AbstractFieldStepInterpolator.java index b450a77..e9d6f29 100644 --- a/src/main/java/org/apache/commons/math3/ode/sampling/AbstractFieldStepInterpolator.java +++ b/src/main/java/org/apache/commons/math3/ode/sampling/AbstractFieldStepInterpolator.java @@ -43,9 +43,6 @@ public abstract class AbstractFieldStepInterpolator<T extends RealFieldElement<T /** Current time step. */ protected T h; - /** Current state. */ - protected T[] currentState; - /** Global previous state. */ private FieldODEStateAndDerivative<T> globalPreviousState; @@ -68,18 +65,16 @@ public abstract class AbstractFieldStepInterpolator<T extends RealFieldElement<T private FieldEquationsMapper<T> mapper; /** Simple constructor. - * @param y reference to the integrator array holding the state at the end of the step * @param isForward integration direction indicator * @param equationsMapper mapper for ODE equations primary and secondary components */ - protected AbstractFieldStepInterpolator(final T[] y, final boolean isForward, + protected AbstractFieldStepInterpolator(final boolean isForward, final FieldEquationsMapper<T> equationsMapper) { globalPreviousState = null; globalCurrentState = null; softPreviousState = null; softCurrentState = null; h = null; - currentState = y; finalized = false; this.forward = isForward; this.mapper = equationsMapper; @@ -109,17 +104,9 @@ public abstract class AbstractFieldStepInterpolator<T extends RealFieldElement<T softPreviousState = interpolator.softPreviousState; softCurrentState = interpolator.softCurrentState; h = interpolator.h; - - if (interpolator.currentState == null) { - currentState = null; - mapper = null; - } else { - currentState = interpolator.currentState.clone(); - } - - finalized = interpolator.finalized; - forward = interpolator.forward; - mapper = interpolator.mapper; + finalized = interpolator.finalized; + forward = interpolator.forward; + mapper = interpolator.mapper; } http://git-wip-us.apache.org/repos/asf/commons-math/blob/07e2b944/src/test/java/org/apache/commons/math3/ode/TestFieldProblem1.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/commons/math3/ode/TestFieldProblem1.java b/src/test/java/org/apache/commons/math3/ode/TestFieldProblem1.java index f79fad0..278276b 100644 --- a/src/test/java/org/apache/commons/math3/ode/TestFieldProblem1.java +++ b/src/test/java/org/apache/commons/math3/ode/TestFieldProblem1.java @@ -66,9 +66,10 @@ public class TestFieldProblem1<T extends RealFieldElement<T>> @Override public T[] computeTheoreticalState(T t) { - final T[] y0 = getInitialState(); + final FieldODEState<T> s0 = getInitialState(); + final T[] y0 = s0.getState(); final T[] y = MathArrays.buildArray(getField(), getDimension()); - T c = getInitialTime().subtract(t).exp(); + T c = s0.getTime().subtract(t).exp(); for (int i = 0; i < getDimension(); ++i) { y[i] = c.multiply(y0[i]); } http://git-wip-us.apache.org/repos/asf/commons-math/blob/07e2b944/src/test/java/org/apache/commons/math3/ode/TestFieldProblem5.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/commons/math3/ode/TestFieldProblem5.java b/src/test/java/org/apache/commons/math3/ode/TestFieldProblem5.java index f84781a..80f0ea2 100644 --- a/src/test/java/org/apache/commons/math3/ode/TestFieldProblem5.java +++ b/src/test/java/org/apache/commons/math3/ode/TestFieldProblem5.java @@ -35,7 +35,7 @@ public class TestFieldProblem5<T extends RealFieldElement<T>> */ public TestFieldProblem5(Field<T> field) { super(field); - setFinalConditions(getInitialTime().multiply(2).subtract(getFinalTime())); + setFinalConditions(getInitialState().getTime().multiply(2).subtract(getFinalTime())); } } http://git-wip-us.apache.org/repos/asf/commons-math/blob/07e2b944/src/test/java/org/apache/commons/math3/ode/TestFieldProblemAbstract.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/commons/math3/ode/TestFieldProblemAbstract.java b/src/test/java/org/apache/commons/math3/ode/TestFieldProblemAbstract.java index 09a10d8..02ff65f 100644 --- a/src/test/java/org/apache/commons/math3/ode/TestFieldProblemAbstract.java +++ b/src/test/java/org/apache/commons/math3/ode/TestFieldProblemAbstract.java @@ -109,20 +109,12 @@ public abstract class TestFieldProblemAbstract<T extends RealFieldElement<T>> return n; } - /** - * Get the initial time. - * @return initial time - */ - public T getInitialTime() { - return t0; - } - - /** - * Get the initial state vector. - * @return initial state vector + /** + * Get the initial state. + * @return initial state */ - public T[] getInitialState() { - return y0; + public FieldODEState<T> getInitialState() { + return new FieldODEState<T>(t0, y0); } /** http://git-wip-us.apache.org/repos/asf/commons-math/blob/07e2b944/src/test/java/org/apache/commons/math3/ode/TestFieldProblemHandler.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/commons/math3/ode/TestFieldProblemHandler.java b/src/test/java/org/apache/commons/math3/ode/TestFieldProblemHandler.java index d4e20e6..101f4fa 100644 --- a/src/test/java/org/apache/commons/math3/ode/TestFieldProblemHandler.java +++ b/src/test/java/org/apache/commons/math3/ode/TestFieldProblemHandler.java @@ -74,7 +74,7 @@ public class TestFieldProblemHandler<T extends RealFieldElement<T>> public void handleStep(FieldStepInterpolator<T> interpolator, boolean isLast) throws MaxCountExceededException { T start = integrator.getCurrentStepStart().getTime(); - if (start.subtract(problem.getInitialTime()).divide(integrator.getCurrentSignedStepsize()).abs().getReal() > 0.001) { + if (start.subtract(problem.getInitialState().getTime()).divide(integrator.getCurrentSignedStepsize()).abs().getReal() > 0.001) { // multistep integrators do not handle the first steps themselves // so we have to make sure the integrator we look at has really started its work if (expectedStepStart != null) { http://git-wip-us.apache.org/repos/asf/commons-math/blob/07e2b944/src/test/java/org/apache/commons/math3/ode/nonstiff/EulerIntegratorTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/commons/math3/ode/nonstiff/EulerIntegratorTest.java b/src/test/java/org/apache/commons/math3/ode/nonstiff/EulerIntegratorTest.java index 54f0330..9ec73d2 100644 --- a/src/test/java/org/apache/commons/math3/ode/nonstiff/EulerIntegratorTest.java +++ b/src/test/java/org/apache/commons/math3/ode/nonstiff/EulerIntegratorTest.java @@ -58,8 +58,8 @@ public class EulerIntegratorTest { MaxCountExceededException, NoBracketingException { for (TestProblemAbstract pb : new TestProblemAbstract[] { - new TestProblem1(), new TestProblem2(), new TestProblem3(), - new TestProblem4(), new TestProblem5(), new TestProblem6() + //new TestProblem1(), new TestProblem2(), new TestProblem3(), + new TestProblem4()//, new TestProblem5(), new TestProblem6() }) { double previousValueError = Double.NaN; @@ -94,6 +94,7 @@ public class EulerIntegratorTest { } previousTimeError = timeError; + System.exit(1); } }