BS2DR
This function evaluates the derivative of a two-dimensional tensor-product spline, given its tensor-product B-spline representation.
Function Return Value
BS2DR — Value of the (IXDER, IYDER) derivative of the spline at (X, Y). (Output)
Required Arguments
IXDER — Order of the derivative in the X-direction. (Input)
IYDER — Order of the derivative in the Y-direction. (Input)
X — X-coordinate of the point at which the spline is to be evaluated. (Input)
Y — Y-coordinate of the point at which the spline is to be evaluated. (Input)
KXORD — Order of the spline in the X-direction. (Input)
KYORD — Order of the spline in the Y-direction. (Input)
XKNOT — Array of length NXCOEF + KXORD containing the knot sequence in the X-direction. (Input)
XKNOT must be nondecreasing.
YKNOT — Array of length NYCOEF + KYORD containing the knot sequence in the Y-direction. (Input)
YKNOT must be nondecreasing.
NXCOEF — Number of B-spline coefficients in the X-direction. (Input)
NYCOEF — Number of B-spline coefficients in the Y-direction. (Input)
BSCOEF — Array of length NXCOEF * NYCOEF containing the tensor-product B-spline coefficients. (Input)
BSCOEF is treated internally as a matrix of size NXCOEF by NYCOEF.
FORTRAN 90 Interface
Generic: BS2DR (IXDER, IYDER, X, Y, KXORD, KYORD, XKNOT, YKNOT, NXCOEF, NYCOEF, BSCOEF)
Specific: The specific interface names are S_BS2DR and D_BS2DR.
FORTRAN 77 Interface
Single: BS2DR (IXDER, IYDER, X, Y, KXORD, KYORD, XKNOT, YKNOT, NXCOEF, NYCOEF, BSCOEF)
Double: The double precision function name is DBS2DR.
Description
The routine BS2DR evaluates a partial derivative of a bivariate tensor-product spline (represented as a linear combination of tensor product B-splines) at a given point; see de Boor (1978, pages 351− 353).
This routine returns the value of s(p,q)at a point (x, y) given the coefficients c by computing
where kx and ky are the orders of the splines. (These numbers are passed to the subroutine in KXORD and KYORD, respectively.) Likewise, tx and ty are the corresponding knot sequences (XKNOT and YKNOT.)
Comments
1. Workspace may be explicitly provided, if desired, by use of B22DR/DB22DR. The reference is:
CALL B22DR(IXDER, IYDER, X, Y, KXORD, KYORD, XKNOT, YKNOT, NXCOEF, NYCOEF, BSCOEF, WK)
The additional argument is:
WK — Work array of length 3 * MAX(KXORD, KYORD) + KYORD.
2. Informational errors
Type |
Code |
Description |
3 |
1 |
The point X does not satisfy XKNOT(KXORD) .LE. X .LE. XKNOT(NXCOEF + 1). |
3 |
2 |
The point Y does not satisfy YKNOT(KYORD) .LE. Y .LE. YKNOT(NYCOEF + 1). |
Example
In this example, a spline interpolant s to a function f is constructed. We use the IMSL routine BS2IN to compute the interpolant and then BS2DR 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.
USE BS2DR_INT
USE BSNAK_INT
USE UMACH_INT
USE BS2IN_INT
IMPLICIT NONE
! SPECIFICATIONS FOR PARAMETERS
INTEGER KXORD, KYORD, LDF, NXDATA, NXKNOT, NYDATA, NYKNOT
PARAMETER (KXORD=5, KYORD=3, NXDATA=21, NYDATA=6, LDF=NXDATA,&
NXKNOT=NXDATA+KXORD, NYKNOT=NYDATA+KYORD)
!
INTEGER I, J, NOUT, NXCOEF, NYCOEF
REAL BSCOEF(NXDATA,NYDATA), F, F21,&
FDATA(LDF,NYDATA), FLOAT, S21, X, XDATA(NXDATA),&
XKNOT(NXKNOT), Y, YDATA(NYDATA), YKNOT(NYKNOT)
INTRINSIC FLOAT
! Define function and (2,1) derivative
F(X,Y) = X*X*X*X + X*X*X*Y*Y
F21(X,Y) = 12.0*X*Y
! Set up interpolation points
DO 10 I=1, NXDATA
XDATA(I) = FLOAT(I-11)/10.0
10 CONTINUE
! Generate knot sequence
CALL BSNAK (NXDATA, XDATA, KXORD, XKNOT)
! Set up interpolation points
DO 20 I=1, NYDATA
YDATA(I) = FLOAT(I-1)/5.0
20 CONTINUE
! Generate knot sequence
CALL BSNAK (NYDATA, YDATA, KYORD, YKNOT)
! Generate FDATA
DO 40 I=1, NYDATA
DO 30 J=1, NXDATA
FDATA(J,I) = F(XDATA(J),YDATA(I))
30 CONTINUE
40 CONTINUE
! Interpolate
CALL BS2IN (XDATA, YDATA, FDATA, KXORD, KYORD, XKNOT, &
YKNOT, BSCOEF)
NXCOEF = NXDATA
NYCOEF = NYDATA
! Get output unit number
CALL UMACH (2, NOUT)
! Write heading
WRITE (NOUT,99999)
! Print (2,1) derivative over a
! grid of [0.0,1.0] x [0.0,1.0]
! at 16 points.
DO 60 I=1, 4
DO 50 J=1, 4
X = FLOAT(I-1)/3.0
Y = FLOAT(J-1)/3.0
! Evaluate spline
S21 = BS2DR(2,1,X,Y,KXORD,KYORD,XKNOT,YKNOT,NXCOEF,NYCOEF,&
BSCOEF)
WRITE (NOUT,'(3F15.4, F15.6)') X, Y, S21, F21(X,Y) - S21
50 CONTINUE
60 CONTINUE
99999 FORMAT (39X, '(2,1)', /, 13X, 'X', 14X, 'Y', 10X, 'S (X,Y)',&
5X, 'Error')
END
(2,1)
X Y S (X,Y) Error
0.0000 0.0000 0.0000 0.000000
0.0000 0.3333 0.0000 0.000000
0.0000 0.6667 0.0000 0.000000
0.0000 1.0000 0.0000 0.000001
0.3333 0.0000 0.0000 0.000000
0.3333 0.3333 1.3333 0.000002
0.3333 0.6667 2.6667 -0.000002
0.3333 1.0000 4.0000 0.000008
0.6667 0.0000 0.0000 0.000006
0.6667 0.3333 2.6667 -0.000011
0.6667 0.6667 5.3333 0.000028
0.6667 1.0000 8.0001 -0.000134
1.0000 0.0000 -0.0004 0.000439
1.0000 0.3333 4.0003 -0.000319
1.0000 0.6667 7.9996 0.000363
1.0000 1.0000 12.0005 -0.000458