You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by Luc Maisonobe <Lu...@free.fr> on 2010/04/21 16:31:25 UTC

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/...

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
<http://www.apache.org/dev/version-control.html#https-svn-config> and
<http://www.apache.org/dev/svn-eol-style.txt>.

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. ">
> +      <action dev="erans" type="update" issue="MATH-365">
> +        Deprecated SmoothingBicubicSplineInterpolator and SmoothingBicubicSplineInterpolatorTest.
> +        Added BicubicSplineInterpolator and BicubicSplineInterpolatorTest.
> +        Added SmoothingPolynomialBicubicSplineInterpolator and SmoothingPolynomialBicubicSplineInterpolatorTest.
> +        Added method to clear the list of observations in PolynomialFitter.
> +      </action>
>        <action dev="sebb" type="fix" issue="MATH-360">
>          Fix use of wrong variable in SmoothingBicubicSplineInterpolatorTest.testPreconditions()
>        </action>
> 
> 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
>          </p>
>          <p>
>            From two-dimensional data sampled on a regular grid, the
> -          <a href="../apidocs/org/apache/commons/math/analysis/interpolation/SmoothingBicubicSplineInterpolator.html">
> -          org.apache.commons.math.analysis.interpolation.SmoothingBicubicSplineInterpolator</a>
> +          <a href="../apidocs/org/apache/commons/math/analysis/interpolation/BicubicSplineInterpolator.html">
> +          org.apache.commons.math.analysis.interpolation.BicubicSplineInterpolator</a>
>            computes a <a href="../apidocs/org/apache/commons/math/analysis/interpolation/BicubicSplineInterpolatingFunction.html">
> -          bicubic interpolating function</a>. The data is first smoothed, along each grid dimension,
> -          using one-dimensional splines.
> +          bicubic interpolating function</a>.
> +          Prior to computing an interpolating function, the
> +          <a href="../apidocs/org/apache/commons/math/analysis/interpolation/SmoothingPolynomialBicubicSplineInterpolator.html">
> +          org.apache.commons.math.analysis.interpolation.SmoothingPolynomialBicubicSplineInterpolator</a> 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.
>          </p>
>        </subsection>
>        <subsection name="4.4 Integration" href="integration">
> 
> 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.
> +     * <p>
> +     * 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.
> +     * <p>
> +     * z = 2 x<sup>2</sup> - 3 y<sup>2</sup> + 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.
> +     * <p>
> +     * 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.
> +     * <p>
> +     * z = 2 x<sup>2</sup> - 3 y<sup>2</sup> + 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