public class Spline2DLeastSquares extends Spline2D
The Spline2DLeastSquares class computes a tensor-product spline least-squares
approximation to weighted tensor-product data. The input consists of data
vectors to specify the tensor-product grid for the data, two vectors with
the weights, the values of the surface on the grid, and the specification
for the tensor-product spline. The grid is specified by the two vectors
x = xData
and y = yData
of length
n = xData.length
and m = yData.length
,
respectively. A two-dimensional array f = fData
contains
the data values which are to be fit. The two vectors \(w_x\) =
xWeights
and \(w_y\) = yWeights
contain the
weights for the weighted least-squares problem. The information for the
approximating tensor-product spline can be provided using the
setXOrder
, setYOrder
, setXKnots
and
setYKnots
methods. This information is contained in
\(k_x\) = xOrder
, \(t_x\) =
xKnots
, and N = xSplineSpaceDim
for the
spline in the first variable, and in \(k_y\) =
yOrder
, \(t_y\) = yKnots
and
M = ySplineSpaceDim
for the spline in the second variable.
This class computes coefficients for the tensor-product spline by solving
the normal equations in tensor-product form as discussed in de Boor (1978,
Chapter 17). The interested reader might also want to study the paper by
Grosse (1980).
As the computation proceeds, we obtain coefficients c minimizing
$$\sum\limits_{i = 0}^{n - 1} {\sum\limits_{j = 0}^{m - 1} {w_x \left( i \right)w_y \left( j \right)} \left[ {\sum\limits_{k = 0}^{N - 1} {\sum\limits_{l = 0}^{M - 1} {c_{kl} } B_{kl} \left( {x_i ,y_i } \right) - f_{ij} } } \right]} ^2$$
where the function \(B_{kl}\) is the tensor-product of two
B-splines of order \(k_x\) and \(k_y\).
Specifically, we have
$$B_{kl} \left( {x,y} \right) = B_{k,k_x ,t_x } \left( x \right)B_{l,k_y ,t_y } \left( y \right)$$
The spline
$$\sum\limits_{k = 0}^{N - 1} {\sum\limits_{l = 0}^{M - 1} {c_{kl} } } B_{kl}$$
and its partial derivatives can be evaluated using the value
method.
Constructor and Description |
---|
Spline2DLeastSquares(double[] xData,
double[] yData,
double[][] fData,
int xSplineSpaceDim,
int ySplineSpaceDim)
Constructor for
Spline2DLeastSquares . |
Modifier and Type | Method and Description |
---|---|
void |
compute()
Computes a two-dimensional, tensor-product spline approximant using
least squares.
|
double |
getErrorSumOfSquares()
Returns the weighted error sum of squares.
|
int |
getXOrder()
Returns the order of the spline in the x-direction.
|
double[] |
getXWeights()
Returns the weights for the least-squares fit in the x-direction.
|
int |
getYOrder()
Returns the order of the spline in the y-direction.
|
double[] |
getYWeights()
Returns the weights for the least-squares fit in the y-direction.
|
void |
setXKnots(double[] xKnots)
Sets the knot sequences of the spline in the x-direction.
|
void |
setXOrder(int xOrder)
Sets the order of the spline in the x-direction.
|
void |
setXWeights(double[] xWeights)
Sets the weights for the least-squares fit in the x-direction.
|
void |
setYKnots(double[] yKnots)
Sets the knot sequences of the spline in the y-direction.
|
void |
setYOrder(int yOrder)
Sets the order of the spline in the y-direction.
|
void |
setYWeights(double[] yWeights)
Sets the weights for the least-squares fit in the y-direction.
|
derivative, derivative, getCoefficients, getXKnots, getYKnots, integral, value, value
public Spline2DLeastSquares(double[] xData, double[] yData, double[][] fData, int xSplineSpaceDim, int ySplineSpaceDim)
Spline2DLeastSquares
.xData
- a double
array containing the data points
in the x-direction.yData
- a double
array containing the data points
in the y-direction.fData
- a double
matrix of size
xData.length
by yData.length
containing the values to be approximated.xSplineSpaceDim
- an int
scalar value specifying the
linear dimension of the spline subspace for the x
variable. It should be smaller than xData.length
and greater than or equal to xOrder
(whose default value is 4).ySplineSpaceDim
- an int
scalar value specifying the
linear dimension of the spline subspace for the y
variable. It should be smaller than yData.length
and greater than or equal to yOrder
(whose default value is 4).public double getErrorSumOfSquares()
double
scalar containing the weighted error sum
of squares.public void compute()
public void setXOrder(int xOrder)
xOrder
- an int
scalar value specifying the order
of the spline in the x-direction. xOrder
must
be at least 1. Default: xOrder
= 4,
implying a tensor-product cubic spline.public int getXOrder()
int
scalar containing the order
of the spline in the x-direction.public void setYOrder(int yOrder)
yOrder
- an int
scalar value specifying the order
of the spline in the y-direction. yOrder
must
be at least 1. Default: yOrder
= 4,
implying a tensor-product cubic spline.public int getYOrder()
int
scalar containing the order
of the spline in the y-direction.public void setXKnots(double[] xKnots)
xKnots
- a double
array of size
xSplineSpaceDim + xOrder
specifying the knot
sequences of the spline in the x-direction. Default knot
sequences are selected by the class.public void setYKnots(double[] yKnots)
yKnots
- a double
array of size
ySplineSpaceDim + yOrder
specifying the knot
sequences of the spline in the y-direction. Default knot
sequences are selected by the class.public void setXWeights(double[] xWeights)
xWeights
- a double
array of size
xData.length
specifying the weights for the
least-squares fit in the x-direction. Default:
all weights are equal to 1.public double[] getXWeights()
double
array containing the weights for the
least-squares fit in the x-direction.public void setYWeights(double[] yWeights)
yWeights
- a double
array of size
yData.length
specifying the weights for the
least-squares fit in the y-direction. Default:
all weights are equal to 1.public double[] getYWeights()
double
array containing the weights for the
least-squares fit in the y-direction.Copyright © 2020 Rogue Wave Software. All rights reserved.