umontreal.iro.lecuyer.functionfit
Class SmoothingCubicSpline
- java.lang.Object
-
- umontreal.iro.lecuyer.functionfit.SmoothingCubicSpline
-
- All Implemented Interfaces:
- MathFunction, MathFunctionWithDerivative, MathFunctionWithFirstDerivative, MathFunctionWithIntegral
public class SmoothingCubicSpline extends java.lang.Object implements MathFunction, MathFunctionWithFirstDerivative, MathFunctionWithDerivative, MathFunctionWithIntegral
Represents a cubic spline with nodes at (xi, yi) computed with the smoothing cubic spline algorithm of Schoenberg. A smoothing cubic spline is made of n + 1 cubic polynomials. The ith polynomial of such a spline, for i = 1,…, n - 1, is defined as Si(x) while the complete spline is defined asS(x) = Si(x), for x∈[xi-1, xi].For x < x0 and x > xn-1, the spline is not precisely defined, but this class performs extrapolation by using S0 and Sn linear polynomials. The algorithm which calculates the smoothing spline is a generalization of the algorithm for an interpolating spline. Si is linked to Si+1 at xi+1 and keeps continuity properties for first and second derivatives at this point, therefore Si(xi+1) = Si+1(xi+1), S'i(xi+1) = S'i+1(xi+1) and S''i(xi+1) = S''i+1(xi+1).The spline is computed with a smoothing parameter ρ∈[0, 1] which represents its accuracy with respect to the initial (xi, yi) nodes. The smoothing spline minimizes
L = ρ∑i=0n-1wi(yi-Si(xi))2 + (1 - ρ)∫x0xn-1(S''(x))2dxIn fact, by setting ρ = 1, we obtain the interpolating spline; and we obtain a linear function by setting ρ = 0. The weights wi > 0, which default to 1, can be used to change the contribution of each point in the error term. A large value wi will give a large weight to the ith point, so the spline will pass closer to it. Here is a small example that uses smoothing splines:
int n;
double[] X = new double[n];
double[] Y = new double[n];
// here, fill arrays X and Y with n data points (x_i, y_i)
// The points must be sorted with respect to x_i.
double rho = 0.1;
SmoothingCubicSpline fit = new SmoothingCubicSpline(X, Y, rho);
int m = 40;
double[] Xp = new double[m+1]; // Xp, Yp are spline points
double[] Yp = new double[m+1];
double h = (X[n-1] - X[0]) / m; // step
for (int i = 0; i <= m; i++) {
double z = X[0] + i * h;
Xp[i] = z;
Yp[i] = fit.evaluate(z); // evaluate spline at z
}
-
-
Constructor Summary
Constructors Constructor and Description SmoothingCubicSpline(double[] x, double[] y, double rho)Constructs a spline with nodes at (xi, yi), with weights = 1 and smoothing factor ρ = rho.SmoothingCubicSpline(double[] x, double[] y, double[] w, double rho)Constructs a spline with nodes at (xi, yi), with weights wi and smoothing factor ρ = rho.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method and Description doublederivative(double z)Evaluates and returns the value of the first derivative of the spline at z.doublederivative(double z, int n)Evaluates and returns the value of the n-th derivative of the spline at z.doubleevaluate(double z)Evaluates and returns the value of the spline at z.intgetFitPolynomialIndex(double x)Returns the index of P, thePolynomialinstance used to evaluate x, in an ArrayList table instance returned by getSplinePolynomials().doublegetRho()Returns the smoothing factor used to construct the spline.Polynomial[]getSplinePolynomials()Returns a table containing all fitting polynomials.double[]getWeights()Returns the weights of the points.double[]getX()Returns the xi coordinates for this spline.double[]getY()Returns the yi coordinates for this spline.doubleintegral(double a, double b)Evaluates and returns the value of the integral of the spline from a to b.
-
-
-
Constructor Detail
-
SmoothingCubicSpline
public SmoothingCubicSpline(double[] x, double[] y, double[] w, double rho)Constructs a spline with nodes at (xi, yi), with weights wi and smoothing factor ρ = rho. The xi must be sorted in increasing order.- Parameters:
x- the xi coordinates.y- the yi coordinates.w- the weight for each point, must be > 0.rho- the smoothing parameter- Throws:
java.lang.IllegalArgumentException- if x, y and z do not have the same length, if rho has wrong value, or if the spline cannot be calculated.
-
SmoothingCubicSpline
public SmoothingCubicSpline(double[] x, double[] y, double rho)Constructs a spline with nodes at (xi, yi), with weights = 1 and smoothing factor ρ = rho. The xi must be sorted in increasing order.- Parameters:
x- the xi coordinates.y- the yi coordinates.rho- the smoothing parameter- Throws:
java.lang.IllegalArgumentException- if x and y do not have the same length, if rho has wrong value, or if the spline cannot be calculated.
-
-
Method Detail
-
evaluate
public double evaluate(double z)
Evaluates and returns the value of the spline at z.- Specified by:
evaluatein interfaceMathFunction- Parameters:
z- argument of the spline.- Returns:
- value of spline.
-
integral
public double integral(double a, double b)Evaluates and returns the value of the integral of the spline from a to b.- Specified by:
integralin interfaceMathFunctionWithIntegral- Parameters:
a- lower limit of integral.b- upper limit of integral.- Returns:
- value of integral.
-
derivative
public double derivative(double z)
Evaluates and returns the value of the first derivative of the spline at z.- Specified by:
derivativein interfaceMathFunctionWithFirstDerivative- Parameters:
z- argument of the spline.- Returns:
- value of first derivative.
-
derivative
public double derivative(double z, int n)Evaluates and returns the value of the n-th derivative of the spline at z.- Specified by:
derivativein interfaceMathFunctionWithDerivative- Parameters:
z- argument of the spline.n- order of the derivative.- Returns:
- value of n-th derivative.
-
getX
public double[] getX()
Returns the xi coordinates for this spline.- Returns:
- the xi coordinates.
-
getY
public double[] getY()
Returns the yi coordinates for this spline.- Returns:
- the yi coordinates.
-
getWeights
public double[] getWeights()
Returns the weights of the points.- Returns:
- the weights of the points.
-
getRho
public double getRho()
Returns the smoothing factor used to construct the spline.- Returns:
- the smoothing factor.
-
getSplinePolynomials
public Polynomial[] getSplinePolynomials()
Returns a table containing all fitting polynomials.- Returns:
- Table containing the fitting polynomials.
-
getFitPolynomialIndex
public int getFitPolynomialIndex(double x)
Returns the index of P, thePolynomialinstance used to evaluate x, in an ArrayList table instance returned by getSplinePolynomials(). This index k gives also the interval in table X which contains the value x (i.e. such that xk < x <= xk+1).- Returns:
- Index of the polynomial check with x in the Polynomial list returned by methodgetSplinePolynomials
-
-
DMelt 3.0 © DataMelt by jWork.ORG