+ * f(x, y, z) = 2 x - 3 y - 4 z + 5 + *

+ */ + @Test + public void testPlane() throws MathException { + double[] xval = new double[] {3, 4, 5, 6.5}; + double[] yval = new double[] {-4, -3, -1, 2, 2.5}; + double[] zval = new double[] {-12, -8, -5.5, -3, 0, 2.5}; + + // Function values + TrivariateRealFunction f = new TrivariateRealFunction() { + public double value(double x, double y, double z) { + return 2 * x - 3 * y - 4 * z + 5; + } + }; + + double[][][] fval = new double[xval.length][yval.length][zval.length]; + + for (int i = 0; i < xval.length; i++) { + for (int j = 0; j < yval.length; j++) { + for (int k = 0; k < zval.length; k++) { + fval[i][j][k] = f.value(xval[i], yval[j], zval[k]); + } + } + } + // Partial derivatives with respect to x + double[][][] dFdX = new double[xval.length][yval.length][zval.length]; + for (int i = 0; i < xval.length; i++) { + for (int j = 0; j < yval.length; j++) { + for (int k = 0; k < zval.length; k++) { + dFdX[i][j][k] = 2; + } + } + } + // Partial derivatives with respect to y + double[][][] dFdY = new double[xval.length][yval.length][zval.length]; + for (int i = 0; i < xval.length; i++) { + for (int j = 0; j < yval.length; j++) { + for (int k = 0; k < zval.length; k++) { + dFdY[i][j][k] = -3; + } + } + } + + // Partial derivatives with respect to z + double[][][] dFdZ = new double[xval.length][yval.length][zval.length]; + for (int i = 0; i < xval.length; i++) { + for (int j = 0; j < yval.length; j++) { + for (int k = 0; k < zval.length; k++) { + dFdZ[i][j][k] = -4; + } + } + } + // Partial cross-derivatives + double[][][] d2FdXdY = new double[xval.length][yval.length][zval.length]; + double[][][] d2FdXdZ = new double[xval.length][yval.length][zval.length]; + double[][][] d2FdYdZ = new double[xval.length][yval.length][zval.length]; + double[][][] d3FdXdYdZ = new double[xval.length][yval.length][zval.length]; + for (int i = 0; i < xval.length; i++) { + for (int j = 0; j < yval.length; j++) { + for (int k = 0; k < zval.length; k++) { + d2FdXdY[i][j][k] = 0; + d2FdXdZ[i][j][k] = 0; + d2FdYdZ[i][j][k] = 0; + d3FdXdYdZ[i][j][k] = 0; + } + } + } + + TrivariateRealFunction tcf = new TricubicSplineInterpolatingFunction(xval, yval, zval, + fval, dFdX, dFdY, dFdZ, + d2FdXdY, d2FdXdZ, d2FdYdZ, + d3FdXdYdZ); + double x, y, z; + double expected, result; + + x = 4; + y = -3; + z = 0; + expected = f.value(x, y, z); + result = tcf.value(x, y, z); + Assert.assertEquals("On sample point", + expected, result, 1e-15); + + x = 4.5; + y = -1.5; + z = -4.25; + expected = f.value(x, y, z); + result = tcf.value(x, y, z); + Assert.assertEquals("Half-way between sample points (middle of the patch)", + expected, result, 0.3); + + x = 3.5; + y = -3.5; + z = -10; + expected = f.value(x, y, z); + result = tcf.value(x, y, z); + Assert.assertEquals("Half-way between sample points (border of the patch)", + expected, result, 0.3); + } + + /** + * Sine wave. + *

+ * f(x, y, z) = a cos [ω z - ky x - ky y] + *