private static RealPolynomialFunction1D quadraticFirstDerivative(double[] x, double[] y, int index) { double dx1 = x[index] - x[index - 1]; double dx2 = x[index + 1] - x[index]; double dy1 = y[index] - y[index - 1]; double dy2 = y[index + 1] - y[index]; double b = (dx1 * dy2 / dx2 + dx2 * dy1 / dx1) / (dx1 + dx2); double c = (dy2 / dx2 - dy1 / dx1) / (dx1 + dx2); return new RealPolynomialFunction1D(new double[] {b, 2. * c}); }
@Override public U apply(S x) { return ParameterizedFunction.this.evaluate(x, params); } };
/** * Produces a {@link VectorFunction} which builds a {@link ParameterizedCurve} from the input vector * (treated as curve parameters), then samples the curve at the smaplePoints, to produce the output vector. * * @param samplePoints the points where we sample the curve * @return a {@link ParameterizedCurveVectorFunction} */ @Override public VectorFunction from(double[] samplePoints) { return new ParameterizedCurveVectorFunction(samplePoints, _pCurve); }
@Override public double applyAsDouble(double x) { return DoubleFunction1D.this.applyAsDouble(x) / f.applyAsDouble(x); }
@Override public DoubleMatrix calculateJacobian(DoubleArray x) { Function<Double, DoubleArray> sense = _curve.getYParameterSensitivity(x); return DoubleMatrix.ofArrayObjects( getLengthOfRange(), getLengthOfDomain(), i -> sense.apply(_samplePoints[i])); }
/** * Returns a function that calculates the first derivative. * <p> * The method used is central finite difference, with $\epsilon = 10^{-5}$. * Implementing classes can override this method to return a function that * is the exact functional representation of the first derivative. * * @return a function that calculates the first derivative of this function */ public default DoubleFunction1D derivative() { return derivative(FiniteDifferenceType.CENTRAL, 1e-5); }
@Override public int getLengthOfDomain() { return _curve.getNumberOfParameters(); }
@Override public double applyAsDouble(double x) { return DoubleFunction1D.this.applyAsDouble(x) * f.applyAsDouble(x); }
private static RealPolynomialFunction1D quadratic(double[] x, double[] y, int index) { double a = y[index]; double dx1 = x[index] - x[index - 1]; double dx2 = x[index + 1] - x[index]; double dy1 = y[index] - y[index - 1]; double dy2 = y[index + 1] - y[index]; double b = (dx1 * dy2 / dx2 + dx2 * dy1 / dx1) / (dx1 + dx2); double c = (dy2 / dx2 - dy1 / dx1) / (dx1 + dx2); return new RealPolynomialFunction1D(new double[] {a, b, c}); }
@Override public U apply(T params) { return ParameterizedFunction.this.evaluate(x, params); } };
@Override public VectorFunction from(final double[] x) { final ParameterizedCurveVectorFunction vf = new ParameterizedCurveVectorFunction(x, curve); return vf; } };
@Override public double applyAsDouble(double x) { return DoubleFunction1D.this.applyAsDouble(x) * a; }
@Override public double applyAsDouble(double x) { return DoubleFunction1D.this.applyAsDouble(x) - f.applyAsDouble(x); }
@Override public double applyAsDouble(double x) { return (DoubleFunction1D.this.applyAsDouble(x + eps) - DoubleFunction1D.this.applyAsDouble(x - eps)) / 2 / eps; }
@Override public double applyAsDouble(double x) { return (DoubleFunction1D.this.applyAsDouble(x) - DoubleFunction1D.this.applyAsDouble(x - eps)) / eps; }
@Override public double applyAsDouble(double x) { return DoubleFunction1D.this.applyAsDouble(x) + f.applyAsDouble(x); }
@Override public double applyAsDouble(double x) { return DoubleFunction1D.this.applyAsDouble(x) + a; }
@Override public double applyAsDouble(double x) { return DoubleFunction1D.this.applyAsDouble(x) - a; }
@Override public double applyAsDouble(double x) { return (DoubleFunction1D.this.applyAsDouble(x + eps) - DoubleFunction1D.this.applyAsDouble(x)) / eps; }
@Override public double applyAsDouble(double x) { return DoubleFunction1D.this.applyAsDouble(x) / a; }