Return-Path: Delivered-To: apmail-commons-dev-archive@www.apache.org Received: (qmail 43391 invoked from network); 21 Apr 2010 14:32:01 -0000 Received: from unknown (HELO mail.apache.org) (140.211.11.3) by 140.211.11.9 with SMTP; 21 Apr 2010 14:32:01 -0000 Received: (qmail 12385 invoked by uid 500); 21 Apr 2010 14:32:01 -0000 Delivered-To: apmail-commons-dev-archive@commons.apache.org Received: (qmail 12164 invoked by uid 500); 21 Apr 2010 14:32:00 -0000 Mailing-List: contact dev-help@commons.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: "Commons Developers List" Delivered-To: mailing list dev@commons.apache.org Received: (qmail 12141 invoked by uid 99); 21 Apr 2010 14:32:00 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 21 Apr 2010 14:32:00 +0000 X-ASF-Spam-Status: No, hits=-0.2 required=10.0 tests=AWL,FREEMAIL_FROM,RCVD_IN_DNSWL_NONE,SPF_NEUTRAL,T_TO_NO_BRKTS_FREEMAIL X-Spam-Check-By: apache.org Received-SPF: neutral (athena.apache.org: local policy) Received: from [194.206.126.239] (HELO smtp.nordnet.fr) (194.206.126.239) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 21 Apr 2010 14:31:51 +0000 Received: from lehrin (77.230.146.195.dynamic.adsl.abo.nordnet.fr [195.146.230.77]) by smtp.nordnet.fr (Postfix) with ESMTP id 749CC340C8 for ; Wed, 21 Apr 2010 16:31:26 +0200 (CEST) Received: by lehrin (Postfix, from userid 5001) id F021A415A; Wed, 21 Apr 2010 16:31:27 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.2.5 (2008-06-10) on lehrin.spaceroots.local X-Spam-Level: Received: from lehrin.spaceroots.local (lehrin.spaceroots.local [127.0.0.1]) by lehrin (Postfix) with ESMTP id EE72E4158 for ; Wed, 21 Apr 2010 16:31:25 +0200 (CEST) Message-ID: <4BCF0C3D.2060607@free.fr> Date: Wed, 21 Apr 2010 16:31:25 +0200 From: Luc Maisonobe User-Agent: Thunderbird 2.0.0.24 (X11/20100411) MIME-Version: 1.0 To: dev@commons.apache.org Subject: Re: svn commit: r936295 - in /commons/proper/math/trunk/src: main/java/org/apache/commons/math/analysis/ main/java/org/apache/commons/math/analysis/interpolation/ main/java/org/apache/commons/math/optimization/fitting/ site/xdoc/ site/xdoc/userguide/ test/... References: <20100421132745.5AC0E23889E3@eris.apache.org> In-Reply-To: <20100421132745.5AC0E23889E3@eris.apache.org> X-Enigmail-Version: 0.95.7 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Old-Spam-Status: No, score=-1.4 required=5.0 tests=ALL_TRUSTED autolearn=failed version=3.2.5 erans@apache.org a écrit : > Author: erans > Date: Wed Apr 21 13:27:44 2010 > New Revision: 936295 > > URL: http://svn.apache.org/viewvc?rev=936295&view=rev > Log: > MATH-365 > > Added: > commons/proper/math/trunk/src/main/java/org/apache/commons/math/analysis/interpolation/BicubicSplineInterpolator.java > commons/proper/math/trunk/src/main/java/org/apache/commons/math/analysis/interpolation/SmoothingPolynomialBicubicSplineInterpolator.java > commons/proper/math/trunk/src/test/java/org/apache/commons/math/analysis/interpolation/BicubicSplineInterpolatorTest.java > commons/proper/math/trunk/src/test/java/org/apache/commons/math/analysis/interpolation/SmoothingPolynomialBicubicSplineInterpolatorTest.java I did not check (yet) the content of the modifications, but would ask first for configuring your subversion client to automatically add the properties svn:keywords to "Author Date Id Revision" for java files and svn:eol-style to "native". See and . Thanks Luc > Modified: > commons/proper/math/trunk/src/main/java/org/apache/commons/math/analysis/BivariateRealFunction.java > commons/proper/math/trunk/src/main/java/org/apache/commons/math/analysis/interpolation/BivariateRealGridInterpolator.java > commons/proper/math/trunk/src/main/java/org/apache/commons/math/analysis/interpolation/SmoothingBicubicSplineInterpolator.java > commons/proper/math/trunk/src/main/java/org/apache/commons/math/optimization/fitting/PolynomialFitter.java > commons/proper/math/trunk/src/site/xdoc/changes.xml > commons/proper/math/trunk/src/site/xdoc/userguide/analysis.xml > commons/proper/math/trunk/src/test/java/org/apache/commons/math/analysis/interpolation/SmoothingBicubicSplineInterpolatorTest.java > > Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math/analysis/BivariateRealFunction.java > URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/analysis/BivariateRealFunction.java?rev=936295&r1=936294&r2=936295&view=diff > ============================================================================== > --- commons/proper/math/trunk/src/main/java/org/apache/commons/math/analysis/BivariateRealFunction.java (original) > +++ commons/proper/math/trunk/src/main/java/org/apache/commons/math/analysis/BivariateRealFunction.java Wed Apr 21 13:27:44 2010 > @@ -19,8 +19,6 @@ package org.apache.commons.math.analysis > > import org.apache.commons.math.FunctionEvaluationException; > > - > - > /** > * An interface representing a bivariate real function. > * > @@ -28,14 +26,15 @@ import org.apache.commons.math.FunctionE > * @version $Revision$ $Date$ > */ > public interface BivariateRealFunction { > - > /** > * Compute the value for the function. > - * @param x abscissa for which the function value should be computed > - * @param y ordinate for which the function value should be computed > - * @return the value > - * @throws FunctionEvaluationException if the function evaluation fails > + * > + * @param x Abscissa for which the function value should be computed. > + * @param y Ordinate for which the function value should be computed. > + * @return the value. > + * @throws FunctionEvaluationException if the function evaluation fails. > */ > - double value(double x, double y) throws FunctionEvaluationException; > + public double value(double x, double y) > + throws FunctionEvaluationException; > > } > > Added: commons/proper/math/trunk/src/main/java/org/apache/commons/math/analysis/interpolation/BicubicSplineInterpolator.java > URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/analysis/interpolation/BicubicSplineInterpolator.java?rev=936295&view=auto > ============================================================================== > --- commons/proper/math/trunk/src/main/java/org/apache/commons/math/analysis/interpolation/BicubicSplineInterpolator.java (added) > +++ commons/proper/math/trunk/src/main/java/org/apache/commons/math/analysis/interpolation/BicubicSplineInterpolator.java Wed Apr 21 13:27:44 2010 > @@ -0,0 +1,145 @@ > +/* > + * 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.DimensionMismatchException; > +import org.apache.commons.math.MathRuntimeException; > +import org.apache.commons.math.MathException; > +import org.apache.commons.math.util.MathUtils; > +import org.apache.commons.math.analysis.UnivariateRealFunction; > +import org.apache.commons.math.analysis.polynomials.PolynomialSplineFunction; > + > +/** > + * Generates a bicubic interpolating function. > + * > + * @version $Revision$ $Date$ > + * @since 2.2 > + */ > +public class BicubicSplineInterpolator > + implements BivariateRealGridInterpolator { > + /** > + * {@inheritDoc} > + */ > + public BicubicSplineInterpolatingFunction interpolate(final double[] xval, > + final double[] yval, > + final double[][] fval) > + throws MathException, IllegalArgumentException { > + if (xval.length == 0 || yval.length == 0 || fval.length == 0) { > + throw MathRuntimeException.createIllegalArgumentException("no data"); > + } > + if (xval.length != fval.length) { > + throw new DimensionMismatchException(xval.length, fval.length); > + } > + > + MathUtils.checkOrder(xval, 1, true); > + MathUtils.checkOrder(yval, 1, true); > + > + final int xLen = xval.length; > + final int yLen = yval.length; > + > + // Samples (first index is y-coordinate, i.e. subarray variable is x) > + // 0 <= i < xval.length > + // 0 <= j < yval.length > + // fX[j][i] = f(xval[i], yval[j]) > + final double[][] fX = new double[yLen][xLen]; > + for (int i = 0; i < xLen; i++) { > + if (fval[i].length != yLen) { > + throw new DimensionMismatchException(fval[i].length, yLen); > + } > + > + for (int j = 0; j < yLen; j++) { > + fX[j][i] = fval[i][j]; > + } > + } > + > + final SplineInterpolator spInterpolator = new SplineInterpolator(); > + > + // For each line y[j] (0 <= j < yLen), construct a 1D spline with > + // respect to variable x > + final PolynomialSplineFunction[] ySplineX = new PolynomialSplineFunction[yLen]; > + for (int j = 0; j < yLen; j++) { > + ySplineX[j] = spInterpolator.interpolate(xval, fX[j]); > + } > + > + // For each line x[i] (0 <= i < xLen), construct a 1D spline with > + // respect to variable y generated by array fY_1[i] > + final PolynomialSplineFunction[] xSplineY = new PolynomialSplineFunction[xLen]; > + for (int i = 0; i < xLen; i++) { > + xSplineY[i] = spInterpolator.interpolate(yval, fval[i]); > + } > + > + // Partial derivatives with respect to x at the grid knots > + final double[][] dFdX = new double[xLen][yLen]; > + for (int j = 0; j < yLen; j++) { > + final UnivariateRealFunction f = ySplineX[j].derivative(); > + for (int i = 0; i < xLen; i++) { > + dFdX[i][j] = f.value(xval[i]); > + } > + } > + > + // Partial derivatives with respect to y at the grid knots > + final double[][] dFdY = new double[xLen][yLen]; > + for (int i = 0; i < xLen; i++) { > + final UnivariateRealFunction f = xSplineY[i].derivative(); > + for (int j = 0; j < yLen; j++) { > + dFdY[i][j] = f.value(yval[j]); > + } > + } > + > + // Cross partial derivatives > + final double[][] d2FdXdY = new double[xLen][yLen]; > + for (int i = 0; i < xLen ; i++) { > + final int nI = nextIndex(i, xLen); > + final int pI = previousIndex(i); > + for (int j = 0; j < yLen; j++) { > + final int nJ = nextIndex(j, yLen); > + final int pJ = previousIndex(j); > + d2FdXdY[i][j] = (fval[nI][nJ] - fval[nI][pJ] - > + fval[pI][nJ] + fval[pI][pJ]) / > + ((xval[nI] - xval[pI]) * (yval[nJ] - yval[pJ])); > + } > + } > + > + // Create the interpolating splines > + return new BicubicSplineInterpolatingFunction(xval, yval, fval, > + dFdX, dFdY, d2FdXdY); > + } > + > + /** > + * Compute the next index of an array, clipping if necessary. > + * It is assumed (but not checked) that {@code i} is larger than or equal to 0}. > + * > + * @param i Index > + * @param max Upper limit of the array > + * @return the next index > + */ > + private int nextIndex(int i, int max) { > + final int index = i + 1; > + return index < max ? index : index - 1; > + } > + /** > + * Compute the previous index of an array, clipping if necessary. > + * It is assumed (but not checked) that {@code i} is smaller than the size of the array. > + * > + * @param i Index > + * @return the previous index > + */ > + private int previousIndex(int i) { > + final int index = i - 1; > + return index >= 0 ? index : 0; > + } > +} > > Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math/analysis/interpolation/BivariateRealGridInterpolator.java > URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/analysis/interpolation/BivariateRealGridInterpolator.java?rev=936295&r1=936294&r2=936295&view=diff > ============================================================================== > --- commons/proper/math/trunk/src/main/java/org/apache/commons/math/analysis/interpolation/BivariateRealGridInterpolator.java (original) > +++ commons/proper/math/trunk/src/main/java/org/apache/commons/math/analysis/interpolation/BivariateRealGridInterpolator.java Wed Apr 21 13:27:44 2010 > @@ -26,20 +26,19 @@ import org.apache.commons.math.analysis. > * @version $Revision$ $Date$ > */ > public interface BivariateRealGridInterpolator { > - > /** > * Computes an interpolating function for the data set. > * > - * @param xval all the x-coordinates of the interpolation points, sorted > + * @param xval All the x-coordinates of the interpolation points, sorted > * in increasing order. > - * @param yval all the y-coordinates of the interpolation points, sorted > + * @param yval All the y-coordinates of the interpolation points, sorted > * in increasing order. > - * @param zval the values of the interpolation points on all the grid knots: > - * {@code zval[i][j] = f(xval[i], yval[j])} > - * @return a function which interpolates the data set > + * @param fval The values of the interpolation points on all the grid knots: > + * {@code fval[i][j] = f(xval[i], yval[j])}. > + * @return a function which interpolates the data set. > * @throws MathException if arguments violate assumptions made by the > - * interpolation algorithm > + * interpolation algorithm. > */ > - BivariateRealFunction interpolate(double[] xval, double[] yval, double[][] zval) > + BivariateRealFunction interpolate(double[] xval, double[] yval, double[][] fval) > throws MathException; > } > > Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math/analysis/interpolation/SmoothingBicubicSplineInterpolator.java > URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/analysis/interpolation/SmoothingBicubicSplineInterpolator.java?rev=936295&r1=936294&r2=936295&view=diff > ============================================================================== > --- commons/proper/math/trunk/src/main/java/org/apache/commons/math/analysis/interpolation/SmoothingBicubicSplineInterpolator.java (original) > +++ commons/proper/math/trunk/src/main/java/org/apache/commons/math/analysis/interpolation/SmoothingBicubicSplineInterpolator.java Wed Apr 21 13:27:44 2010 > @@ -21,7 +21,6 @@ import org.apache.commons.math.MathRunti > import org.apache.commons.math.MathException; > import org.apache.commons.math.util.MathUtils; > import org.apache.commons.math.analysis.UnivariateRealFunction; > -import org.apache.commons.math.analysis.BivariateRealFunction; > import org.apache.commons.math.analysis.polynomials.PolynomialSplineFunction; > > /** > @@ -33,15 +32,20 @@ import org.apache.commons.math.analysis. > * > * @version $Revision$ $Date$ > * @since 2.1 > + * @deprecated This class does not perform smoothing; the name is thus misleading. > + * Please use {@link org.apache.commons.math.analysis.interpolation.BicubicSplineInterpolator} > + * instead. If smoothing is desired, a tentative implementation is provided in class > + * {@link org.apache.commons.math.analysis.interpolation.SmoothingPolynomialBicubicSplineInterpolator}. > + * This class will be removed in math 3.0. > */ > public class SmoothingBicubicSplineInterpolator > implements BivariateRealGridInterpolator { > /** > * {@inheritDoc} > */ > - public BivariateRealFunction interpolate(final double[] xval, > - final double[] yval, > - final double[][] zval) > + public BicubicSplineInterpolatingFunction interpolate(final double[] xval, > + final double[] yval, > + final double[][] zval) > throws MathException, IllegalArgumentException { > if (xval.length == 0 || yval.length == 0 || zval.length == 0) { > throw MathRuntimeException.createIllegalArgumentException("no data"); > @@ -133,9 +137,9 @@ public class SmoothingBicubicSplineInter > for (int j = 0; j < yLen; j++) { > final int nJ = nextIndex(j, yLen); > final int pJ = previousIndex(j); > - dZdXdY[i][j] = (zY_2[nI][nJ] - zY_2[nI][pJ] - > - zY_2[pI][nJ] + zY_2[pI][pJ]) / > - ((xval[nI] - xval[pI]) * (yval[nJ] - yval[pJ])) ; > + dZdXdY[i][j] = (zY_2[nI][nJ] - zY_2[nI][pJ] - > + zY_2[pI][nJ] + zY_2[pI][pJ]) / > + ((xval[nI] - xval[pI]) * (yval[nJ] - yval[pJ])); > } > } > > > Added: commons/proper/math/trunk/src/main/java/org/apache/commons/math/analysis/interpolation/SmoothingPolynomialBicubicSplineInterpolator.java > URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/analysis/interpolation/SmoothingPolynomialBicubicSplineInterpolator.java?rev=936295&view=auto > ============================================================================== > --- commons/proper/math/trunk/src/main/java/org/apache/commons/math/analysis/interpolation/SmoothingPolynomialBicubicSplineInterpolator.java (added) > +++ commons/proper/math/trunk/src/main/java/org/apache/commons/math/analysis/interpolation/SmoothingPolynomialBicubicSplineInterpolator.java Wed Apr 21 13:27:44 2010 > @@ -0,0 +1,140 @@ > +/* > + * 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.DimensionMismatchException; > +import org.apache.commons.math.MathRuntimeException; > +import org.apache.commons.math.MathException; > +import org.apache.commons.math.util.MathUtils; > +import org.apache.commons.math.analysis.UnivariateRealFunction; > +import org.apache.commons.math.analysis.BivariateRealFunction; > +import org.apache.commons.math.optimization.general.GaussNewtonOptimizer; > +import org.apache.commons.math.optimization.fitting.PolynomialFitter; > +import org.apache.commons.math.analysis.polynomials.PolynomialFunction; > + > +/** > + * Generates a bicubic interpolation function. > + * Prior to generating the interpolating function, the input is smoothed using > + * polynomial fitting. > + * > + * @version $Revision$ $Date$ > + * @since 2.2 > + */ > +public class SmoothingPolynomialBicubicSplineInterpolator > + extends BicubicSplineInterpolator { > + private final PolynomialFitter xFitter; > + private final PolynomialFitter yFitter; > + > + /** > + * Default constructor. The degree of the fitting polynomials are set to 3. > + */ > + public SmoothingPolynomialBicubicSplineInterpolator() { > + this(3); > + } > + > + /** > + * @param degree Degree of the polynomial fitting functions. > + */ > + public SmoothingPolynomialBicubicSplineInterpolator(int degree) { > + this(degree, degree); > + } > + > + /** > + * @param xDegree Degree of the polynomial fitting functions along the > + * x-dimension. > + * @param yDegree Degree of the polynomial fitting functions along the > + * y-dimension. > + */ > + public SmoothingPolynomialBicubicSplineInterpolator(int xDegree, > + int yDegree) { > + xFitter = new PolynomialFitter(xDegree, new GaussNewtonOptimizer(false)); > + yFitter = new PolynomialFitter(yDegree, new GaussNewtonOptimizer(false)); > + } > + > + /** > + * {@inheritDoc} > + */ > + public BicubicSplineInterpolatingFunction interpolate(final double[] xval, > + final double[] yval, > + final double[][] fval) > + throws MathException, IllegalArgumentException { > + if (xval.length == 0 || yval.length == 0 || fval.length == 0) { > + throw MathRuntimeException.createIllegalArgumentException("no data"); > + } > + if (xval.length != fval.length) { > + throw new DimensionMismatchException(xval.length, fval.length); > + } > + > + final int xLen = xval.length; > + final int yLen = yval.length; > + > + for (int i = 0; i < xLen; i++) { > + if (fval[i].length != yLen) { > + throw new DimensionMismatchException(fval[i].length, yLen); > + } > + } > + > + MathUtils.checkOrder(xval, 1, true); > + MathUtils.checkOrder(yval, 1, true); > + > + // For each line y[j] (0 <= j < yLen), construct a polynomial, with > + // respect to variable x, fitting array fval[][j] > + final PolynomialFunction[] yPolyX = new PolynomialFunction[yLen]; > + for (int j = 0; j < yLen; j++) { > + xFitter.clearObservations(); > + for (int i = 0; i < xLen; i++) { > + xFitter.addObservedPoint(1, xval[i], fval[i][j]); > + } > + > + yPolyX[j] = xFitter.fit(); > + } > + > + // For every knot (xval[i], yval[j]) of the grid, calculate corrected > + // values fval_1 > + final double[][] fval_1 = new double[xLen][yLen]; > + for (int j = 0; j < yLen; j++) { > + final PolynomialFunction f = yPolyX[j]; > + for (int i = 0; i < xLen; i++) { > + fval_1[i][j] = f.value(xval[i]); > + } > + } > + > + // For each line x[i] (0 <= i < xLen), construct a polynomial, with > + // respect to variable y, fitting array fval_1[i][] > + final PolynomialFunction[] xPolyY = new PolynomialFunction[xLen]; > + for (int i = 0; i < xLen; i++) { > + yFitter.clearObservations(); > + for (int j = 0; j < yLen; j++) { > + yFitter.addObservedPoint(1, yval[j], fval_1[i][j]); > + } > + > + xPolyY[i] = yFitter.fit(); > + } > + > + // For every knot (xval[i], yval[j]) of the grid, calculate corrected > + // values fval_2 > + final double[][] fval_2 = new double[xLen][yLen]; > + for (int i = 0; i < xLen; i++) { > + final PolynomialFunction f = xPolyY[i]; > + for (int j = 0; j < yLen; j++) { > + fval_2[i][j] = f.value(yval[j]); > + } > + } > + > + return super.interpolate(xval, yval, fval_2); > + } > +} > > Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math/optimization/fitting/PolynomialFitter.java > URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/optimization/fitting/PolynomialFitter.java?rev=936295&r1=936294&r2=936295&view=diff > ============================================================================== > --- commons/proper/math/trunk/src/main/java/org/apache/commons/math/optimization/fitting/PolynomialFitter.java (original) > +++ commons/proper/math/trunk/src/main/java/org/apache/commons/math/optimization/fitting/PolynomialFitter.java Wed Apr 21 13:27:44 2010 > @@ -60,6 +60,13 @@ public class PolynomialFitter { > fitter.addObservedPoint(weight, x, y); > } > > + /** > + * Remove all observations. > + */ > + public void clearObservations() { > + fitter.clearObservations(); > + } > + > /** Get the polynomial fitting the weighted (x, y) points. > * @return polynomial function best fitting the observed points > * @exception OptimizationException if the algorithm failed to converge > > Modified: commons/proper/math/trunk/src/site/xdoc/changes.xml > URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/site/xdoc/changes.xml?rev=936295&r1=936294&r2=936295&view=diff > ============================================================================== > --- commons/proper/math/trunk/src/site/xdoc/changes.xml (original) > +++ commons/proper/math/trunk/src/site/xdoc/changes.xml Wed Apr 21 13:27:44 2010 > @@ -69,6 +69,12 @@ This is primarily a maintenance release, > DummyStepInterpolator requires an additional argument for one of its constructors; > some protected fields have been removed from AbstractLeastSquaresOptimizer, AbstractScalarDifferentiableOptimizer and AbstractLinearOptimizer; > and the isOptimal(SimplexTableau) method has been removed from SimplexSolver. "> > + > + Deprecated SmoothingBicubicSplineInterpolator and SmoothingBicubicSplineInterpolatorTest. > + Added BicubicSplineInterpolator and BicubicSplineInterpolatorTest. > + Added SmoothingPolynomialBicubicSplineInterpolator and SmoothingPolynomialBicubicSplineInterpolatorTest. > + Added method to clear the list of observations in PolynomialFitter. > + > > Fix use of wrong variable in SmoothingBicubicSplineInterpolatorTest.testPreconditions() > > > Modified: commons/proper/math/trunk/src/site/xdoc/userguide/analysis.xml > URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/site/xdoc/userguide/analysis.xml?rev=936295&r1=936294&r2=936295&view=diff > ============================================================================== > --- commons/proper/math/trunk/src/site/xdoc/userguide/analysis.xml (original) > +++ commons/proper/math/trunk/src/site/xdoc/userguide/analysis.xml Wed Apr 21 13:27:44 2010 > @@ -329,11 +329,15 @@ System.out println("f(" + interpolationX >

>

> From two-dimensional data sampled on a regular grid, the > - > - org.apache.commons.math.analysis.interpolation.SmoothingBicubicSplineInterpolator > + > + org.apache.commons.math.analysis.interpolation.BicubicSplineInterpolator > computes a > - bicubic interpolating function. The data is first smoothed, along each grid dimension, > - using one-dimensional splines. > + bicubic interpolating function. > + Prior to computing an interpolating function, the > + > + org.apache.commons.math.analysis.interpolation.SmoothingPolynomialBicubicSplineInterpolator class performs > + smoothing of the data by computing the polynomial that best fits each of the one-dimensional curves along each > + of the coordinate axes. >

> > > > Added: commons/proper/math/trunk/src/test/java/org/apache/commons/math/analysis/interpolation/BicubicSplineInterpolatorTest.java > URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math/analysis/interpolation/BicubicSplineInterpolatorTest.java?rev=936295&view=auto > ============================================================================== > --- commons/proper/math/trunk/src/test/java/org/apache/commons/math/analysis/interpolation/BicubicSplineInterpolatorTest.java (added) > +++ commons/proper/math/trunk/src/test/java/org/apache/commons/math/analysis/interpolation/BicubicSplineInterpolatorTest.java Wed Apr 21 13:27:44 2010 > @@ -0,0 +1,170 @@ > +/* > + * 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.BivariateRealFunction; > +import org.junit.Assert; > +import org.junit.Test; > + > +/** > + * Testcase for the bicubic interpolator. > + * > + * @version $Revision: 821626 $ $Date: 2009-10-04 23:57:30 +0200 (Sun, 04 Oct 2009) $ > + */ > +public final class BicubicSplineInterpolatorTest { > + /** > + * 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[xval.length][yval.length]; > + > + BivariateRealGridInterpolator interpolator = new BicubicSplineInterpolator(); > + > + @SuppressWarnings("unused") > + BivariateRealFunction p = interpolator.interpolate(xval, yval, zval); > + > + double[] wxval = new double[] {3, 2, 5, 6.5}; > + try { > + p = interpolator.interpolate(wxval, yval, zval); > + 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); > + Assert.fail("an exception should have been thrown"); > + } catch (IllegalArgumentException e) { > + // Expected > + } > + > + double[][] wzval = new double[xval.length][yval.length + 1]; > + try { > + p = interpolator.interpolate(xval, yval, wzval); > + Assert.fail("an exception should have been thrown"); > + } catch (DimensionMismatchException e) { > + // Expected > + } > + wzval = new double[xval.length - 1][yval.length]; > + try { > + p = interpolator.interpolate(xval, yval, wzval); > + Assert.fail("an exception should have been thrown"); > + } catch (DimensionMismatchException e) { > + // Expected > + } > + } > + > + /** > + * Test of interpolator for a plane. > + *

> + * z = 2 x - 3 y + 5 > + */ > + @Test > + public void testPlane() throws MathException { > + BivariateRealFunction f = new BivariateRealFunction() { > + public double value(double x, double y) { > + return 2 * x - 3 * y + 5; > + } > + }; > + > + BivariateRealGridInterpolator interpolator = new BicubicSplineInterpolator(); > + > + double[] xval = new double[] {3, 4, 5, 6.5}; > + double[] yval = new double[] {-4, -3, -1, 2, 2.5}; > + double[][] zval = new double[xval.length][yval.length]; > + for (int i = 0; i < xval.length; i++) { > + for (int j = 0; j < yval.length; j++) { > + zval[i][j] = f.value(xval[i], yval[j]); > + } > + } > + > + BivariateRealFunction p = interpolator.interpolate(xval, yval, zval); > + double x, y; > + double expected, result; > + > + x = 4; > + y = -3; > + expected = f.value(x, y); > + result = p.value(x, y); > + Assert.assertEquals("On sample point", expected, result, 1e-15); > + > + x = 4.5; > + y = -1.5; > + expected = f.value(x, y); > + result = p.value(x, y); > + Assert.assertEquals("half-way between sample points (middle of the patch)", expected, result, 0.3); > + > + x = 3.5; > + y = -3.5; > + expected = f.value(x, y); > + result = p.value(x, y); > + Assert.assertEquals("half-way between sample points (border of the patch)", expected, result, 0.3); > + } > + > + /** > + * Test of interpolator for a paraboloid. > + *

> + * z = 2 x2 - 3 y2 + 4 x y - 5 > + */ > + @Test > + public void testParaboloid() throws MathException { > + BivariateRealFunction f = new BivariateRealFunction() { > + public double value(double x, double y) { > + return 2 * x * x - 3 * y * y + 4 * x * y - 5; > + } > + }; > + > + BivariateRealGridInterpolator interpolator = new BicubicSplineInterpolator(); > + > + double[] xval = new double[] {3, 4, 5, 6.5}; > + double[] yval = new double[] {-4, -3, -2, -1, 0.5, 2.5}; > + double[][] zval = new double[xval.length][yval.length]; > + for (int i = 0; i < xval.length; i++) { > + for (int j = 0; j < yval.length; j++) { > + zval[i][j] = f.value(xval[i], yval[j]); > + } > + } > + > + BivariateRealFunction p = interpolator.interpolate(xval, yval, zval); > + double x, y; > + double expected, result; > + > + x = 5; > + y = 0.5; > + expected = f.value(x, y); > + result = p.value(x, y); > + Assert.assertEquals("On sample point", expected, result, 1e-13); > + > + x = 4.5; > + y = -1.5; > + expected = f.value(x, y); > + result = p.value(x, y); > + Assert.assertEquals("half-way between sample points (middle of the patch)", expected, result, 0.2); > + > + x = 3.5; > + y = -3.5; > + expected = f.value(x, y); > + result = p.value(x, y); > + Assert.assertEquals("half-way between sample points (border of the patch)", expected, result, 0.2); > + } > +} > > Modified: commons/proper/math/trunk/src/test/java/org/apache/commons/math/analysis/interpolation/SmoothingBicubicSplineInterpolatorTest.java > URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math/analysis/interpolation/SmoothingBicubicSplineInterpolatorTest.java?rev=936295&r1=936294&r2=936295&view=diff > ============================================================================== > --- commons/proper/math/trunk/src/test/java/org/apache/commons/math/analysis/interpolation/SmoothingBicubicSplineInterpolatorTest.java (original) > +++ commons/proper/math/trunk/src/test/java/org/apache/commons/math/analysis/interpolation/SmoothingBicubicSplineInterpolatorTest.java Wed Apr 21 13:27:44 2010 > @@ -26,6 +26,7 @@ import org.junit.Test; > * Testcase for the bicubic interpolator. > * > * @version $Revision: 821626 $ $Date: 2009-10-04 23:57:30 +0200 (Sun, 04 Oct 2009) $ > + * @deprecated To be removed in math 3.0 (when the class for which it is a test will also be removed). > */ > public final class SmoothingBicubicSplineInterpolatorTest { > /** > @@ -60,9 +61,9 @@ public final class SmoothingBicubicSplin > > double[][] wzval = new double[xval.length][yval.length + 1]; > try { > - p = interpolator.interpolate(xval, wyval, wzval); > + p = interpolator.interpolate(xval, yval, wzval); > Assert.fail("an exception should have been thrown"); > - } catch (IllegalArgumentException e) { > + } catch (DimensionMismatchException e) { > // Expected > } > wzval = new double[xval.length - 1][yval.length]; > > Added: commons/proper/math/trunk/src/test/java/org/apache/commons/math/analysis/interpolation/SmoothingPolynomialBicubicSplineInterpolatorTest.java > URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math/analysis/interpolation/SmoothingPolynomialBicubicSplineInterpolatorTest.java?rev=936295&view=auto > ============================================================================== > --- commons/proper/math/trunk/src/test/java/org/apache/commons/math/analysis/interpolation/SmoothingPolynomialBicubicSplineInterpolatorTest.java (added) > +++ commons/proper/math/trunk/src/test/java/org/apache/commons/math/analysis/interpolation/SmoothingPolynomialBicubicSplineInterpolatorTest.java Wed Apr 21 13:27:44 2010 > @@ -0,0 +1,179 @@ > +/* > + * 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.BivariateRealFunction; > +import org.junit.Assert; > +import org.junit.Test; > + > +/** > + * Testcase for the smoothing bicubic interpolator. > + * > + * @version $Revision$ $Date$ > + */ > +public final class SmoothingPolynomialBicubicSplineInterpolatorTest { > + /** > + * 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[xval.length][yval.length]; > + > + BivariateRealGridInterpolator interpolator = new SmoothingPolynomialBicubicSplineInterpolator(0); > + > + @SuppressWarnings("unused") > + BivariateRealFunction p = interpolator.interpolate(xval, yval, zval); > + > + double[] wxval = new double[] {3, 2, 5, 6.5}; > + try { > + p = interpolator.interpolate(wxval, yval, zval); > + 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); > + Assert.fail("an exception should have been thrown"); > + } catch (IllegalArgumentException e) { > + // Expected > + } > + > + double[][] wzval = new double[xval.length][yval.length + 1]; > + try { > + p = interpolator.interpolate(xval, yval, wzval); > + Assert.fail("an exception should have been thrown"); > + } catch (DimensionMismatchException e) { > + // Expected > + } > + wzval = new double[xval.length - 1][yval.length]; > + try { > + p = interpolator.interpolate(xval, yval, wzval); > + Assert.fail("an exception should have been thrown"); > + } catch (DimensionMismatchException e) { > + // Expected > + } > + wzval = new double[xval.length][yval.length - 1]; > + try { > + p = interpolator.interpolate(xval, yval, wzval); > + Assert.fail("an exception should have been thrown"); > + } catch (DimensionMismatchException e) { > + // Expected > + } > + } > + > + /** > + * Test of interpolator for a plane. > + *

> + * z = 2 x - 3 y + 5 > + */ > + @Test > + public void testPlane() throws MathException { > + BivariateRealFunction f = new BivariateRealFunction() { > + public double value(double x, double y) { > + return 2 * x - 3 * y + 5 > + + ((int) (Math.abs(5 * x + 3 * y)) % 2 == 0 ? 1 : -1); > + } > + }; > + > + BivariateRealGridInterpolator interpolator = new SmoothingPolynomialBicubicSplineInterpolator(1); > + > + double[] xval = new double[] {3, 4, 5, 6.5}; > + double[] yval = new double[] {-4, -3, -1, 2, 2.5}; > + double[][] zval = new double[xval.length][yval.length]; > + for (int i = 0; i < xval.length; i++) { > + for (int j = 0; j < yval.length; j++) { > + zval[i][j] = f.value(xval[i], yval[j]); > + } > + } > + > + BivariateRealFunction p = interpolator.interpolate(xval, yval, zval); > + double x, y; > + double expected, result; > + > + x = 4; > + y = -3; > + expected = f.value(x, y); > + result = p.value(x, y); > + Assert.assertEquals("On sample point", expected, result, 2); > + > + x = 4.5; > + y = -1.5; > + expected = f.value(x, y); > + result = p.value(x, y); > + Assert.assertEquals("half-way between sample points (middle of the patch)", expected, result, 2); > + > + x = 3.5; > + y = -3.5; > + expected = f.value(x, y); > + result = p.value(x, y); > + Assert.assertEquals("half-way between sample points (border of the patch)", expected, result, 2); > + } > + > + /** > + * Test of interpolator for a paraboloid. > + *

> + * z = 2 x2 - 3 y2 + 4 x y - 5 > + */ > + @Test > + public void testParaboloid() throws MathException { > + BivariateRealFunction f = new BivariateRealFunction() { > + public double value(double x, double y) { > + return 2 * x * x - 3 * y * y + 4 * x * y - 5 > + + ((int) (Math.abs(5 * x + 3 * y)) % 2 == 0 ? 1 : -1); > + } > + }; > + > + BivariateRealGridInterpolator interpolator = new SmoothingPolynomialBicubicSplineInterpolator(4); > + > + double[] xval = new double[] {3, 4, 5, 6.5}; > + double[] yval = new double[] {-4, -3, -2, -1, 0.5, 2.5}; > + double[][] zval = new double[xval.length][yval.length]; > + for (int i = 0; i < xval.length; i++) { > + for (int j = 0; j < yval.length; j++) { > + zval[i][j] = f.value(xval[i], yval[j]); > + } > + } > + > + BivariateRealFunction p = interpolator.interpolate(xval, yval, zval); > + double x, y; > + double expected, result; > + > + x = 5; > + y = 0.5; > + expected = f.value(x, y); > + result = p.value(x, y); > + Assert.assertEquals("On sample point", expected, result, 2); > + > + x = 4.5; > + y = -1.5; > + expected = f.value(x, y); > + result = p.value(x, y); > + Assert.assertEquals("half-way between sample points (middle of the patch)", expected, result, 2); > + > + x = 3.5; > + y = -3.5; > + expected = f.value(x, y); > + result = p.value(x, y); > + Assert.assertEquals("half-way between sample points (border of the patch)", expected, result, 2); > + } > +} > > > --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org For additional commands, e-mail: dev-help@commons.apache.org