mirror of
https://github.com/apache/commons-math.git
synced 2025-03-03 23:19:05 +00:00
MATH-458
Removed the checked "MathException" from the interpolator interfaces. Updated all affected classes. "LoessInterpolator": Replaced usage of "MathException" with specific exceptions. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/math/trunk@1055931 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
81d30ccd16
commit
bef6c18699
@ -16,7 +16,6 @@
|
||||
*/
|
||||
package org.apache.commons.math.analysis.interpolation;
|
||||
|
||||
import org.apache.commons.math.MathException;
|
||||
import org.apache.commons.math.analysis.UnivariateRealFunction;
|
||||
import org.apache.commons.math.analysis.polynomials.PolynomialSplineFunction;
|
||||
import org.apache.commons.math.exception.DimensionMismatchException;
|
||||
@ -36,8 +35,7 @@ public class BicubicSplineInterpolator
|
||||
*/
|
||||
public BicubicSplineInterpolatingFunction interpolate(final double[] xval,
|
||||
final double[] yval,
|
||||
final double[][] fval)
|
||||
throws MathException {
|
||||
final double[][] fval) {
|
||||
if (xval.length == 0 || yval.length == 0 || fval.length == 0) {
|
||||
throw new NoDataException();
|
||||
}
|
||||
|
@ -16,7 +16,6 @@
|
||||
*/
|
||||
package org.apache.commons.math.analysis.interpolation;
|
||||
|
||||
import org.apache.commons.math.MathException;
|
||||
import org.apache.commons.math.analysis.BivariateRealFunction;
|
||||
|
||||
/**
|
||||
@ -27,7 +26,7 @@ import org.apache.commons.math.analysis.BivariateRealFunction;
|
||||
*/
|
||||
public interface BivariateRealGridInterpolator {
|
||||
/**
|
||||
* Computes an interpolating function for the data set.
|
||||
* Compute an interpolating function for the dataset.
|
||||
*
|
||||
* @param xval All the x-coordinates of the interpolation points, sorted
|
||||
* in increasing order.
|
||||
@ -35,10 +34,12 @@ public interface BivariateRealGridInterpolator {
|
||||
* in increasing order.
|
||||
* @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.
|
||||
* @return a function which interpolates the dataset.
|
||||
* @throws org.apache.commons.math.exception.NoDataException if any of
|
||||
* the arrays has zero length.
|
||||
* @throws org.apache.commons.math.exception.DimensionMismatchException
|
||||
* if the array lengths are inconsistent.
|
||||
*/
|
||||
BivariateRealFunction interpolate(double[] xval, double[] yval, double[][] fval)
|
||||
throws MathException;
|
||||
BivariateRealFunction interpolate(double[] xval, double[] yval,
|
||||
double[][] fval);
|
||||
}
|
||||
|
@ -19,11 +19,16 @@ package org.apache.commons.math.analysis.interpolation;
|
||||
import java.io.Serializable;
|
||||
import java.util.Arrays;
|
||||
|
||||
import org.apache.commons.math.MathException;
|
||||
import org.apache.commons.math.analysis.polynomials.PolynomialSplineFunction;
|
||||
import org.apache.commons.math.exception.NotPositiveException;
|
||||
import org.apache.commons.math.exception.OutOfRangeException;
|
||||
import org.apache.commons.math.exception.DimensionMismatchException;
|
||||
import org.apache.commons.math.exception.NoDataException;
|
||||
import org.apache.commons.math.exception.NumberIsTooSmallException;
|
||||
import org.apache.commons.math.exception.util.Localizable;
|
||||
import org.apache.commons.math.exception.util.LocalizedFormats;
|
||||
import org.apache.commons.math.util.FastMath;
|
||||
import org.apache.commons.math.util.MathUtils;
|
||||
|
||||
/**
|
||||
* Implements the <a href="http://en.wikipedia.org/wiki/Local_regression">
|
||||
@ -43,22 +48,17 @@ import org.apache.commons.math.util.FastMath;
|
||||
*/
|
||||
public class LoessInterpolator
|
||||
implements UnivariateRealInterpolator, Serializable {
|
||||
|
||||
/** Default value of the bandwidth parameter. */
|
||||
public static final double DEFAULT_BANDWIDTH = 0.3;
|
||||
|
||||
/** Default value of the number of robustness iterations. */
|
||||
public static final int DEFAULT_ROBUSTNESS_ITERS = 2;
|
||||
|
||||
/**
|
||||
* Default value for accuracy.
|
||||
* @since 2.1
|
||||
*/
|
||||
public static final double DEFAULT_ACCURACY = 1e-12;
|
||||
|
||||
/** serializable version identifier. */
|
||||
private static final long serialVersionUID = 5204927143605193821L;
|
||||
|
||||
/**
|
||||
* The bandwidth parameter: when computing the loess fit at
|
||||
* a particular point, this fraction of source points closest
|
||||
@ -68,7 +68,6 @@ public class LoessInterpolator
|
||||
* A sensible value is usually 0.25 to 0.5.
|
||||
*/
|
||||
private final double bandwidth;
|
||||
|
||||
/**
|
||||
* The number of robustness iterations parameter: this many
|
||||
* robustness iterations are done.
|
||||
@ -77,7 +76,6 @@ public class LoessInterpolator
|
||||
* robustness iterations) to 4.
|
||||
*/
|
||||
private final int robustnessIters;
|
||||
|
||||
/**
|
||||
* If the median residual at a certain robustness iteration
|
||||
* is less than this amount, no more iterations are done.
|
||||
@ -99,7 +97,7 @@ public class LoessInterpolator
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a new {@link LoessInterpolator}
|
||||
* Construct a new {@link LoessInterpolator}
|
||||
* with given bandwidth and number of robustness iterations.
|
||||
* <p>
|
||||
* Calling this constructor is equivalent to calling {link {@link
|
||||
@ -117,16 +115,15 @@ public class LoessInterpolator
|
||||
* A sensible value is usually 0 (just the initial fit without any
|
||||
* robustness iterations) to 4, the default value is
|
||||
* {@link #DEFAULT_ROBUSTNESS_ITERS}.
|
||||
* @throws MathException if bandwidth does not lie in the interval [0,1]
|
||||
* or if robustnessIters is negative.
|
||||
|
||||
* @see #LoessInterpolator(double, int, double)
|
||||
*/
|
||||
public LoessInterpolator(double bandwidth, int robustnessIters) throws MathException {
|
||||
public LoessInterpolator(double bandwidth, int robustnessIters) {
|
||||
this(bandwidth, robustnessIters, DEFAULT_ACCURACY);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a new {@link LoessInterpolator}
|
||||
* Construct a new {@link LoessInterpolator}
|
||||
* with given bandwidth, number of robustness iterations and accuracy.
|
||||
*
|
||||
* @param bandwidth when computing the loess fit at
|
||||
@ -141,19 +138,19 @@ public class LoessInterpolator
|
||||
* {@link #DEFAULT_ROBUSTNESS_ITERS}.
|
||||
* @param accuracy If the median residual at a certain robustness iteration
|
||||
* is less than this amount, no more iterations are done.
|
||||
* @throws MathException if bandwidth does not lie in the interval [0,1]
|
||||
* or if robustnessIters is negative.
|
||||
* @throws OutOfRangeException if bandwidth does not lie in the interval [0,1].
|
||||
* @throws NotPositiveException if {@code robustnessIters} is negative.
|
||||
* @see #LoessInterpolator(double, int)
|
||||
* @since 2.1
|
||||
*/
|
||||
public LoessInterpolator(double bandwidth, int robustnessIters, double accuracy) throws MathException {
|
||||
if (bandwidth < 0 || bandwidth > 1) {
|
||||
throw new MathException(LocalizedFormats.BANDWIDTH_OUT_OF_INTERVAL,
|
||||
bandwidth);
|
||||
public LoessInterpolator(double bandwidth, int robustnessIters, double accuracy) {
|
||||
if (bandwidth < 0 ||
|
||||
bandwidth > 1) {
|
||||
throw new OutOfRangeException(LocalizedFormats.BANDWIDTH, bandwidth, 0, 1);
|
||||
}
|
||||
this.bandwidth = bandwidth;
|
||||
if (robustnessIters < 0) {
|
||||
throw new MathException(LocalizedFormats.NEGATIVE_ROBUSTNESS_ITERATIONS, robustnessIters);
|
||||
throw new NotPositiveException(LocalizedFormats.ROBUSTNESS_ITERATIONS, robustnessIters);
|
||||
}
|
||||
this.robustnessIters = robustnessIters;
|
||||
this.accuracy = accuracy;
|
||||
@ -169,51 +166,58 @@ public class LoessInterpolator
|
||||
* @param xval the arguments for the interpolation points
|
||||
* @param yval the values for the interpolation points
|
||||
* @return A cubic spline built upon a loess fit to the data at the original abscissae
|
||||
* @throws MathException if some of the following conditions are false:
|
||||
* <ul>
|
||||
* <li> Arguments and values are of the same size that is greater than zero</li>
|
||||
* <li> The arguments are in a strictly increasing order</li>
|
||||
* <li> All arguments and values are finite real numbers</li>
|
||||
* </ul>
|
||||
* @throws org.apache.commons.math.exception.NonMonotonousSequenceException
|
||||
* if {@code xval} not sorted in strictly increasing order.
|
||||
* @throws DimensionMismatchException if {@code xval} and {@code yval} have
|
||||
* different sizes.
|
||||
* @throws NoDataException if {@code xval} or {@code yval} has zero size.
|
||||
* @throws org.apache.commons.math.exception.NotFiniteNumberException if
|
||||
* any of the arguments and values are not finite real numbers.
|
||||
* @throws NumberIsTooSmallException if the bandwidth is too small to
|
||||
* accomodate the size of the input data (i.e. the bandwidth must be
|
||||
* larger than 2/n).
|
||||
*/
|
||||
public final PolynomialSplineFunction interpolate(
|
||||
final double[] xval, final double[] yval) throws MathException {
|
||||
public final PolynomialSplineFunction interpolate(final double[] xval, final double[] yval) {
|
||||
return new SplineInterpolator().interpolate(xval, smooth(xval, yval));
|
||||
}
|
||||
|
||||
/**
|
||||
* Compute a weighted loess fit on the data at the original abscissae.
|
||||
*
|
||||
* @param xval the arguments for the interpolation points
|
||||
* @param yval the values for the interpolation points
|
||||
* @param weights point weights: coefficients by which the robustness weight of a point is multiplied
|
||||
* @return values of the loess fit at corresponding original abscissae
|
||||
* @throws MathException if some of the following conditions are false:
|
||||
* <ul>
|
||||
* <li> Arguments and values are of the same size that is greater than zero</li>
|
||||
* <li> The arguments are in a strictly increasing order</li>
|
||||
* <li> All arguments and values are finite real numbers</li>
|
||||
* </ul>
|
||||
* @param xval Arguments for the interpolation points.
|
||||
* @param yval Values for the interpolation points.
|
||||
* @param weights point weights: coefficients by which the robustness weight
|
||||
* of a point is multiplied.
|
||||
* @return the values of the loess fit at corresponding original abscissae.
|
||||
* @throws org.apache.commons.math.exception.NonMonotonousSequenceException
|
||||
* if {@code xval} not sorted in strictly increasing order.
|
||||
* @throws DimensionMismatchException if {@code xval} and {@code yval} have
|
||||
* different sizes.
|
||||
* @throws NoDataException if {@code xval} or {@code yval} has zero size.
|
||||
* @throws org.apache.commons.math.exception.NotFiniteNumberException if
|
||||
* any of the arguments and values are not finite real numbers.
|
||||
* @throws NumberIsTooSmallException if the bandwidth is too small to
|
||||
* accomodate the size of the input data (i.e. the bandwidth must be
|
||||
* larger than 2/n).
|
||||
* @since 2.1
|
||||
*/
|
||||
public final double[] smooth(final double[] xval, final double[] yval, final double[] weights)
|
||||
throws MathException {
|
||||
public final double[] smooth(final double[] xval, final double[] yval,
|
||||
final double[] weights) {
|
||||
if (xval.length != yval.length) {
|
||||
throw new MathException(LocalizedFormats.MISMATCHED_LOESS_ABSCISSA_ORDINATE_ARRAYS,
|
||||
xval.length, yval.length);
|
||||
throw new DimensionMismatchException(xval.length, yval.length);
|
||||
}
|
||||
|
||||
final int n = xval.length;
|
||||
|
||||
if (n == 0) {
|
||||
throw new MathException(LocalizedFormats.LOESS_EXPECTS_AT_LEAST_ONE_POINT);
|
||||
throw new NoDataException();
|
||||
}
|
||||
|
||||
checkAllFiniteReal(xval, LocalizedFormats.NON_REAL_FINITE_ABSCISSA);
|
||||
checkAllFiniteReal(yval, LocalizedFormats.NON_REAL_FINITE_ORDINATE);
|
||||
checkAllFiniteReal(weights, LocalizedFormats.NON_REAL_FINITE_WEIGHT);
|
||||
checkAllFiniteReal(xval);
|
||||
checkAllFiniteReal(yval);
|
||||
checkAllFiniteReal(weights);
|
||||
|
||||
checkStrictlyIncreasing(xval);
|
||||
MathUtils.checkOrder(xval);
|
||||
|
||||
if (n == 1) {
|
||||
return new double[]{yval[0]};
|
||||
@ -226,8 +230,8 @@ public class LoessInterpolator
|
||||
int bandwidthInPoints = (int) (bandwidth * n);
|
||||
|
||||
if (bandwidthInPoints < 2) {
|
||||
throw new MathException(LocalizedFormats.TOO_SMALL_BANDWIDTH,
|
||||
n, 2.0 / n, bandwidth);
|
||||
throw new NumberIsTooSmallException(LocalizedFormats.BANDWIDTH,
|
||||
bandwidthInPoints, 2, true);
|
||||
}
|
||||
|
||||
final double[] res = new double[n];
|
||||
@ -349,18 +353,20 @@ public class LoessInterpolator
|
||||
* @param xval the arguments for the interpolation points
|
||||
* @param yval the values for the interpolation points
|
||||
* @return values of the loess fit at corresponding original abscissae
|
||||
* @throws MathException if some of the following conditions are false:
|
||||
* <ul>
|
||||
* <li> Arguments and values are of the same size that is greater than zero</li>
|
||||
* <li> The arguments are in a strictly increasing order</li>
|
||||
* <li> All arguments and values are finite real numbers</li>
|
||||
* </ul>
|
||||
* @throws org.apache.commons.math.exception.NonMonotonousSequenceException
|
||||
* if {@code xval} not sorted in strictly increasing order.
|
||||
* @throws DimensionMismatchException if {@code xval} and {@code yval} have
|
||||
* different sizes.
|
||||
* @throws NoDataException if {@code xval} or {@code yval} has zero size.
|
||||
* @throws org.apache.commons.math.exception.NotFiniteNumberException if
|
||||
* any of the arguments and values are not finite real numbers.
|
||||
* @throws NumberIsTooSmallException if the bandwidth is too small to
|
||||
* accomodate the size of the input data (i.e. the bandwidth must be
|
||||
* larger than 2/n).
|
||||
*/
|
||||
public final double[] smooth(final double[] xval, final double[] yval)
|
||||
throws MathException {
|
||||
public final double[] smooth(final double[] xval, final double[] yval) {
|
||||
if (xval.length != yval.length) {
|
||||
throw new MathException(LocalizedFormats.MISMATCHED_LOESS_ABSCISSA_ORDINATE_ARRAYS,
|
||||
xval.length, yval.length);
|
||||
throw new DimensionMismatchException(xval.length, yval.length);
|
||||
}
|
||||
|
||||
final double[] unitWeights = new double[xval.length];
|
||||
@ -371,16 +377,17 @@ public class LoessInterpolator
|
||||
|
||||
/**
|
||||
* Given an index interval into xval that embraces a certain number of
|
||||
* points closest to xval[i-1], update the interval so that it embraces
|
||||
* the same number of points closest to xval[i], ignoring zero weights.
|
||||
* points closest to {@code xval[i-1]}, update the interval so that it
|
||||
* embraces the same number of points closest to {@code xval[i]},
|
||||
* ignoring zero weights.
|
||||
*
|
||||
* @param xval arguments array
|
||||
* @param weights weights array
|
||||
* @param i the index around which the new interval should be computed
|
||||
* @param bandwidthInterval a two-element array {left, right} such that: <p/>
|
||||
* <tt>(left==0 or xval[i] - xval[left-1] > xval[right] - xval[i])</tt>
|
||||
* <p/> and also <p/>
|
||||
* <tt>(right==xval.length-1 or xval[right+1] - xval[i] > xval[i] - xval[left])</tt>.
|
||||
* @param xval Arguments array.
|
||||
* @param weights Weights array.
|
||||
* @param i Index around which the new interval should be computed.
|
||||
* @param bandwidthInterval a two-element array {left, right} such that:
|
||||
* {@code (left==0 or xval[i] - xval[left-1] > xval[right] - xval[i])}
|
||||
* and
|
||||
* {@code (right==xval.length-1 or xval[right+1] - xval[i] > xval[i] - xval[left])}.
|
||||
* The array will be updated.
|
||||
*/
|
||||
private static void updateBandwidthInterval(final double[] xval, final double[] weights,
|
||||
@ -400,15 +407,17 @@ public class LoessInterpolator
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the smallest index j such that j > i && (j==weights.length || weights[j] != 0)
|
||||
* @param weights weights array
|
||||
* @param i the index from which to start search; must be < weights.length
|
||||
* @return the smallest index j such that j > i && (j==weights.length || weights[j] != 0)
|
||||
* Return the smallest index {@code j} such that
|
||||
* {@code j > i && (j == weights.length || weights[j] != 0)}.
|
||||
*
|
||||
* @param weights Weights array.
|
||||
* @param i Index from which to start search.
|
||||
* @return the smallest compliant index.
|
||||
*/
|
||||
private static int nextNonzero(final double[] weights, final int i) {
|
||||
int j = i + 1;
|
||||
while(j < weights.length && weights[j] == 0) {
|
||||
j++;
|
||||
++j;
|
||||
}
|
||||
return j;
|
||||
}
|
||||
@ -418,8 +427,8 @@ public class LoessInterpolator
|
||||
* <a href="http://en.wikipedia.org/wiki/Local_regression#Weight_function">tricube</a>
|
||||
* weight function
|
||||
*
|
||||
* @param x the argument
|
||||
* @return (1-|x|^3)^3
|
||||
* @param x Argument.
|
||||
* @return <code>(1 - |x|<sup>3</sup>)<sup>3</sup></code>.
|
||||
*/
|
||||
private static double tricube(final double x) {
|
||||
final double tmp = 1 - x * x * x;
|
||||
@ -429,35 +438,13 @@ public class LoessInterpolator
|
||||
/**
|
||||
* Check that all elements of an array are finite real numbers.
|
||||
*
|
||||
* @param values the values array
|
||||
* @param pattern pattern of the error message
|
||||
* @throws MathException if one of the values is not a finite real number
|
||||
* @param values Values array.
|
||||
* @throws org.apache.commons.math.exception.NotFiniteNumberException
|
||||
* if one of the values is not a finite real number.
|
||||
*/
|
||||
private static void checkAllFiniteReal(final double[] values, final Localizable pattern)
|
||||
throws MathException {
|
||||
private static void checkAllFiniteReal(final double[] values) {
|
||||
for (int i = 0; i < values.length; i++) {
|
||||
final double x = values[i];
|
||||
if (Double.isInfinite(x) || Double.isNaN(x)) {
|
||||
throw new MathException(pattern, i, x);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check that elements of the abscissae array are in a strictly
|
||||
* increasing order.
|
||||
*
|
||||
* @param xval the abscissae array
|
||||
* @throws MathException if the abscissae array
|
||||
* is not in a strictly increasing order
|
||||
*/
|
||||
private static void checkStrictlyIncreasing(final double[] xval)
|
||||
throws MathException {
|
||||
for (int i = 0; i < xval.length; ++i) {
|
||||
if (i >= 1 && xval[i - 1] >= xval[i]) {
|
||||
throw new MathException(LocalizedFormats.OUT_OF_ORDER_ABSCISSA_ARRAY,
|
||||
i - 1, xval[i - 1], i, xval[i]);
|
||||
}
|
||||
MathUtils.checkFinite(values[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -18,7 +18,6 @@ package org.apache.commons.math.analysis.interpolation;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
import org.apache.commons.math.MathException;
|
||||
import org.apache.commons.math.analysis.polynomials.PolynomialFunctionLagrangeForm;
|
||||
|
||||
/**
|
||||
@ -45,10 +44,14 @@ public class NevilleInterpolator implements UnivariateRealInterpolator,
|
||||
* @param x the interpolating points array
|
||||
* @param y the interpolating values array
|
||||
* @return a function which interpolates the data set
|
||||
* @throws MathException if arguments are invalid
|
||||
* @throws org.apache.commons.math.exception.DimensionMismatchException if
|
||||
* the array lengths are different.
|
||||
* @throws org.apache.commons.math.exception.NumberIsTooSmallException if
|
||||
* the number of points is less than 2.
|
||||
* @throws org.apache.commons.math.exception.NonMonotonousSequenceException
|
||||
* if two abscissae have the same value.
|
||||
*/
|
||||
public PolynomialFunctionLagrangeForm interpolate(double x[], double y[])
|
||||
throws MathException {
|
||||
public PolynomialFunctionLagrangeForm interpolate(double x[], double y[]) {
|
||||
return new PolynomialFunctionLagrangeForm(x, y);
|
||||
}
|
||||
}
|
||||
|
@ -18,7 +18,6 @@ package org.apache.commons.math.analysis.interpolation;
|
||||
|
||||
import org.apache.commons.math.exception.DimensionMismatchException;
|
||||
import org.apache.commons.math.exception.NoDataException;
|
||||
import org.apache.commons.math.MathException;
|
||||
import org.apache.commons.math.util.MathUtils;
|
||||
import org.apache.commons.math.optimization.general.GaussNewtonOptimizer;
|
||||
import org.apache.commons.math.optimization.fitting.PolynomialFitter;
|
||||
@ -73,8 +72,7 @@ public class SmoothingPolynomialBicubicSplineInterpolator
|
||||
@Override
|
||||
public BicubicSplineInterpolatingFunction interpolate(final double[] xval,
|
||||
final double[] yval,
|
||||
final double[][] fval)
|
||||
throws MathException {
|
||||
final double[][] fval) {
|
||||
if (xval.length == 0 || yval.length == 0 || fval.length == 0) {
|
||||
throw new NoDataException();
|
||||
}
|
||||
|
@ -18,7 +18,6 @@ package org.apache.commons.math.analysis.interpolation;
|
||||
|
||||
import org.apache.commons.math.exception.DimensionMismatchException;
|
||||
import org.apache.commons.math.exception.NoDataException;
|
||||
import org.apache.commons.math.MathException;
|
||||
import org.apache.commons.math.util.MathUtils;
|
||||
|
||||
/**
|
||||
@ -35,8 +34,7 @@ public class TricubicSplineInterpolator
|
||||
public TricubicSplineInterpolatingFunction interpolate(final double[] xval,
|
||||
final double[] yval,
|
||||
final double[] zval,
|
||||
final double[][][] fval)
|
||||
throws MathException {
|
||||
final double[][][] fval) {
|
||||
if (xval.length == 0 || yval.length == 0 || zval.length == 0 || fval.length == 0) {
|
||||
throw new NoDataException();
|
||||
}
|
||||
|
@ -16,7 +16,6 @@
|
||||
*/
|
||||
package org.apache.commons.math.analysis.interpolation;
|
||||
|
||||
import org.apache.commons.math.MathException;
|
||||
import org.apache.commons.math.analysis.TrivariateRealFunction;
|
||||
|
||||
/**
|
||||
@ -28,7 +27,7 @@ import org.apache.commons.math.analysis.TrivariateRealFunction;
|
||||
*/
|
||||
public interface TrivariateRealGridInterpolator {
|
||||
/**
|
||||
* Computes an interpolating function for the data set.
|
||||
* Compute an interpolating function for the dataset.
|
||||
*
|
||||
* @param xval All the x-coordinates of the interpolation points, sorted
|
||||
* in increasing order.
|
||||
@ -39,11 +38,11 @@ public interface TrivariateRealGridInterpolator {
|
||||
* @param fval the values of the interpolation points on all the grid knots:
|
||||
* {@code fval[i][j][k] = f(xval[i], yval[j], zval[k])}.
|
||||
* @return a function that interpolates the data set.
|
||||
* @throws org.apache.commons.math.exception.NoDataException if any of the arrays has zero length.
|
||||
* @throws org.apache.commons.math.exception.DimensionMismatchException if the array lengths are inconsistent.
|
||||
* @throws MathException if arguments violate assumptions made by the
|
||||
* interpolation algorithm.
|
||||
* @throws org.apache.commons.math.exception.NoDataException if any of
|
||||
* the arrays has zero length.
|
||||
* @throws org.apache.commons.math.exception.DimensionMismatchException
|
||||
* if the array lengths are inconsistent.
|
||||
*/
|
||||
TrivariateRealFunction interpolate(double[] xval, double[] yval, double[] zval, double[][][] fval)
|
||||
throws MathException;
|
||||
TrivariateRealFunction interpolate(double[] xval, double[] yval, double[] zval,
|
||||
double[][][] fval);
|
||||
}
|
||||
|
@ -16,7 +16,6 @@
|
||||
*/
|
||||
package org.apache.commons.math.analysis.interpolation;
|
||||
|
||||
import org.apache.commons.math.MathException;
|
||||
import org.apache.commons.math.analysis.UnivariateRealFunction;
|
||||
|
||||
/**
|
||||
@ -25,15 +24,14 @@ import org.apache.commons.math.analysis.UnivariateRealFunction;
|
||||
* @version $Revision$ $Date$
|
||||
*/
|
||||
public interface UnivariateRealInterpolator {
|
||||
|
||||
/**
|
||||
* Computes an interpolating function for the data set.
|
||||
* @param xval the arguments for the interpolation points
|
||||
* @param yval the values for the interpolation points
|
||||
* @return a function which interpolates the data set
|
||||
* @throws MathException if arguments violate assumptions made by the
|
||||
* interpolation algorithm
|
||||
* Compute an interpolating function for the dataset.
|
||||
*
|
||||
* @param xval Arguments for the interpolation points.
|
||||
* @param yval Values for the interpolation points.
|
||||
* @return a function which interpolates the dataset.
|
||||
* @throws org.apache.commons.math.exception.MathRuntimeException if the
|
||||
* arguments violate assumptions made by the interpolation algorithm.
|
||||
*/
|
||||
UnivariateRealFunction interpolate(double xval[], double yval[])
|
||||
throws MathException;
|
||||
UnivariateRealFunction interpolate(double xval[], double yval[]);
|
||||
}
|
||||
|
@ -63,7 +63,10 @@ public class PolynomialFunctionLagrangeForm implements UnivariateRealFunction {
|
||||
*
|
||||
* @param x interpolating points
|
||||
* @param y function values at interpolating points
|
||||
* @throws IllegalArgumentException if input arrays are not valid
|
||||
* @throws DimensionMismatchException if the array lengths are different.
|
||||
* @throws NumberIsTooSmallException if the number of points is less than 2.
|
||||
* @throws org.apache.commons.math.exception.NonMonotonousSequenceException
|
||||
* if two abscissae have the same value.
|
||||
*/
|
||||
public PolynomialFunctionLagrangeForm(double x[], double y[]) {
|
||||
this.x = new double[x.length];
|
||||
|
@ -36,8 +36,8 @@ public class NotFiniteNumberException extends MathIllegalNumberException {
|
||||
* @param args Optional arguments.
|
||||
*/
|
||||
public NotFiniteNumberException(Number wrong,
|
||||
Object ... arguments) {
|
||||
this(null, wrong, arguments);
|
||||
Object ... args) {
|
||||
this(null, wrong, args);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -49,8 +49,8 @@ public class NotFiniteNumberException extends MathIllegalNumberException {
|
||||
*/
|
||||
public NotFiniteNumberException(Localizable specific,
|
||||
Number wrong,
|
||||
Object ... arguments) {
|
||||
Object ... args) {
|
||||
super(specific, LocalizedFormats.NOT_FINITE_NUMBER,
|
||||
wrong, arguments);
|
||||
wrong, args);
|
||||
}
|
||||
}
|
||||
|
@ -47,7 +47,7 @@ public enum LocalizedFormats implements Localizable {
|
||||
ASSYMETRIC_EIGEN_NOT_SUPPORTED("eigen decomposition of assymetric matrices not supported yet"),
|
||||
AT_LEAST_ONE_COLUMN("matrix must have at least one column"),
|
||||
AT_LEAST_ONE_ROW("matrix must have at least one row"),
|
||||
BANDWIDTH_OUT_OF_INTERVAL("bandwidth must be in the interval [0,1], but got {0}"),
|
||||
BANDWIDTH("bandwidth ({0})"),
|
||||
BINOMIAL_INVALID_PARAMETERS_ORDER("must have n >= k for binomial coefficient (n, k), got k = {0}, n = {1}"),
|
||||
BINOMIAL_NEGATIVE_PARAMETER("must have n >= 0 for binomial coefficient (n, k), got n = {0}"),
|
||||
CANNOT_CLEAR_STATISTIC_CONSTRUCTED_FROM_EXTERNAL_MOMENTS("statistics constructed from external moments cannot be cleared"),
|
||||
@ -160,7 +160,7 @@ public enum LocalizedFormats implements Localizable {
|
||||
NUMBER_OF_SUCCESSES("number of successes ({0})"), /* keep */
|
||||
NEGATIVE_NUMBER_OF_TRIALS("number of trials must be non-negative ({0})"),
|
||||
NUMBER_OF_TRIALS("number of trials ({0})"),
|
||||
NEGATIVE_ROBUSTNESS_ITERATIONS("the number of robustness iterations must be non-negative, but got {0}"),
|
||||
ROBUSTNESS_ITERATIONS("number of robustness iterations ({0})"),
|
||||
START_POSITION("start position ({0})"), /* keep */
|
||||
NON_CONVERGENT_CONTINUED_FRACTION("Continued fraction convergents failed to converge (in less than {0} iterations) for value {1}"),
|
||||
NON_POSITIVE_MICROSPHERE_ELEMENTS("number of microsphere elements must be positive, but got {0}"),
|
||||
@ -285,7 +285,6 @@ public enum LocalizedFormats implements Localizable {
|
||||
SUBARRAY_ENDS_AFTER_ARRAY_END("subarray ends after array end"),
|
||||
TOO_LARGE_CUTOFF_SINGULAR_VALUE("cutoff singular value is {0}, should be at most {1}"),
|
||||
TOO_MANY_ELEMENTS_TO_DISCARD_FROM_ARRAY("cannot discard {0} elements from a {1} elements array"),
|
||||
TOO_SMALL_BANDWIDTH("the bandwidth must be large enough to accomodate at least 2 points. There are {0} data points, and bandwidth must be at least {1} but it is only {2}"),
|
||||
TOO_SMALL_COST_RELATIVE_TOLERANCE("cost relative tolerance is too small ({0}), no further reduction in the sum of squares is possible"),
|
||||
TOO_SMALL_INTEGRATION_INTERVAL("too small integration interval: length = {0}"),
|
||||
TOO_SMALL_ORTHOGONALITY_TOLERANCE("orthogonality tolerance is too small ({0}), solution is orthogonal to the jacobian"),
|
||||
|
@ -19,7 +19,7 @@ ARRAY_SUMS_TO_ZERO = somme du tableau nulle
|
||||
ASSYMETRIC_EIGEN_NOT_SUPPORTED = la d\u00e9composition en valeurs/vecteurs propres de matrices
|
||||
AT_LEAST_ONE_COLUMN = une matrice doit comporter au moins une colonne
|
||||
AT_LEAST_ONE_ROW = une matrice doit comporter au moins une ligne
|
||||
BANDWIDTH_OUT_OF_INTERVAL = la bande passante devrait \u00eatre dans l''intervalle [0,1], elle est de {0}
|
||||
BANDWIDTH = bande passante ({0})
|
||||
BINOMIAL_INVALID_PARAMETERS_ORDER = n doit \u00eatre sup\u00e9rieur ou \u00e9gal \u00e0 k pour le coefficient du bin\u00f4me (n, k), or k = {0}, n = {1}
|
||||
BINOMIAL_NEGATIVE_PARAMETER = n doit \u00eatre positif pour le coefficient du bin\u00f4me (n, k), or n = {0}
|
||||
CANNOT_CLEAR_STATISTIC_CONSTRUCTED_FROM_EXTERNAL_MOMENTS = les statistiques bas\u00e9es sur des moments externes ne peuvent pas \u00eatre remises \u00e0 z\u00e9ro
|
||||
@ -257,7 +257,6 @@ SINGULAR_MATRIX = matrice singuli\u00e8re
|
||||
SUBARRAY_ENDS_AFTER_ARRAY_END = le sous-tableau se termine apr\u00e8s la fin du tableau
|
||||
TOO_LARGE_CUTOFF_SINGULAR_VALUE = la valeur singuli\u00e8re de coupure vaut {0}, elle ne devrait pas d\u00e9passer {1}
|
||||
TOO_MANY_ELEMENTS_TO_DISCARD_FROM_ARRAY = impossible d''enlever {0} \u00e9l\u00e9ments d''un tableau en contenant {1}
|
||||
TOO_SMALL_BANDWIDTH = la largeur de bande doit \u00eatre assez grande pour supporter au moins 2 points. Il y a {0} donn\u00e9es et la largeur de bande doit \u00eatre au moins de {1}, or elle est seulement de {2}
|
||||
TOO_SMALL_COST_RELATIVE_TOLERANCE = trop petite tol\u00e9rance relative sur le co\u00fbt ({0}), aucune r\u00e9duction de la somme des carr\u00e9s n''est possible
|
||||
TOO_SMALL_INTEGRATION_INTERVAL = intervalle d''int\u00e9gration trop petit : {0}
|
||||
TOO_SMALL_ORTHOGONALITY_TOLERANCE = trop petite tol\u00e9rance sur l''orthogonalit\u00e9 ({0}), la solution est orthogonale \u00e0 la jacobienne
|
||||
|
@ -52,6 +52,10 @@ The <action> type attribute can be add,update,fix,remove.
|
||||
If the output is not quite correct, check for invisible trailing spaces!
|
||||
-->
|
||||
<release version="3.0" date="TBD" description="TBD">
|
||||
<action dev="erans" type="fix" issue="MATH-458">
|
||||
Removed "MathException" from the "throws" clause of the "interpolate" method
|
||||
of the interpolators interfaces (package "analysis.interpolation").
|
||||
</action>
|
||||
<action dev="erans" type="fix" issue="MATH-461">
|
||||
In order to comply with the new runtime exceptions policy, the classes
|
||||
"RealVectorFormat", "ComplexFormat", "Vector3DFormat" and "CompositeFormat"
|
||||
|
@ -16,8 +16,15 @@
|
||||
*/
|
||||
package org.apache.commons.math.analysis.interpolation;
|
||||
|
||||
import org.apache.commons.math.MathException;
|
||||
import org.apache.commons.math.util.FastMath;
|
||||
import org.apache.commons.math.exception.NotPositiveException;
|
||||
import org.apache.commons.math.exception.OutOfRangeException;
|
||||
import org.apache.commons.math.exception.DimensionMismatchException;
|
||||
import org.apache.commons.math.exception.NoDataException;
|
||||
import org.apache.commons.math.exception.NonMonotonousSequenceException;
|
||||
import org.apache.commons.math.exception.NotFiniteNumberException;
|
||||
import org.apache.commons.math.exception.NumberIsTooSmallException;
|
||||
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
@ -27,7 +34,7 @@ import org.junit.Test;
|
||||
public class LoessInterpolatorTest {
|
||||
|
||||
@Test
|
||||
public void testOnOnePoint() throws MathException {
|
||||
public void testOnOnePoint() {
|
||||
double[] xval = {0.5};
|
||||
double[] yval = {0.7};
|
||||
double[] res = new LoessInterpolator().smooth(xval, yval);
|
||||
@ -36,7 +43,7 @@ public class LoessInterpolatorTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOnTwoPoints() throws MathException {
|
||||
public void testOnTwoPoints() {
|
||||
double[] xval = {0.5, 0.6};
|
||||
double[] yval = {0.7, 0.8};
|
||||
double[] res = new LoessInterpolator().smooth(xval, yval);
|
||||
@ -46,7 +53,7 @@ public class LoessInterpolatorTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOnStraightLine() throws MathException {
|
||||
public void testOnStraightLine() {
|
||||
double[] xval = {1,2,3,4,5};
|
||||
double[] yval = {2,4,6,8,10};
|
||||
LoessInterpolator li = new LoessInterpolator(0.6, 2, 1e-12);
|
||||
@ -58,7 +65,7 @@ public class LoessInterpolatorTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOnDistortedSine() throws MathException {
|
||||
public void testOnDistortedSine() {
|
||||
int numPoints = 100;
|
||||
double[] xval = new double[numPoints];
|
||||
double[] yval = new double[numPoints];
|
||||
@ -90,7 +97,7 @@ public class LoessInterpolatorTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIncreasingBandwidthIncreasesSmoothness() throws MathException {
|
||||
public void testIncreasingBandwidthIncreasesSmoothness() {
|
||||
int numPoints = 100;
|
||||
double[] xval = new double[numPoints];
|
||||
double[] yval = new double[numPoints];
|
||||
@ -121,7 +128,7 @@ public class LoessInterpolatorTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIncreasingRobustnessItersIncreasesSmoothnessWithOutliers() throws MathException {
|
||||
public void testIncreasingRobustnessItersIncreasesSmoothnessWithOutliers() {
|
||||
int numPoints = 100;
|
||||
double[] xval = new double[numPoints];
|
||||
double[] yval = new double[numPoints];
|
||||
@ -153,74 +160,74 @@ public class LoessInterpolatorTest {
|
||||
}
|
||||
}
|
||||
|
||||
@Test(expected=MathException.class)
|
||||
public void testUnequalSizeArguments() throws MathException {
|
||||
@Test(expected=DimensionMismatchException.class)
|
||||
public void testUnequalSizeArguments() {
|
||||
new LoessInterpolator().smooth(new double[] {1,2,3}, new double[] {1,2,3,4});
|
||||
}
|
||||
|
||||
@Test(expected=MathException.class)
|
||||
public void testEmptyData() throws MathException {
|
||||
@Test(expected=NoDataException.class)
|
||||
public void testEmptyData() {
|
||||
new LoessInterpolator().smooth(new double[] {}, new double[] {});
|
||||
}
|
||||
|
||||
@Test(expected=MathException.class)
|
||||
public void testNonStrictlyIncreasing1() throws MathException {
|
||||
@Test(expected=NonMonotonousSequenceException.class)
|
||||
public void testNonStrictlyIncreasing1() {
|
||||
new LoessInterpolator().smooth(new double[] {4,3,1,2}, new double[] {3,4,5,6});
|
||||
}
|
||||
|
||||
@Test(expected=MathException.class)
|
||||
public void testNonStrictlyIncreasing2() throws MathException {
|
||||
@Test(expected=NonMonotonousSequenceException.class)
|
||||
public void testNonStrictlyIncreasing2() {
|
||||
new LoessInterpolator().smooth(new double[] {1,2,2,3}, new double[] {3,4,5,6});
|
||||
}
|
||||
|
||||
@Test(expected=MathException.class)
|
||||
public void testNotAllFiniteReal1() throws MathException {
|
||||
@Test(expected=NotFiniteNumberException.class)
|
||||
public void testNotAllFiniteReal1() {
|
||||
new LoessInterpolator().smooth(new double[] {1,2,Double.NaN}, new double[] {3,4,5});
|
||||
}
|
||||
|
||||
@Test(expected=MathException.class)
|
||||
public void testNotAllFiniteReal2() throws MathException {
|
||||
@Test(expected=NotFiniteNumberException.class)
|
||||
public void testNotAllFiniteReal2() {
|
||||
new LoessInterpolator().smooth(new double[] {1,2,Double.POSITIVE_INFINITY}, new double[] {3,4,5});
|
||||
}
|
||||
|
||||
@Test(expected=MathException.class)
|
||||
public void testNotAllFiniteReal3() throws MathException {
|
||||
@Test(expected=NotFiniteNumberException.class)
|
||||
public void testNotAllFiniteReal3() {
|
||||
new LoessInterpolator().smooth(new double[] {1,2,Double.NEGATIVE_INFINITY}, new double[] {3,4,5});
|
||||
}
|
||||
|
||||
@Test(expected=MathException.class)
|
||||
public void testNotAllFiniteReal4() throws MathException {
|
||||
@Test(expected=NotFiniteNumberException.class)
|
||||
public void testNotAllFiniteReal4() {
|
||||
new LoessInterpolator().smooth(new double[] {3,4,5}, new double[] {1,2,Double.NaN});
|
||||
}
|
||||
|
||||
@Test(expected=MathException.class)
|
||||
public void testNotAllFiniteReal5() throws MathException {
|
||||
@Test(expected=NotFiniteNumberException.class)
|
||||
public void testNotAllFiniteReal5() {
|
||||
new LoessInterpolator().smooth(new double[] {3,4,5}, new double[] {1,2,Double.POSITIVE_INFINITY});
|
||||
}
|
||||
|
||||
@Test(expected=MathException.class)
|
||||
public void testNotAllFiniteReal6() throws MathException {
|
||||
@Test(expected=NotFiniteNumberException.class)
|
||||
public void testNotAllFiniteReal6() {
|
||||
new LoessInterpolator().smooth(new double[] {3,4,5}, new double[] {1,2,Double.NEGATIVE_INFINITY});
|
||||
}
|
||||
|
||||
@Test(expected=MathException.class)
|
||||
public void testInsufficientBandwidth() throws MathException {
|
||||
@Test(expected=NumberIsTooSmallException.class)
|
||||
public void testInsufficientBandwidth() {
|
||||
LoessInterpolator li = new LoessInterpolator(0.1, 3, 1e-12);
|
||||
li.smooth(new double[] {1,2,3,4,5,6,7,8,9,10,11,12}, new double[] {1,2,3,4,5,6,7,8,9,10,11,12});
|
||||
}
|
||||
|
||||
@Test(expected=MathException.class)
|
||||
public void testCompletelyIncorrectBandwidth1() throws MathException {
|
||||
@Test(expected=OutOfRangeException.class)
|
||||
public void testCompletelyIncorrectBandwidth1() {
|
||||
new LoessInterpolator(-0.2, 3, 1e-12);
|
||||
}
|
||||
|
||||
@Test(expected=MathException.class)
|
||||
public void testCompletelyIncorrectBandwidth2() throws MathException {
|
||||
@Test(expected=OutOfRangeException.class)
|
||||
public void testCompletelyIncorrectBandwidth2() {
|
||||
new LoessInterpolator(1.1, 3, 1e-12);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMath296withoutWeights() throws MathException {
|
||||
public void testMath296withoutWeights() {
|
||||
double[] xval = {
|
||||
0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0,
|
||||
1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0};
|
||||
@ -251,5 +258,4 @@ public class LoessInterpolatorTest {
|
||||
x += dx * (1 + (2 * FastMath.random() - 1) * xnoise);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user