Example 2
A tensor-product spline interpolant to a function is computed. The values of the interpolant and the error on a 4 x 4 grid are displayed. Notice that the first interpolant with order = 3 does not reproduce the cubic data, while the second interpolant with order = 6 does reproduce the data.
import java.text.*;
import com.imsl.math.*;
public class Spline2DInterpolateEx2 {
private static double F(double x, double y) {
return (x*x*x+y*y);
}
public static void main(String args[]) {
int nData = 7;
int outData = 4;
double[][] fData = new double[nData][nData];
double[] xData = new double[nData];
double[] yData = new double[nData];
double x, y, z;
// Set up grid
for (int i = 0; i < nData; i++) {
xData[i] = yData[i] = (double) i / ((double) (nData - 1));
}
for (int i = 0; i < nData; i++) {
for (int j = 0; j < nData; j++) {
fData[i][j] = F(xData[i], yData[j]);
}
}
NumberFormat nf = NumberFormat.getInstance();
nf.setMaximumFractionDigits(4);
nf.setMinimumFractionDigits(4);
for(int order = 3; order < 7; order += 3) {
// Compute tensor-product interpolant
Spline2DInterpolate spline =
new Spline2DInterpolate(xData, yData, fData, order, order);
// Print results
System.out.println("\nThe order of the spline is " + order);
System.out.println(" x y F(x, y) " +
"Interpolant Error");
for (int i = 0; i < outData; i++) {
x = (double) i / (double) (outData);
for (int j = 0; j < outData; j++) {
y = (double) j / (double) (outData);
z = spline.value(x, y);
System.out.println(nf.format(x) + " " + nf.format(y) +
" " + nf.format(F(x,y)) + " " +
nf.format(z) + " " +
nf.format(Math.abs(F(x,y)-z)));
}
}
}
}
}
Output
The order of the spline is 3
x y F(x, y) Interpolant Error
0.0000 0.0000 0.0000 0.0000 0.0000
0.0000 0.2500 0.0625 0.0625 0.0000
0.0000 0.5000 0.2500 0.2500 0.0000
0.0000 0.7500 0.5625 0.5625 0.0000
0.2500 0.0000 0.0156 0.0158 0.0002
0.2500 0.2500 0.0781 0.0783 0.0002
0.2500 0.5000 0.2656 0.2658 0.0002
0.2500 0.7500 0.5781 0.5783 0.0002
0.5000 0.0000 0.1250 0.1250 0.0000
0.5000 0.2500 0.1875 0.1875 0.0000
0.5000 0.5000 0.3750 0.3750 0.0000
0.5000 0.7500 0.6875 0.6875 0.0000
0.7500 0.0000 0.4219 0.4217 0.0002
0.7500 0.2500 0.4844 0.4842 0.0002
0.7500 0.5000 0.6719 0.6717 0.0002
0.7500 0.7500 0.9844 0.9842 0.0002
The order of the spline is 6
x y F(x, y) Interpolant Error
0.0000 0.0000 0.0000 0.0000 0.0000
0.0000 0.2500 0.0625 0.0625 0.0000
0.0000 0.5000 0.2500 0.2500 0.0000
0.0000 0.7500 0.5625 0.5625 0.0000
0.2500 0.0000 0.0156 0.0156 0.0000
0.2500 0.2500 0.0781 0.0781 0.0000
0.2500 0.5000 0.2656 0.2656 0.0000
0.2500 0.7500 0.5781 0.5781 0.0000
0.5000 0.0000 0.1250 0.1250 0.0000
0.5000 0.2500 0.1875 0.1875 0.0000
0.5000 0.5000 0.3750 0.3750 0.0000
0.5000 0.7500 0.6875 0.6875 0.0000
0.7500 0.0000 0.4219 0.4219 0.0000
0.7500 0.2500 0.4844 0.4844 0.0000
0.7500 0.5000 0.6719 0.6719 0.0000
0.7500 0.7500 0.9844 0.9844 0.0000
Link to Java source.