Computes a bicubic spline interpolating surface through a set of data values, given on a rectangular grid in the x-y plane.
int ocmath_2d_spline_interpolant( int nX, int nY, const double * pX, const double * pY, const double * pZ, ocmath_2dSpline * spline )
NE_NOERROR (code 0) --- success
NE_INT_ARG_LT (error code 11) --- nX < 4 or nY < 4
NE_NOT_STRICTLY_INCREASING (error code 63) --- pX[i] or pY[i] is not strictly increasing
NE_ALLOC_FAIL (error code 73) --- memory allocation failed
NE_DATA_ILL_CONDITIONED (error code 252) --- An intermediate set of linear equations is singular, the data is too ill-conditioned to compute B-spline coefficients
EX1
//This program reads in values of mx, xq for q = 1, 2, . . .,mx, my //and yr for r = 1, 2, . . .,my, followed by values of the //ordinates fq,r defined at the grid points (xq, yr). It then calls //ocmath_2d_spline_interpolant to compute a bicubic spline interpolant //of the data values, and prints the values of the knots and //B-spline coefficients. Finally it evaluates the spline at a //small sample of points on a rectangular grid. void ocmath_2d_spline_interpolant_ex1() { int i, j, mx, my, npx, npy; double fg[400], tx[20], ty[20]; double xhi, yhi, xlo, ylo, step; ocmath_2dSpline spline; mx = 7; my = 6; double x[20] = {1.0, 1.10, 1.30, 1.50, 1.60, 1.80, 2.00}; double y[20] = {0.00, 0.10, 0.40, 0.70, 0.90, 1.00}; double f[400] = {1.00, 1.10, 1.40, 1.70, 1.90, 2.00, 1.21, 1.31, 1.61, 1.91, 2.11, 2.21, 1.69, 1.79, 2.09, 2.39, 2.59, 2.69, 2.25, 2.35, 2.65, 2.95, 3.15, 3.25, 2.56, 2.66, 2.96, 3.26, 3.46, 3.56, 3.24, 3.34, 3.64, 3.94, 4.14, 4.24, 4.00, 4.10, 4.40, 4.70, 4.90, 5.00}; ocmath_2d_spline_interpolant(mx, my, x, y, f, &spline); printf("Distinct knots in x direction located at\n"); for (j=3; j<spline.nx-3; j++) { printf("%12.4f",spline.lamda[j]); if((j-3)%5==4 || j==spline.nx - 4) printf("\n"); } printf("\nDistinct knots in y direction located at\n"); for (j=3; j<spline.ny-3; j++) { printf("%12.4f",spline.mu[j]); if((j-3)%5==4 || j==spline.ny-4) printf("\n"); } printf("\nThe B-Spline coefficients:\n"); for (i=0; i<mx; i++) { for (j=0; j<my; j++) printf("%9.4f",spline.c[my*i+j]); printf("\n"); } npx = 6; npy = 6; xlo = 1.0; ylo = 0.0; xhi = 2.0; yhi = 1.0; step = (xhi-xlo)/(1.0*(npx-1)); printf("\nSpline evaluated on a regular mesh (x across, y down): \n "); for (i=0; i<npx; i++) { if(xlo + i * step > xhi) tx[i] = xhi; else tx[i] = xlo + i * step; printf(" %5.2f ",tx[i]); } step = (yhi-ylo)/(npy-1); for (i=0; i<npy; i++) { if(ylo + i * step > yhi) ty[i] = yhi; else ty[i] = ylo + i * step; } for(i=0; i<npx; i++) for(j=0; j<npy; j++) ocmath_2d_spline_eval(1, &tx[i], &ty[j], &fg[i*npx + j], &spline); printf("\n"); for (j=0; j<npy; j++) { printf("%5.2f",ty[j]); for (i=0; i<npx; i++) printf("%8.3f ",fg[npy*i+j]); printf("\n"); } ocmath_free(spline.lamda); ocmath_free(spline.mu); ocmath_free(spline.c); }
origin.h
nag_2d_spline_interpolant(e01dac)nag_2d_spline_interpolant(e01dac), NAG Manual