@Override
public PiecewisePolynomialResult interpolate(final double[] xValues, final double[] yValues) {
ArgChecker.notNull(xValues, "xValues");
ArgChecker.notNull(yValues, "yValues");
ArgChecker.isTrue(xValues.length == yValues.length, "xValues length = yValues length");
ArgChecker.isTrue(xValues.length > 1, "Data points should be more than 1");
final int nDataPts = xValues.length;
for (int i = 0; i < nDataPts; ++i) {
ArgChecker.isFalse(Double.isNaN(xValues[i]), "xData containing NaN");
ArgChecker.isFalse(Double.isInfinite(xValues[i]), "xData containing Infinity");
ArgChecker.isFalse(Double.isNaN(yValues[i]), "yData containing NaN");
ArgChecker.isFalse(Double.isInfinite(yValues[i]), "yData containing Infinity");
}
double[] xValuesSrt = Arrays.copyOf(xValues, nDataPts);
double[] yValuesSrt = Arrays.copyOf(yValues, nDataPts);
DoubleArrayMath.sortPairs(xValuesSrt, yValuesSrt);
for (int i = 1; i < nDataPts; ++i) {
ArgChecker.isFalse(xValuesSrt[i - 1] == xValuesSrt[i], "xValues should be distinct");
}
final DoubleMatrix coefMatrix = solve(xValuesSrt, yValuesSrt);
for (int i = 0; i < coefMatrix.rowCount(); ++i) {
for (int j = 0; j < coefMatrix.columnCount(); ++j) {
ArgChecker.isFalse(Double.isNaN(coefMatrix.get(i, j)), "Too large input");
ArgChecker.isFalse(Double.isInfinite(coefMatrix.get(i, j)), "Too large input");
}
}
return new PiecewisePolynomialResult(DoubleArray.copyOf(xValuesSrt), coefMatrix, coefMatrix.columnCount(), 1);
}