Example usage for org.apache.commons.math3.analysis.interpolation HermiteInterpolator getPolynomials

List of usage examples for org.apache.commons.math3.analysis.interpolation HermiteInterpolator getPolynomials

Introduction

In this page you can find the example usage for org.apache.commons.math3.analysis.interpolation HermiteInterpolator getPolynomials.

Prototype

public PolynomialFunction[] getPolynomials() throws NoDataException 

Source Link

Document

Compute the interpolation polynomials.

Usage

From source file:be.ugent.maf.cellmissy.analysis.singlecell.processing.impl.interpolation.TrackHermiteInterpolator.java

@Override
public InterpolatedTrack interpolateTrack(double[] time, double[] x, double[] y) {
    // create interpolators for X and Y
    HermiteInterpolator xHermite = new HermiteInterpolator();
    HermiteInterpolator yHermite = new HermiteInterpolator();
    int interpolationPoints = PropertiesConfigurationHolder.getInstance().getInt("numberOfInterpolationPoints");

    // create arrays to hold the interpolant time, the interpolated X and the interpolated Y
    double[] interpolantTime = new double[interpolationPoints];
    double[] interpolatedX = new double[interpolationPoints];
    double[] interpolatedY = new double[interpolationPoints];
    // the step used for the interpolation in both direction
    double interpolationStep = (time[time.length - 1] - time[0]) / interpolationPoints;

    // check for monotonicity
    boolean monotonic = MathArrays.isMonotonic(time, MathArrays.OrderDirection.INCREASING, false);
    // in case time is not monotonic, sort in place time, x and y coordinates
    if (!monotonic) {
        MathArrays.sortInPlace(time, x, y);
    }/*from   w  w  w. jav a 2 s  . com*/

    double[] internalPointsDerivativeX = internalPointsDerivative(time, x);
    double[] internalPointsDerivativeY = internalPointsDerivative(time, y);

    double[] endPointsDerivativeX = endPointsDerivative(time, x);
    double[] endPointsDerivativeY = endPointsDerivative(time, y);

    // call the interpolator and add sample points to it
    // we do add only the values, and not their derivatives
    for (int i = 0; i < time.length; i++) {
        if (i == 0) {
            xHermite.addSamplePoint(time[i], new double[] { x[i] }, new double[] { endPointsDerivativeX[0] });
            yHermite.addSamplePoint(time[i], new double[] { y[i] }, new double[] { endPointsDerivativeY[0] });
        } else if (i == time.length - 1) {
            xHermite.addSamplePoint(time[i], new double[] { x[i] }, new double[] { endPointsDerivativeX[1] });
            yHermite.addSamplePoint(time[i], new double[] { y[i] }, new double[] { endPointsDerivativeY[1] });
        } else {
            xHermite.addSamplePoint(time[i], new double[] { x[i] },
                    new double[] { internalPointsDerivativeX[i - 1] });
            yHermite.addSamplePoint(time[i], new double[] { y[i] },
                    new double[] { internalPointsDerivativeY[i - 1] });
        }
    }

    for (int i = 0; i < interpolationPoints; i++) {
        interpolantTime[i] = time[0] + (i * interpolationStep);
        interpolatedX[i] = xHermite.value(interpolantTime[i])[0];
        interpolatedY[i] = yHermite.value(interpolantTime[i])[0];
    }

    // get the polynomial functions in both directions
    PolynomialFunction polynomialFunctionX = xHermite.getPolynomials()[0];
    PolynomialFunction polynomialFunctionY = yHermite.getPolynomials()[0];

    return new InterpolatedTrack(interpolantTime, interpolatedX, interpolatedY, polynomialFunctionX,
            polynomialFunctionY);
}