QD2DR

This function evaluates the derivative of a function defined on a rectangular grid using quadratic interpolation.

Function Return Value

QD2DR — Value of the (IXDER, IYDER) derivative of the function at (X, Y). (Output)

Required Arguments

IXDER — Order of the x-derivative. (Input)

IYDER — Order of the y-derivative. (Input)

X — X-coordinate of the point at which the function is to be evaluated. (Input)

Y — Y-coordinate of the point at which the function is to be evaluated. (Input)

XDATA — Array of length NXDATA containing the location of the data points in the x-direction. (Input)

XDATA must be increasing.

XDATA must be increasing.

YDATA — Array of length NYDATA containing the location of the data points in the y-direction. (Input)

YDATA must be increasing.

YDATA must be increasing.

FDATA — Array of size NXDATA by NYDATA containing function values. (Input)

FDATA(I, J) is the value of the function at (XDATA(I), YDATA(J)).

FDATA(I, J) is the value of the function at (XDATA(I), YDATA(J)).

Optional Arguments

NXDATA — Number of data points in the x-direction. (Input)

NXDATA must be at least three.

Default: NXDATA = size (XDATA,1).

NXDATA must be at least three.

Default: NXDATA = size (XDATA,1).

NYDATA — Number of data points in the y-direction. (Input)

NYDATA must be at least three.

Default: NYDATA = size (YDATA,1).

NYDATA must be at least three.

Default: NYDATA = size (YDATA,1).

LDF — Leading dimension of FDATA exactly as specified in the dimension statement of the calling program. (Input)

LDF must be at least as large as NXDATA.

Default: LDF = size (FDATA,1).

LDF must be at least as large as NXDATA.

Default: LDF = size (FDATA,1).

CHECK — Logical variable that is .TRUE. if checking of XDATA and YDATA is required or .FALSE. if checking is not required. (Input)

Default: CHECK = .TRUE.

Default: CHECK = .TRUE.

FORTRAN 90 Interface

Generic: QD2DR (IXDER, IYDER, X, Y, XDATA, YDATA, FDATA [, …])

Specific: The specific interface names are S_QD2DR and D_QD2DR.

FORTRAN 77 Interface

Single: QD2DR (IXDER, IYDER, X, Y, NXDATA, XDATA, NYDATA, YDATA, FDATA, LDF, CHECK)

Double: The double precision function name is DQD2DR.

Description

The function QD2DR interpolates a table of values, using quadratic polynomials, returning an approximation to the tabulated function. Let (xi, yj, fij) for i = 1, …, nx and j = 1, …, ny be the tabular data. Given a point (x, y) at which an interpolated value is desired, we first find the nearest interior grid point (xi, yj). A bivariate quadratic interpolant q is then formed using six points near (x, y). Five of the six points are (xi, yj), (xi±1, yj), and (xi, yj±1). The sixth point is the nearest point to (x, y) of the grid points (xi±1, yj±1). The value q(p, r) (x, y) is returned by QD2DR, where p = IXDER and r = IYDER.

Comments

1. Informational errors

Type | Code | Description |
---|---|---|

4 | 6 | The XDATA values must be strictly increasing. |

4 | 7 | The YDATA values must be strictly increasing. |

2. Because quadratic interpolation is used, if the order of any derivative is greater than two, then the returned value is zero.

Example

In this example, the partial derivatives of sin(x + y) at x = y = π/3 are approximated by using QD2DR on a table of size 21 × 42 equally spaced values on the rectangle [0, 2] × [0, 2].

USE IMSL_LIBRARIES

IMPLICIT NONE

INTEGER LDF, NXDATA, NYDATA

PARAMETER (NXDATA=21, NYDATA=42, LDF=NXDATA)

!

INTEGER I, IXDER, IYDER, J, NOUT

REAL F, FDATA(LDF,NYDATA), FLOAT, FU, FUNC, PI, Q,&

SIN, X, XDATA(NXDATA), Y, YDATA(NYDATA)

INTRINSIC FLOAT, SIN

EXTERNAL FUNC

! Define function

F(X,Y) = SIN(X+Y)

! Set up X-grid

DO 10 I=1, NXDATA

XDATA(I) = 2.0*(FLOAT(I-1)/FLOAT(NXDATA-1))

10 CONTINUE

! Set up Y-grid

DO 20 I=1, NYDATA

YDATA(I) = 2.0*(FLOAT(I-1)/FLOAT(NYDATA-1))

20 CONTINUE

! Evaluate function on grid

DO 30 I=1, NXDATA

DO 30 J=1, NYDATA

FDATA(I,J) = F(XDATA(I),YDATA(J))

30 CONTINUE

! Get output unit number

CALL UMACH (2, NOUT)

! Write heading

WRITE (NOUT,99998)

! Check XDATA and YDATA

! Get value for PI and set X and Y

PI = CONST('PI')

X = PI/3.0

Y = PI/3.0

! Evaluate and print the function

! and its derivatives at X=PI/3 and

! Y=PI/3.

DO 40 IXDER=0, 1

DO 40 IYDER=0, 1

Q = QD2DR(IXDER,IYDER,X,Y,XDATA,YDATA,FDATA)

FU = FUNC(IXDER,IYDER,X,Y)

WRITE (NOUT,99999) X, Y, IXDER, IYDER, FU, Q, (FU-Q)

40 CONTINUE

!

99998 FORMAT (32X, '(IDX,IDY)', /, 8X, 'X', 8X, 'Y', 3X, 'IDX', 2X,&

'IDY', 3X, 'F (X,Y)', 3X, 'QD2DR', 6X, 'ERROR')

99999 FORMAT (2F9.4, 2I5, 3X, F9.4, 2X, 2F11.4)

END

REAL FUNCTION FUNC (IX, IY, X, Y)

INTEGER IX, IY

REAL X, Y

!

REAL COS, SIN

INTRINSIC COS, SIN

!

IF (IX.EQ.0 .AND. IY.EQ.0) THEN

! Define (0,0) derivative

FUNC = SIN(X+Y)

ELSE IF (IX.EQ.0 .AND. IY.EQ.1) THEN

! Define (0,1) derivative

FUNC = COS(X+Y)

ELSE IF (IX.EQ.1 .AND. IY.EQ.0) THEN

! Define (1,0) derivative

FUNC = COS(X+Y)

ELSE IF (IX.EQ.1 .AND. IY.EQ.1) THEN

! Define (1,1) derivative

FUNC = -SIN(X+Y)

ELSE

FUNC = 0.0

END IF

RETURN

END

Output

(IDX,IDY)

X Y IDX IDY F (X,Y) QD2DR ERROR

1.0472 1.0472 0 0 0.8660 0.8661 -0.0001

1.0472 1.0472 0 1 -0.5000 -0.4993 -0.0007

1.0472 1.0472 1 0 -0.5000 -0.4995 -0.0005

1.0472 1.0472 1 1 -0.8660 -0.8634 -0.0026