Return-Path: Delivered-To: apmail-commons-commits-archive@minotaur.apache.org Received: (qmail 32791 invoked from network); 22 Apr 2010 22:10:10 -0000 Received: from unknown (HELO mail.apache.org) (140.211.11.3) by 140.211.11.9 with SMTP; 22 Apr 2010 22:10:10 -0000 Received: (qmail 51836 invoked by uid 500); 22 Apr 2010 22:10:10 -0000 Delivered-To: apmail-commons-commits-archive@commons.apache.org Received: (qmail 51767 invoked by uid 500); 22 Apr 2010 22:10:10 -0000 Mailing-List: contact commits-help@commons.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@commons.apache.org Delivered-To: mailing list commits@commons.apache.org Received: (qmail 51662 invoked by uid 99); 22 Apr 2010 22:10:10 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 22 Apr 2010 22:10:10 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 22 Apr 2010 22:10:05 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id C47D22388A67; Thu, 22 Apr 2010 22:09:21 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r937080 [2/2] - in /commons/proper/math/trunk/src: main/java/org/apache/commons/math/analysis/ main/java/org/apache/commons/math/analysis/interpolation/ site/xdoc/ site/xdoc/userguide/ test/java/org/apache/commons/math/analysis/interpolation/ Date: Thu, 22 Apr 2010 22:09:21 -0000 To: commits@commons.apache.org From: erans@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20100422220921.C47D22388A67@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Added: commons/proper/math/trunk/src/test/java/org/apache/commons/math/analysis/interpolation/TricubicSplineInterpolatingFunctionTest.java URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math/analysis/interpolation/TricubicSplineInterpolatingFunctionTest.java?rev=937080&view=auto ============================================================================== --- commons/proper/math/trunk/src/test/java/org/apache/commons/math/analysis/interpolation/TricubicSplineInterpolatingFunctionTest.java (added) +++ commons/proper/math/trunk/src/test/java/org/apache/commons/math/analysis/interpolation/TricubicSplineInterpolatingFunctionTest.java Thu Apr 22 22:09:21 2010 @@ -0,0 +1,544 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.math.analysis.interpolation; + +import org.apache.commons.math.MathException; +import org.apache.commons.math.DimensionMismatchException; +import org.apache.commons.math.analysis.TrivariateRealFunction; +import org.junit.Assert; +import org.junit.Test; + +/** + * Testcase for the bicubic function. + * + * @version $Revision: 821626 $ $Date: 2009-10-04 23:57:30 +0200 (Sun, 04 Oct 2009) $ + */ +public final class TricubicSplineInterpolatingFunctionTest { + /** + * Test preconditions. + */ + @Test + public void testPreconditions() throws MathException { + double[] xval = new double[] {3, 4, 5, 6.5}; + double[] yval = new double[] {-4, -3, -1, 2.5}; + double[] zval = new double[] {-12, -8, -5.5, -3, 0, 2.5}; + double[][][] fval = new double[xval.length][yval.length][zval.length]; + + @SuppressWarnings("unused") + TrivariateRealFunction tcf = new TricubicSplineInterpolatingFunction(xval, yval, zval, + fval, fval, fval, fval, + fval, fval, fval, fval); + + double[] wxval = new double[] {3, 2, 5, 6.5}; + try { + tcf = new TricubicSplineInterpolatingFunction(wxval, yval, zval, + fval, fval, fval, fval, + fval, fval, fval, fval); + Assert.fail("an exception should have been thrown"); + } catch (IllegalArgumentException e) { + // Expected + } + double[] wyval = new double[] {-4, -1, -1, 2.5}; + try { + tcf = new TricubicSplineInterpolatingFunction(xval, wyval, zval, + fval, fval, fval, fval, + fval, fval, fval, fval); + Assert.fail("an exception should have been thrown"); + } catch (IllegalArgumentException e) { + // Expected + } + double[] wzval = new double[] {-12, -8, -9, -3, 0, 2.5}; + try { + tcf = new TricubicSplineInterpolatingFunction(xval, yval, wzval, + fval, fval, fval, fval, + fval, fval, fval, fval); + Assert.fail("an exception should have been thrown"); + } catch (IllegalArgumentException e) { + // Expected + } + double[][][] wfval = new double[xval.length - 1][yval.length - 1][zval.length]; + try { + tcf = new TricubicSplineInterpolatingFunction(xval, yval, zval, + wfval, fval, fval, fval, + fval, fval, fval, fval); + Assert.fail("an exception should have been thrown"); + } catch (DimensionMismatchException e) { + // Expected + } + try { + tcf = new TricubicSplineInterpolatingFunction(xval, yval, zval, + fval, wfval, fval, fval, + fval, fval, fval, fval); + Assert.fail("an exception should have been thrown"); + } catch (DimensionMismatchException e) { + // Expected + } + try { + tcf = new TricubicSplineInterpolatingFunction(xval, yval, zval, + fval, fval, wfval, fval, + fval, fval, fval, fval); + Assert.fail("an exception should have been thrown"); + } catch (DimensionMismatchException e) { + // Expected + } + try { + tcf = new TricubicSplineInterpolatingFunction(xval, yval, zval, + fval, fval, fval, wfval, + fval, fval, fval, fval); + Assert.fail("an exception should have been thrown"); + } catch (DimensionMismatchException e) { + // Expected + } + try { + tcf = new TricubicSplineInterpolatingFunction(xval, yval, zval, + fval, fval, fval, fval, + wfval, fval, fval, fval); + Assert.fail("an exception should have been thrown"); + } catch (DimensionMismatchException e) { + // Expected + } + try { + tcf = new TricubicSplineInterpolatingFunction(xval, yval, zval, + fval, fval, fval, fval, + fval, wfval, fval, fval); + Assert.fail("an exception should have been thrown"); + } catch (DimensionMismatchException e) { + // Expected + } + try { + tcf = new TricubicSplineInterpolatingFunction(xval, yval, zval, + fval, fval, fval, fval, + fval, fval, wfval, fval); + Assert.fail("an exception should have been thrown"); + } catch (DimensionMismatchException e) { + // Expected + } + try { + tcf = new TricubicSplineInterpolatingFunction(xval, yval, zval, + fval, fval, fval, fval, + fval, fval, fval, wfval); + Assert.fail("an exception should have been thrown"); + } catch (DimensionMismatchException e) { + // Expected + } + wfval = new double[xval.length][yval.length - 1][zval.length]; + try { + tcf = new TricubicSplineInterpolatingFunction(xval, yval, zval, + wfval, fval, fval, fval, + fval, fval, fval, fval); + Assert.fail("an exception should have been thrown"); + } catch (DimensionMismatchException e) { + // Expected + } + try { + tcf = new TricubicSplineInterpolatingFunction(xval, yval, zval, + fval, wfval, fval, fval, + fval, fval, fval, fval); + Assert.fail("an exception should have been thrown"); + } catch (DimensionMismatchException e) { + // Expected + } + try { + tcf = new TricubicSplineInterpolatingFunction(xval, yval, zval, + fval, fval, wfval, fval, + fval, fval, fval, fval); + Assert.fail("an exception should have been thrown"); + } catch (DimensionMismatchException e) { + // Expected + } + try { + tcf = new TricubicSplineInterpolatingFunction(xval, yval, zval, + fval, fval, fval, wfval, + fval, fval, fval, fval); + Assert.fail("an exception should have been thrown"); + } catch (DimensionMismatchException e) { + // Expected + } + try { + tcf = new TricubicSplineInterpolatingFunction(xval, yval, zval, + fval, fval, fval, fval, + wfval, fval, fval, fval); + Assert.fail("an exception should have been thrown"); + } catch (DimensionMismatchException e) { + // Expected + } + try { + tcf = new TricubicSplineInterpolatingFunction(xval, yval, zval, + fval, fval, fval, fval, + fval, wfval, fval, fval); + Assert.fail("an exception should have been thrown"); + } catch (DimensionMismatchException e) { + // Expected + } + try { + tcf = new TricubicSplineInterpolatingFunction(xval, yval, zval, + fval, fval, fval, fval, + fval, fval, wfval, fval); + Assert.fail("an exception should have been thrown"); + } catch (DimensionMismatchException e) { + // Expected + } + try { + tcf = new TricubicSplineInterpolatingFunction(xval, yval, zval, + fval, fval, fval, fval, + fval, fval, fval, wfval); + Assert.fail("an exception should have been thrown"); + } catch (DimensionMismatchException e) { + // Expected + } + wfval = new double[xval.length][yval.length][zval.length - 1]; + try { + tcf = new TricubicSplineInterpolatingFunction(xval, yval, zval, + wfval, fval, fval, fval, + fval, fval, fval, fval); + Assert.fail("an exception should have been thrown"); + } catch (DimensionMismatchException e) { + // Expected + } + try { + tcf = new TricubicSplineInterpolatingFunction(xval, yval, zval, + fval, wfval, fval, fval, + fval, fval, fval, fval); + Assert.fail("an exception should have been thrown"); + } catch (DimensionMismatchException e) { + // Expected + } + try { + tcf = new TricubicSplineInterpolatingFunction(xval, yval, zval, + fval, fval, wfval, fval, + fval, fval, fval, fval); + Assert.fail("an exception should have been thrown"); + } catch (DimensionMismatchException e) { + // Expected + } + try { + tcf = new TricubicSplineInterpolatingFunction(xval, yval, zval, + fval, fval, fval, wfval, + fval, fval, fval, fval); + Assert.fail("an exception should have been thrown"); + } catch (DimensionMismatchException e) { + // Expected + } + try { + tcf = new TricubicSplineInterpolatingFunction(xval, yval, zval, + fval, fval, fval, fval, + wfval, fval, fval, fval); + Assert.fail("an exception should have been thrown"); + } catch (DimensionMismatchException e) { + // Expected + } + try { + tcf = new TricubicSplineInterpolatingFunction(xval, yval, zval, + fval, fval, fval, fval, + fval, wfval, fval, fval); + Assert.fail("an exception should have been thrown"); + } catch (DimensionMismatchException e) { + // Expected + } + try { + tcf = new TricubicSplineInterpolatingFunction(xval, yval, zval, + fval, fval, fval, fval, + fval, fval, wfval, fval); + Assert.fail("an exception should have been thrown"); + } catch (DimensionMismatchException e) { + // Expected + } + try { + tcf = new TricubicSplineInterpolatingFunction(xval, yval, zval, + fval, fval, fval, fval, + fval, fval, fval, wfval); + Assert.fail("an exception should have been thrown"); + } catch (DimensionMismatchException e) { + // Expected + } + } + + /** + * Test for a plane. + *

+ * 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] + *

+ * with A = 0.2, ω = 0.5, kx = 2, ky = 1. + */ + @Test + public void testWave() 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, 4}; + + final double a = 0.2; + final double omega = 0.5; + final double kx = 2; + final double ky = 1; + + // Function values + TrivariateRealFunction f = new TrivariateRealFunction() { + public double value(double x, double y, double z) { + return a * Math.cos(omega * z - kx * x - ky * y); + } + }; + + 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]; + TrivariateRealFunction dFdX_f = new TrivariateRealFunction() { + public double value(double x, double y, double z) { + return a * Math.sin(omega * z - kx * x - ky * y) * kx; + } + }; + 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] = dFdX_f.value(xval[i], yval[j], zval[k]); + } + } + } + + // Partial derivatives with respect to y + double[][][] dFdY = new double[xval.length][yval.length][zval.length]; + TrivariateRealFunction dFdY_f = new TrivariateRealFunction() { + public double value(double x, double y, double z) { + return a * Math.sin(omega * z - kx * x - ky * y) * ky; + } + }; + 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] = dFdY_f.value(xval[i], yval[j], zval[k]); + } + } + } + + // Partial derivatives with respect to z + double[][][] dFdZ = new double[xval.length][yval.length][zval.length]; + TrivariateRealFunction dFdZ_f = new TrivariateRealFunction() { + public double value(double x, double y, double z) { + return -a * Math.sin(omega * z - kx * x - ky * y) * omega; + } + }; + 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] = dFdZ_f.value(xval[i], yval[j], zval[k]); + } + } + } + + // Partial second derivatives w.r.t. (x, y) + double[][][] d2FdXdY = new double[xval.length][yval.length][zval.length]; + TrivariateRealFunction d2FdXdY_f = new TrivariateRealFunction() { + public double value(double x, double y, double z) { + return -a * Math.cos(omega * z - kx * x - ky * y) * kx * ky; + } + }; + 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] = d2FdXdY_f.value(xval[i], yval[j], zval[k]); + } + } + } + + // Partial second derivatives w.r.t. (x, z) + double[][][] d2FdXdZ = new double[xval.length][yval.length][zval.length]; + TrivariateRealFunction d2FdXdZ_f = new TrivariateRealFunction() { + public double value(double x, double y, double z) { + return a * Math.cos(omega * z - kx * x - ky * y) * kx * omega; + } + }; + for (int i = 0; i < xval.length; i++) { + for (int j = 0; j < yval.length; j++) { + for (int k = 0; k < zval.length; k++) { + d2FdXdZ[i][j][k] = d2FdXdZ_f.value(xval[i], yval[j], zval[k]); + } + } + } + + // Partial second derivatives w.r.t. (y, z) + double[][][] d2FdYdZ = new double[xval.length][yval.length][zval.length]; + TrivariateRealFunction d2FdYdZ_f = new TrivariateRealFunction() { + public double value(double x, double y, double z) { + return a * Math.cos(omega * z - kx * x - ky * y) * ky * omega; + } + }; + for (int i = 0; i < xval.length; i++) { + for (int j = 0; j < yval.length; j++) { + for (int k = 0; k < zval.length; k++) { + d2FdYdZ[i][j][k] = d2FdYdZ_f.value(xval[i], yval[j], zval[k]); + } + } + } + + // Partial third derivatives + double[][][] d3FdXdYdZ = new double[xval.length][yval.length][zval.length]; + TrivariateRealFunction d3FdXdYdZ_f = new TrivariateRealFunction() { + public double value(double x, double y, double z) { + return a * Math.sin(omega * z - kx * x - ky * y) * kx * ky * omega; + } + }; + for (int i = 0; i < xval.length; i++) { + for (int j = 0; j < yval.length; j++) { + for (int k = 0; k < zval.length; k++) { + d3FdXdYdZ[i][j][k] = d3FdXdYdZ_f.value(xval[i], yval[j], zval[k]); + } + } + } + + 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-14); + + 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.1); + + 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.1); + } +} Propchange: commons/proper/math/trunk/src/test/java/org/apache/commons/math/analysis/interpolation/TricubicSplineInterpolatingFunctionTest.java ------------------------------------------------------------------------------ svn:eol-style = native Added: commons/proper/math/trunk/src/test/java/org/apache/commons/math/analysis/interpolation/TricubicSplineInterpolatorTest.java URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math/analysis/interpolation/TricubicSplineInterpolatorTest.java?rev=937080&view=auto ============================================================================== --- commons/proper/math/trunk/src/test/java/org/apache/commons/math/analysis/interpolation/TricubicSplineInterpolatorTest.java (added) +++ commons/proper/math/trunk/src/test/java/org/apache/commons/math/analysis/interpolation/TricubicSplineInterpolatorTest.java Thu Apr 22 22:09:21 2010 @@ -0,0 +1,211 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.math.analysis.interpolation; + +import org.apache.commons.math.MathException; +import org.apache.commons.math.DimensionMismatchException; +import org.apache.commons.math.analysis.TrivariateRealFunction; +import org.junit.Assert; +import org.junit.Test; + +/** + * Testcase for the tricubic interpolator. + * + * @version $Revision$ $Date$ + */ +public final class TricubicSplineInterpolatorTest { + /** + * Test preconditions. + */ + @Test + public void testPreconditions() throws MathException { + double[] xval = new double[] {3, 4, 5, 6.5}; + double[] yval = new double[] {-4, -3, -1, 2.5}; + double[] zval = new double[] {-12, -8, -5.5, -3, 0, 2.5}; + double[][][] fval = new double[xval.length][yval.length][zval.length]; + + TrivariateRealGridInterpolator interpolator = new TricubicSplineInterpolator(); + + @SuppressWarnings("unused") + TrivariateRealFunction p = interpolator.interpolate(xval, yval, zval, fval); + + double[] wxval = new double[] {3, 2, 5, 6.5}; + try { + p = interpolator.interpolate(wxval, yval, zval, fval); + Assert.fail("an exception should have been thrown"); + } catch (IllegalArgumentException e) { + // Expected + } + + double[] wyval = new double[] {-4, -3, -1, -1}; + try { + p = interpolator.interpolate(xval, wyval, zval, fval); + Assert.fail("an exception should have been thrown"); + } catch (IllegalArgumentException e) { + // Expected + } + + double[] wzval = new double[] {-12, -8, -5.5, -3, -4, 2.5}; + try { + p = interpolator.interpolate(xval, yval, wzval, fval); + Assert.fail("an exception should have been thrown"); + } catch (IllegalArgumentException e) { + // Expected + } + + double[][][] wfval = new double[xval.length][yval.length + 1][zval.length]; + try { + p = interpolator.interpolate(xval, yval, zval, wfval); + Assert.fail("an exception should have been thrown"); + } catch (DimensionMismatchException e) { + // Expected + } + wfval = new double[xval.length - 1][yval.length][zval.length]; + try { + p = interpolator.interpolate(xval, yval, zval, wfval); + Assert.fail("an exception should have been thrown"); + } catch (DimensionMismatchException e) { + // Expected + } + wfval = new double[xval.length][yval.length][zval.length - 1]; + try { + p = interpolator.interpolate(xval, yval, zval, wfval); + Assert.fail("an exception should have been thrown"); + } catch (DimensionMismatchException e) { + // Expected + } + } + + /** + * Test of interpolator for a plane. + *

+ * f(x, y, z) = 2 x - 3 y - z + 5 + */ + @Test + public void testPlane() throws MathException { + TrivariateRealFunction f = new TrivariateRealFunction() { + public double value(double x, double y, double z) { + return 2 * x - 3 * y - z + 5; + } + }; + + TrivariateRealGridInterpolator interpolator = new TricubicSplineInterpolator(); + + 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}; + 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]); + } + } + } + + TrivariateRealFunction p = interpolator.interpolate(xval, yval, zval, fval); + double x, y, z; + double expected, result; + + x = 4; + y = -3; + z = 0; + expected = f.value(x, y, z); + result = p.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 = p.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 = p.value(x, y, z); + Assert.assertEquals("half-way between sample points (border of the patch)", expected, result, 0.3); + } + + /** + * Test of interpolator for a sine wave. + *

+ *

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

+ * with A = 0.2, ω = 0.5, kx = 2, ky = 1. + */ + @Test + public void testWave() 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, 4}; + + final double a = 0.2; + final double omega = 0.5; + final double kx = 2; + final double ky = 1; + + // Function values + TrivariateRealFunction f = new TrivariateRealFunction() { + public double value(double x, double y, double z) { + return a * Math.cos(omega * z - kx * x - ky * y); + } + }; + + 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]); + } + } + } + + TrivariateRealGridInterpolator interpolator = new TricubicSplineInterpolator(); + + TrivariateRealFunction p = interpolator.interpolate(xval, yval, zval, fval); + double x, y, z; + double expected, result; + + x = 4; + y = -3; + z = 0; + expected = f.value(x, y, z); + result = p.value(x, y, z); + Assert.assertEquals("On sample point", + expected, result, 1e-12); + + x = 4.5; + y = -1.5; + z = -4.25; + expected = f.value(x, y, z); + result = p.value(x, y, z); + Assert.assertEquals("Half-way between sample points (middle of the patch)", + expected, result, 0.1); + + x = 3.5; + y = -3.5; + z = -10; + expected = f.value(x, y, z); + result = p.value(x, y, z); + Assert.assertEquals("Half-way between sample points (border of the patch)", + expected, result, 0.1); + } +} Propchange: commons/proper/math/trunk/src/test/java/org/apache/commons/math/analysis/interpolation/TricubicSplineInterpolatorTest.java ------------------------------------------------------------------------------ svn:eol-style = native