private <T extends RealFieldElement<T>> RungeKuttaFieldStepInterpolator<T> setUpInterpolator(
      final Field<T> field,
      final FirstOrderFieldDifferentialEquations<T> eqn,
      final double t0,
      final double[] y0,
      final double t1) {

    // get the Butcher arrays from the field integrator
    FieldButcherArrayProvider<T> provider = createButcherArrayProvider(field);
    T[][] a = provider.getA();
    T[] b = provider.getB();
    T[] c = provider.getC();

    // store initial state
    T t = field.getZero().add(t0);
    T[] fieldY = MathArrays.buildArray(field, eqn.getDimension());
    T[][] fieldYDotK = MathArrays.buildArray(field, b.length, -1);
    for (int i = 0; i < y0.length; ++i) {
      fieldY[i] = field.getZero().add(y0[i]);
    }
    fieldYDotK[0] = eqn.computeDerivatives(t, fieldY);
    FieldODEStateAndDerivative<T> s0 = new FieldODEStateAndDerivative<T>(t, fieldY, fieldYDotK[0]);

    // perform one integration step, in order to get consistent derivatives
    T h = field.getZero().add(t1 - t0);
    for (int k = 0; k < a.length; ++k) {
      for (int i = 0; i < y0.length; ++i) {
        fieldY[i] = field.getZero().add(y0[i]);
        for (int s = 0; s <= k; ++s) {
          fieldY[i] = fieldY[i].add(h.multiply(a[k][s].multiply(fieldYDotK[s][i])));
        }
      }
      fieldYDotK[k + 1] = eqn.computeDerivatives(h.multiply(c[k]).add(t0), fieldY);
    }

    // store state at step end
    t = field.getZero().add(t1);
    for (int i = 0; i < y0.length; ++i) {
      fieldY[i] = field.getZero().add(y0[i]);
      for (int s = 0; s < b.length; ++s) {
        fieldY[i] = fieldY[i].add(h.multiply(b[s].multiply(fieldYDotK[s][i])));
      }
    }
    FieldODEStateAndDerivative<T> s1 =
        new FieldODEStateAndDerivative<T>(t, fieldY, eqn.computeDerivatives(t, fieldY));

    return createInterpolator(
        field, t1 > t0, fieldYDotK, s0, s1, s0, s1, new FieldExpandableODE<T>(eqn).getMapper());
  }
Example #2
0
  /**
   * Evaluate the value of the polynomial.
   *
   * @param tc date offset in Julian centuries
   * @return value of the polynomial
   */
  public T value(final T tc) {

    T p = tc.getField().getZero();
    for (int i = coefficients.length - 1; i >= 0; --i) {
      p = p.multiply(tc).add(coefficients[i]);
    }

    return p;
  }
Example #3
0
 // unchecked cast {@code (T)amount.with(MonetaryOperator)} is
 // safe, if the operator is implemented as specified by this JSR.
 @SuppressWarnings("unchecked")
 @Override
 public <T extends MonetaryAmount> T apply(T amount) {
   return (T) amount.multiply(permilValue);
 }