Computes the value of a tensor-product spline or the value of one of its partial derivatives.
#include <imsl.h>
float imsl_f_spline_2d_value (float x, float y, Imsl_f_spline *sp, ¼, 0)
The type double function is imsl_d_spline_2d_value.
float x (Input)
float y
(Input)
The (x, y) coordinates of the evaluation point for the
tensor-product spline.
Imsl_f_spline *sp
(Input)
Pointer to the structure that represents the spline.
The value of a tensor-product spline or one of its derivatives at the point (x, y).
#include <imsl.h>
float
imsl_f_spline_2d_value (float
x, float y, Imsl_f_spline
*sp,
IMSL_DERIV, int
x_partial,
int
y_partial,
IMSL_GRID, int nx, float
*xvec,
int
ny,
float
*yvec,
float **value,
IMSL_GRID_USER, int nx, float
*xvec,
int
ny,
float
*yvec,
float value_user[],
0)
IMSL_DERIV, int x_partial, int y_partial
(Input)
Let p = x_partial and
q = y_partial, and let
s be the spline that is represented by the structure *sp, then this option
produces the (p, q)-th derivative of s at (x,
y), s(p,q) (x, y).
Default: x_partial = y_partial = 0
IMSL_GRID, int nx, float *xvec, int ny, float *yvec, float **value
(Input/Output)
The argument xvec is the array of
length nx
containing the X coordinates at which the spline is to be evaluated. The
argument yvec is
the array of length ny containing the
Y coordinates at which the spline is to be evaluated. The value of
the spline on the nx by ny grid is returned in
value.
IMSL_GRID_USER, int nx, float *xvec, int ny, float *yvec, float value_user[]
(Input/Output)
The argument xvec is the array of
length nx
containing the X coordinates at which the spline is to be evaluated. The
argument yvec is
the array of length ny containing the
Y coordinates at which the spline is to be evaluated. The value of
the spline on the nx by ny grid is returned in
the user-supplied space value_user.
The function imsl_f_spline_2d_value computes the value of a tensor-product spline or one of its derivatives. This function is based on the discussion in de Boor (1978, pp. 351−353).
In this example, a spline interpolant s to a function f is constructed. Using the procedure imsl_f_spline_2d_interp to compute the interpolant, imsl_f_spline_2d_value is employed to compute s(x, y). The values of this partial derivative and the error are computed on a 4 ´ 4 grid and then displayed.
#include <imsl.h>
#include
<stdio.h>
#include <math.h>
#define
NDATA 11
#define
OUTDATA
2
/* Define function */
#define
F(x,y)
(float)(x*x*x+y*y)
main()
{
int
i, j, num_xdata, num_ydata;
float
fdata[NDATA][NDATA], xdata[NDATA], ydata[NDATA];
float
x, y, z;
Imsl_f_spline
*sp;
/* Set up grid
*/
for (i = 0; i < NDATA; i++)
{
xdata[i] = ydata[i] = (float) i
/ ((float) (NDATA - 1));
}
for (i =
0; i < NDATA; i++)
{
for (j = 0; j <
NDATA; j++)
{
fdata[i][j] = F(xdata[i],
ydata[j]);
}
}
num_xdata = num_ydata =
NDATA;
/* Compute tensor-product interpolant */
sp =
imsl_f_spline_2d_interp(num_xdata, xdata,
num_ydata,
ydata, fdata,
0);
/* Print results */
printf("
x y F(x,
y)
Value Error\n");
for
(i = 0; i < OUTDATA; i++)
{
x = (float) (1+i) / (float)
(OUTDATA+1);
for (j = 0; j
< OUTDATA; j++)
{
y =
(float) (1+j) / (float)
(OUTDATA+1);
z = imsl_f_spline_2d_value(x, y, sp,
0);
printf(" %6.3f %6.3f %10.3f %10.3f
%10.4f\n",
x, y, F(x,y), z, fabs(F(x,y)-z));
}
}
}
x
y F(x,
y)
Value Error
0.333
0.333
0.148
0.148 0.0000
0.333
0.667
0.481
0.481 0.0000
0.667
0.333
0.407
0.407 0.0000
0.667
0.667
0.741
0.741 0.0000
In this example, a spline interpolant s to a function f is constructed. Using function imsl_f_spline_2d_interp to compute the interpolant, then imsl_f_spline_2d_value is employed to compute s(2,1) (x, y). The values of this partial derivative and the error are computed on a 4 ´ 4 grid and then displayed.
#include <imsl.h>
#include
<stdio.h>
#include <math.h>
#define
NDATA 11
#define
OUTDATA
2
/* Define function */
#define F(x,
y) (float)(x*x*x*y*y)
#define
F21(x,y)
(float)(6.*x*2.*y)
main()
{
int
i, j, num_xdata, num_ydata;
float
fdata[NDATA][NDATA], xdata[NDATA], ydata[NDATA];
float
x, y, z;
Imsl_f_spline
*sp;
/*
Set up grid */
for (i = 0; i < NDATA;
i++) {
xdata[i] = ydata[i] =
(float)i / ((float)(NDATA-1));
}
for
(i = 0; i < NDATA; i++)
{
for (j = 0; j <
NDATA; j++)
{
fdata[i][j] = F(xdata[i],
ydata[j]);
}
}
num_xdata = num_ydata =
NDATA;
/* Compute tensor-product interpolant */
sp =
imsl_f_spline_2d_interp(num_xdata, xdata,
num_ydata,
ydata, fdata,
0);
/* Print results */
printf("
x y
F21(x, y) 21InterpDeriv Error\n");
for (i = 0; i < OUTDATA; i++)
{
x = (float) (1+i) / (float)
(OUTDATA+1);
for (j = 0; j
< OUTDATA; j++)
{
y =
(float) (1+j) / (float)
(OUTDATA+1);
z = imsl_f_spline_2d_value(x, y,
sp,
IMSL_DERIV, 2,
1,
0);
printf(" %6.3f %6.3f %10.3f %10.3f
%10.4f\n",
x, y, F21(x, y), z,
fabs(F21(x,y)-z));
}
}
}
x
y F21(x, y) 21InterpDeriv
Error
0.333 0.333
1.333
1.333 0.0000
0.333
0.667
2.667 2.667
0.0000
0.667
0.333
2.667
2.667 0.0000
0.667
0.667
5.333
5.333 0.0001
IMSL_X_NOT_WITHIN_KNOTS The value of x does not lie within the knot sequence.
IMSL_Y_NOT_WITHIN_KNOTS
The value of y
does not lie within the knot sequence.
IMSL_KNOT_MULTIPLICITY Multiplicity of the knots cannot exceed the order of the spline.
IMSL_KNOT_NOT_INCREASING The knots must be nondecreasing.
|
Visual Numerics, Inc. PHONE: 713.784.3131 FAX:713.781.9260 |