@Test
  public void firstDerivativeTest() {
    double a = 1.0;
    double b = 1.5;
    double c = -0.5;
    double[] x = new double[] {0., 2., 5.};
    int n = x.length;
    double[] y = new double[n];
    for (int i = 0; i < n; i++) {
      y[i] = a + b * x[i] + c * x[i] * x[i];
    }
    Interpolator1D interpolator = new NaturalCubicSplineInterpolator1D();
    Interpolator1DDataBundle db = interpolator.getDataBundle(x, y);
    Double grad = interpolator.firstDerivative(db, x[n - 1]);
    Function1D<Double, Double> func = interpolator.getFunction(db);
    ScalarFirstOrderDifferentiator diff = new ScalarFirstOrderDifferentiator();
    Function1D<Double, Boolean> domain =
        new Function1D<Double, Boolean>() {
          @Override
          public Boolean evaluate(Double x) {
            return x <= 5.0;
          }
        };
    Function1D<Double, Double> gradFunc = diff.differentiate(func, domain);

    assertEquals(gradFunc.evaluate(x[n - 1]), grad, 1e-8);
  }
 @Override
 public double firstDerivative(final Interpolator1DDataBundle data, final Double value) {
   return _transform.inverseTransformGradient(_base.interpolate(data, value))
       * _base.firstDerivative(data, value);
 }
 @Override
 public double firstDerivative(
     Interpolator1DDataBundle data, Double value, Interpolator1D interpolator) {
   JodaBeanUtils.notNull(data, "data");
   return interpolator.firstDerivative(data, value);
 }