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 2015/12/09 17:16:43 UTC

[03/50] [abbrv] [math] Converted constants for Runge-Kutta integrators.

Converted constants for Runge-Kutta integrators.

Project: http://git-wip-us.apache.org/repos/asf/commons-math/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-math/commit/1aad8609
Tree: http://git-wip-us.apache.org/repos/asf/commons-math/tree/1aad8609
Diff: http://git-wip-us.apache.org/repos/asf/commons-math/diff/1aad8609

Branch: refs/heads/MATH_3_X
Commit: 1aad86095974090468626197a1ed2fd11b4ad025
Parents: 449e071
Author: Luc Maisonobe <lu...@apache.org>
Authored: Sun Nov 29 18:08:23 2015 +0100
Committer: Luc Maisonobe <lu...@apache.org>
Committed: Sun Nov 29 18:08:23 2015 +0100

----------------------------------------------------------------------
 .../ClassicalRungeKuttaFieldIntegrator.java     | 69 ++++++++++----
 .../ode/nonstiff/EulerFieldIntegrator.java      | 47 +++++++---
 .../math3/ode/nonstiff/GillFieldIntegrator.java | 79 ++++++++++++----
 .../ode/nonstiff/LutherFieldIntegrator.java     | 99 +++++++++++++++-----
 .../ode/nonstiff/MidpointFieldIntegrator.java   | 54 +++++++----
 .../nonstiff/ThreeEighthesFieldIntegrator.java  | 68 ++++++++++----
 6 files changed, 307 insertions(+), 109 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-math/blob/1aad8609/src/main/java/org/apache/commons/math3/ode/nonstiff/ClassicalRungeKuttaFieldIntegrator.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/math3/ode/nonstiff/ClassicalRungeKuttaFieldIntegrator.java b/src/main/java/org/apache/commons/math3/ode/nonstiff/ClassicalRungeKuttaFieldIntegrator.java
index d174bb2..eab1bbf 100644
--- a/src/main/java/org/apache/commons/math3/ode/nonstiff/ClassicalRungeKuttaFieldIntegrator.java
+++ b/src/main/java/org/apache/commons/math3/ode/nonstiff/ClassicalRungeKuttaFieldIntegrator.java
@@ -19,6 +19,9 @@ 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;
 
 /**
  * This class implements the classical fourth order Runge-Kutta
@@ -49,31 +52,59 @@ import org.apache.commons.math3.RealFieldElement;
 public class ClassicalRungeKuttaFieldIntegrator<T extends RealFieldElement<T>>
     extends RungeKuttaFieldIntegrator<T> {
 
-    /** Time steps Butcher array. */
-    private static final double[] STATIC_C = {
-                                              1.0 / 2.0, 1.0 / 2.0, 1.0
-    };
-
-    /** Internal weights Butcher array. */
-    private static final double[][] STATIC_A = {
-                                                { 1.0 / 2.0 },
-                                                { 0.0, 1.0 / 2.0 },
-                                                { 0.0, 0.0, 1.0 }
-    };
-
-    /** Propagation weights Butcher array. */
-    private static final double[] STATIC_B = {
-                                              1.0 / 6.0, 1.0 / 3.0, 1.0 / 3.0, 1.0 / 6.0
-    };
-
     /** Simple constructor.
      * Build a fourth-order Runge-Kutta integrator with the given step.
      * @param field field to which the time and state vector elements belong
      * @param step integration step
      */
     public ClassicalRungeKuttaFieldIntegrator(final Field<T> field, final T step) {
-        super(field, "classical Runge-Kutta", STATIC_C, STATIC_A, STATIC_B,
-              new ClassicalRungeKuttaFieldStepInterpolator<T>(), step);
+        super(field, "classical Runge-Kutta", step);
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected T[] getC() {
+        final T[] c = MathArrays.buildArray(getField(), 3);
+        c[0] = getField().getOne().multiply(0.5);
+        c[1] = c[0];
+        c[2] = getField().getOne();
+        return c;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected T[][] getA() {
+        final T[][] a = MathArrays.buildArray(getField(), 3, -1);
+        for (int i = 0; i < a.length; ++i) {
+            a[i] = MathArrays.buildArray(getField(), i + 1);
+        }
+        a[0][0] = fraction(1, 2);
+        a[1][0] = getField().getZero();
+        a[1][1] = a[0][0];
+        a[2][0] = getField().getZero();
+        a[2][1] = getField().getZero();
+        a[2][2] = getField().getOne();
+        return a;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected T[] getB() {
+        final T[] b = MathArrays.buildArray(getField(), 4);
+        b[0] = fraction(1, 6);
+        b[1] = fraction(1, 3);
+        b[2] = b[1];
+        b[3] = b[0];
+        return b;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected ClassicalRungeKuttaFieldStepInterpolator<T>
+        createInterpolator(final AbstractFieldIntegrator<T> rkIntegrator, final T[] y,
+                           final T[][] yDotArray, final boolean forward,
+                           final FieldEquationsMapper<T> mapper) {
+        return new ClassicalRungeKuttaFieldStepInterpolator<T>(rkIntegrator, y, yDotArray, forward, mapper);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/commons-math/blob/1aad8609/src/main/java/org/apache/commons/math3/ode/nonstiff/EulerFieldIntegrator.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/math3/ode/nonstiff/EulerFieldIntegrator.java b/src/main/java/org/apache/commons/math3/ode/nonstiff/EulerFieldIntegrator.java
index c591e3e..7fb32a1 100644
--- a/src/main/java/org/apache/commons/math3/ode/nonstiff/EulerFieldIntegrator.java
+++ b/src/main/java/org/apache/commons/math3/ode/nonstiff/EulerFieldIntegrator.java
@@ -19,6 +19,9 @@ 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;
 
 /**
  * This class implements a simple Euler integrator for Ordinary
@@ -51,26 +54,42 @@ import org.apache.commons.math3.RealFieldElement;
 
 public class EulerFieldIntegrator<T extends RealFieldElement<T>> extends RungeKuttaFieldIntegrator<T> {
 
-    /** Time steps Butcher array. */
-    private static final double[] STATIC_C = {
-    };
-
-    /** Internal weights Butcher array. */
-    private static final double[][] STATIC_A = {
-    };
-
-    /** Propagation weights Butcher array. */
-    private static final double[] STATIC_B = {
-                                              1.0
-    };
-
     /** Simple constructor.
      * Build an Euler integrator with the given step.
      * @param field field to which the time and state vector elements belong
      * @param step integration step
      */
     public EulerFieldIntegrator(final Field<T> field, final T step) {
-        super(field, "Euler", STATIC_C, STATIC_A, STATIC_B, new EulerFieldStepInterpolator<T>(), step);
+        super(field, "Euler", step);
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected T[] getC() {
+        return MathArrays.buildArray(getField(), 0);
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected T[][] getA() {
+        return MathArrays.buildArray(getField(), 0, 0);
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected T[] getB() {
+        final T[] b = MathArrays.buildArray(getField(), 1);
+        b[0] = getField().getOne();
+        return b;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected EulerFieldStepInterpolator<T>
+        createInterpolator(final AbstractFieldIntegrator<T> rkIntegrator, final T[] y,
+                           final T[][] yDotArray, final boolean forward,
+                           final FieldEquationsMapper<T> mapper) {
+        return new EulerFieldStepInterpolator<T>(rkIntegrator, y, yDotArray, forward, mapper);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/commons-math/blob/1aad8609/src/main/java/org/apache/commons/math3/ode/nonstiff/GillFieldIntegrator.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/math3/ode/nonstiff/GillFieldIntegrator.java b/src/main/java/org/apache/commons/math3/ode/nonstiff/GillFieldIntegrator.java
index 21cd5d6..d8460c2 100644
--- a/src/main/java/org/apache/commons/math3/ode/nonstiff/GillFieldIntegrator.java
+++ b/src/main/java/org/apache/commons/math3/ode/nonstiff/GillFieldIntegrator.java
@@ -19,7 +19,9 @@ package org.apache.commons.math3.ode.nonstiff;
 
 import org.apache.commons.math3.Field;
 import org.apache.commons.math3.RealFieldElement;
-import org.apache.commons.math3.util.FastMath;
+import org.apache.commons.math3.ode.AbstractFieldIntegrator;
+import org.apache.commons.math3.ode.FieldEquationsMapper;
+import org.apache.commons.math3.util.MathArrays;
 
 
 /**
@@ -50,30 +52,69 @@ import org.apache.commons.math3.util.FastMath;
 public class GillFieldIntegrator<T extends RealFieldElement<T>>
     extends RungeKuttaFieldIntegrator<T> {
 
-    /** Time steps Butcher array. */
-    private static final double[] STATIC_C = {
-                                              1.0 / 2.0, 1.0 / 2.0, 1.0
-    };
-
-    /** Internal weights Butcher array. */
-    private static final double[][] STATIC_A = {
-                                                { 1.0 / 2.0 },
-                                                { (FastMath.sqrt(2.0) - 1.0) / 2.0, (2.0 - FastMath.sqrt(2.0)) / 2.0 },
-                                                { 0.0, -FastMath.sqrt(2.0) / 2.0, (2.0 + FastMath.sqrt(2.0)) / 2.0 }
-    };
-
-    /** Propagation weights Butcher array. */
-    private static final double[] STATIC_B = {
-                                              1.0 / 6.0, (2.0 - FastMath.sqrt(2.0)) / 6.0, (2.0 + FastMath.sqrt(2.0)) / 6.0, 1.0 / 6.0
-    };
-
     /** Simple constructor.
      * Build a fourth-order Gill integrator with the given step.
      * @param field field to which the time and state vector elements belong
      * @param step integration step
      */
     public GillFieldIntegrator(final Field<T> field, final T step) {
-        super(field, "Gill", STATIC_C, STATIC_A, STATIC_B, new GillFieldStepInterpolator<T>(), step);
+        super(field, "Gill", step);
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected T[] getC() {
+        final T[] c = MathArrays.buildArray(getField(), 3);
+        c[0] = fraction(1, 2);
+        c[1] = c[0];
+        c[2] = getField().getOne();
+        return c;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected T[][] getA() {
+
+        final T two     = getField().getOne().multiply(2);
+        final T sqrtTwo = two.sqrt();
+
+        final T[][] a = MathArrays.buildArray(getField(), 3, -1);
+        for (int i = 0; i < a.length; ++i) {
+            a[i] = MathArrays.buildArray(getField(), i + 1);
+        }
+        a[0][0] = fraction(1, 2);
+        a[1][0] = sqrtTwo.subtract(1).multiply(0.5);
+        a[1][1] = sqrtTwo.subtract(2).multiply(-0.5);
+        a[2][0] = getField().getZero();
+        a[2][1] = sqrtTwo.multiply(-0.5);
+        a[2][2] = sqrtTwo.add(2).multiply(0.5);
+        return a;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected T[] getB() {
+
+        final T two     = getField().getOne().multiply(2);
+        final T sqrtTwo = two.sqrt();
+
+        final T[] b = MathArrays.buildArray(getField(), 4);
+        b[0] = fraction(1, 6);
+        b[1] = two.subtract(sqrtTwo).divide(6);
+        b[2] = two.add(sqrtTwo).divide(6);
+        b[3] = b[0];
+
+        return b;
+
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected GillFieldStepInterpolator<T>
+        createInterpolator(final AbstractFieldIntegrator<T> rkIntegrator, final T[] y,
+                           final T[][] yDotArray, final boolean forward,
+                           final FieldEquationsMapper<T> mapper) {
+        return new GillFieldStepInterpolator<T>(rkIntegrator, y, yDotArray, forward, mapper);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/commons-math/blob/1aad8609/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 26156d1..363e042 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,9 @@ package org.apache.commons.math3.ode.nonstiff;
 
 import org.apache.commons.math3.Field;
 import org.apache.commons.math3.RealFieldElement;
-import org.apache.commons.math3.util.FastMath;
+import org.apache.commons.math3.ode.AbstractFieldIntegrator;
+import org.apache.commons.math3.ode.FieldEquationsMapper;
+import org.apache.commons.math3.util.MathArrays;
 
 
 /**
@@ -60,27 +62,7 @@ public class LutherFieldIntegrator<T extends RealFieldElement<T>>
     extends RungeKuttaFieldIntegrator<T> {
 
     /** Square root. */
-    private static final double Q = FastMath.sqrt(21);
-
-    /** Time steps Butcher array. */
-    private static final double[] STATIC_C = {
-        1.0, 1.0 / 2.0, 2.0 / 3.0, (7.0 - Q) / 14.0, (7.0 + Q) / 14.0, 1.0
-    };
-
-    /** Internal weights Butcher array. */
-    private static final double[][] STATIC_A = {
-        {                      1.0        },
-        {                   3.0 /   8.0,                  1.0 /   8.0  },
-        {                   8.0 /   27.0,                 2.0 /   27.0,                  8.0 /   27.0  },
-        { (  -21.0 +   9.0 * Q) /  392.0, ( -56.0 +  8.0 * Q) /  392.0, ( 336.0 -  48.0 * Q) /  392.0, (-63.0 +   3.0 * Q) /  392.0 },
-        { (-1155.0 - 255.0 * Q) / 1960.0, (-280.0 - 40.0 * Q) / 1960.0, (   0.0 - 320.0 * Q) / 1960.0, ( 63.0 + 363.0 * Q) / 1960.0,   (2352.0 + 392.0 * Q) / 1960.0 },
-        { (  330.0 + 105.0 * Q) /  180.0, ( 120.0 +  0.0 * Q) /  180.0, (-200.0 + 280.0 * Q) /  180.0, (126.0 - 189.0 * Q) /  180.0,   (-686.0 - 126.0 * Q) /  180.0,   (490.0 -  70.0 * Q) / 180.0 }
-    };
-
-    /** Propagation weights Butcher array. */
-    private static final double[] STATIC_B = {
-        1.0 / 20.0, 0, 16.0 / 45.0, 0, 49.0 / 180.0, 49.0 / 180.0, 1.0 / 20.0
-    };
+    private final T q;
 
     /** Simple constructor.
      * Build a fourth-order Luther integrator with the given step.
@@ -88,7 +70,78 @@ public class LutherFieldIntegrator<T extends RealFieldElement<T>>
      * @param step integration step
      */
     public LutherFieldIntegrator(final Field<T> field, final T step) {
-        super(field, "Luther", STATIC_C, STATIC_A, STATIC_B, new LutherFieldStepInterpolator<T>(), step);
+        super(field, "Luther", step);
+        q = getField().getOne().multiply(21).sqrt();
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected T[] getC() {
+        final T[] c = MathArrays.buildArray(getField(), 6);
+        c[0] = getField().getOne();
+        c[1] = fraction(1, 2);
+        c[2] = fraction(2, 3);
+        c[3] = q.subtract(7).divide(-14);
+        c[4] = q.add(7).divide(14);
+        c[5] = getField().getOne();
+        return c;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected T[][] getA() {
+        final T[][] a = MathArrays.buildArray(getField(), 6, -1);
+        for (int i = 0; i < a.length; ++i) {
+            a[i] = MathArrays.buildArray(getField(), i + 1);
+        }
+        a[0][0] = getField().getOne();
+        a[1][0] = fraction(3,  8);
+        a[1][1] = fraction(1,  8);
+        a[2][0] = fraction(8, 27);
+        a[2][1] = fraction(2, 27);
+        a[2][2] = fraction(8, 27);
+        a[3][0] = q.multiply(  9).subtract( 21).divide( 392);
+        a[3][1] = q.multiply(  8).subtract( 56).divide( 392);
+        a[3][2] = q.multiply( 48).subtract(336).divide(-392);
+        a[3][3] = q.multiply(  3).subtract( 63).divide( 392);
+        a[4][0] = q.multiply(255).add(1155).divide(-1960);
+        a[4][1] = q.multiply( 40).add( 280).divide(-1960);
+        a[4][2] = q.multiply(20)           .divide(-1960);
+        a[4][3] = q.multiply(363).add(  63).divide( 1960);
+        a[4][4] = q.multiply(392).add(2352).divide( 1960);
+        a[5][0] = q.multiply(105).add( 330).divide( 180);
+        a[5][1] = fraction(120, 180);
+        a[5][2] = q.multiply(280).add(-200).divide( 180);
+        a[5][3] = q.multiply(189).add(-126).divide(-180);
+        a[5][4] = q.multiply(126).add( 686).divide(-180);
+        a[5][5] = q.multiply( 70).add(-490).divide(-180);
+        return a;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected T[] getB() {
+
+        final T[] b = MathArrays.buildArray(getField(), 7);
+        b[0] = fraction( 1,  20);
+        b[1] = getField().getZero();
+        b[2] = fraction(16,  45);
+        b[3] = getField().getZero();
+        b[4] = fraction(49, 180);
+        b[5] = b[4];
+        b[6] = b[0];
+
+        return b;
+
+    }
+
+    /** {@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);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/commons-math/blob/1aad8609/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 dd9f0bf..f74fdba 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,6 +19,9 @@ 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;
 
 /**
  * This class implements a second order Runge-Kutta integrator for
@@ -46,28 +49,47 @@ import org.apache.commons.math3.RealFieldElement;
 
 public class MidpointFieldIntegrator<T extends RealFieldElement<T>> extends RungeKuttaFieldIntegrator<T> {
 
-    /** Time steps Butcher array. */
-    private static final double[] STATIC_C = {
-                                              1.0 / 2.0
-    };
-
-    /** Internal weights Butcher array. */
-    private static final double[][] STATIC_A = {
-                                                { 1.0 / 2.0 }
-    };
-
-    /** Propagation weights Butcher array. */
-    private static final double[] STATIC_B = {
-                                              0.0, 1.0
-    };
-
     /** Simple constructor.
      * Build a midpoint integrator with the given step.
      * @param field field to which the time and state vector elements belong
      * @param step integration step
      */
     public MidpointFieldIntegrator(final Field<T> field, final T step) {
-        super(field, "midpoint", STATIC_C, STATIC_A, STATIC_B, new MidpointFieldStepInterpolator<T>(), step);
+        super(field, "midpoint", step);
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected T[] getC() {
+        final T[] c = MathArrays.buildArray(getField(), 1);
+        c[0] = getField().getOne().multiply(0.5);
+        return c;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected T[][] getA() {
+        final T[][] a = MathArrays.buildArray(getField(), 1, 1);
+        a[0][0] = fraction(1, 2);
+        return a;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected T[] getB() {
+        final T[] b = MathArrays.buildArray(getField(), 2);
+        b[0] = getField().getZero();
+        b[1] = getField().getOne();
+        return b;
+    }
+
+    /** {@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);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/commons-math/blob/1aad8609/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 37f9f95..6ba4b72 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,6 +19,9 @@ 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;
 
 /**
  * This class implements the 3/8 fourth order Runge-Kutta
@@ -48,30 +51,59 @@ import org.apache.commons.math3.RealFieldElement;
 public class ThreeEighthesFieldIntegrator<T extends RealFieldElement<T>>
     extends RungeKuttaFieldIntegrator<T> {
 
-    /** Time steps Butcher array. */
-    private static final double[] STATIC_C = {
-                                              1.0 / 3.0, 2.0 / 3.0, 1.0
-    };
-
-    /** Internal weights Butcher array. */
-    private static final double[][] STATIC_A = {
-                                                {  1.0 / 3.0 },
-                                                { -1.0 / 3.0, 1.0 },
-                                                {  1.0, -1.0, 1.0 }
-    };
-
-    /** Propagation weights Butcher array. */
-    private static final double[] STATIC_B = {
-                                              1.0 / 8.0, 3.0 / 8.0, 3.0 / 8.0, 1.0 / 8.0
-    };
-
     /** Simple constructor.
      * Build a 3/8 integrator with the given step.
      * @param field field to which the time and state vector elements belong
      * @param step integration step
      */
     public ThreeEighthesFieldIntegrator(final Field<T> field, final T step) {
-        super(field, "3/8", STATIC_C, STATIC_A, STATIC_B, new ThreeEighthesFieldStepInterpolator<T>(), step);
+        super(field, "3/8", step);
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected T[] getC() {
+        final T[] c = MathArrays.buildArray(getField(), 3);
+        c[0] = fraction(1, 3);
+        c[1] = c[0].add(c[0]);
+        c[2] = getField().getOne();
+        return c;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected T[][] getA() {
+        final T[][] a = MathArrays.buildArray(getField(), 3, -1);
+        for (int i = 0; i < a.length; ++i) {
+            a[i] = MathArrays.buildArray(getField(), i + 1);
+        }
+        a[0][0] = fraction(1, 3);
+        a[1][0] = a[0][0].negate();
+        a[1][1] = getField().getOne();
+        a[2][0] = getField().getOne();
+        a[2][1] = getField().getOne().negate();
+        a[2][2] = getField().getOne();
+        return a;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected T[] getB() {
+        final T[] b = MathArrays.buildArray(getField(), 4);
+        b[0] = fraction(1, 8);
+        b[1] = fraction(3, 8);
+        b[2] = b[1];
+        b[3] = b[0];
+        return b;
+    }
+
+    /** {@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);
     }
 
 }