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()); }
/** * 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; }
// 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); }