private static double[] calculateSecondDerivative(
double[] xValues,
double[] yValues,
int dataSize,
double leftFirstDev,
double rightFirstDev,
boolean leftNatural,
boolean rightNatural) {
double[] deltaX = new double[dataSize - 1];
double[] deltaYOverDeltaX = new double[dataSize - 1];
double[] oneOverDeltaX = new double[dataSize - 1];
for (int i = 0; i < dataSize - 1; i++) {
deltaX[i] = xValues[i + 1] - xValues[i];
oneOverDeltaX[i] = 1.0 / deltaX[i];
deltaYOverDeltaX[i] = (yValues[i + 1] - yValues[i]) * oneOverDeltaX[i];
}
DoubleMatrix inverseTriDiag = getInverseTridiagonalMatrix(deltaX, leftNatural, rightNatural);
DoubleArray rhsVector = getRightVector(deltaYOverDeltaX, leftFirstDev, rightFirstDev, leftNatural, rightNatural);
return ((DoubleArray) OG_ALGEBRA.multiply(inverseTriDiag, rhsVector)).toArray();
}