CS1GD

Evaluates the derivative of a cubic spline on a grid.

Required Arguments

IDERIV — Order of the derivative to be evaluated. (Input)
In particular, IDERIV = 0 returns the values of the cubic spline.

XVEC — Array of length N containing the points at which the cubic spline is to be evaluated. (Input)
The points in XVEC should be strictly increasing.

BREAK — Array of length NINTV + 1 containing the breakpoints for the piecewise cubic representation. (Input)
BREAK must be strictly increasing.

CSCOEF — Matrix of size 4 by NINTV + 1 containing the local coefficients of the cubic pieces. (Input)

VALUE — Array of length N containing the values of the IDERIV-th derivative of the cubic spline at the points in XVEC. (Output)

Optional Arguments

N — Length of vector XVEC. (Input)
Default: N = size (XVEC,1).

NINTV — Number of polynomial pieces. (Input)
Default: NINTV = size (BREAK,1) -1.

FORTRAN 90 Interface

Generic: CALL CS1GD (IDERIV, XVEC, BREAK, CSCOEF, VALUE [])

Specific: The specific interface names are S_CS1GD and D_CS1GD.

FORTRAN 77 Interface

Single: CALL CS1GD (IDERIV, N, XVEC, NINTV, BREAK, CSCOEF, VALUE)

Double: The double precision name is DCS1GD.

Description

The routine CS1GD evaluates a cubic spline (or its derivative) at a vector of points. That is, given a vector x of length n satisfying xi < xi + 1 for i = 1, n  1, a derivative value j, and a cubic spline s that is represented by a breakpoint sequence and coefficient matrix this routine returns the values

s(j)(xi)           i = 1, , n

in the array VALUE. The functionality of this routine is the same as that of CSDER called in a loop, however CS1GD should be much more efficient.

Comments

1. Workspace may be explicitly provided, if desired, by use of C21GD/DC21GD. The reference is:

CALL C21GD (IDERIV, N, XVEC, NINTV, BREAK, CSCOEF, VALUE, IWK, WORK1, WORK2)

The additional arguments are as follows:

IWK — Array of length N.

WORK1 — Array of length N.

WORK2 — Array of length N.

2. Informational error

 

Type

Code

Description

4

4

The points in XVEC must be strictly increasing.

Example

To illustrate the use of CS1GD, we modify the example program for CSINT. In this example, a cubic spline interpolant to F is computed. The values of this spline are then compared with the exact function values. The routine CS1GD is based on the routine PPVALU in de Boor (1978, page 89).

 

USE CS1GD_INT

USE CSINT_INT

USE UMACH_INT

USE CSVAL_INT

 

IMPLICIT NONE

! Specifications

INTEGER NDATA, N, IDERIV, J

PARAMETER (NDATA=11, N=2*NDATA-1)

!

INTEGER I, NINTV, NOUT

REAL BREAK(NDATA), CSCOEF(4,NDATA), F,&

FDATA(NDATA), FLOAT, SIN, X, XDATA(NDATA),&

FVALUE(N), VALUE(N), XVEC(N)

INTRINSIC FLOAT, SIN

! Define function

F(X) = SIN(15.0*X)

! Set up a grid

DO 10 I=1, NDATA

XDATA(I) = FLOAT(I-1)/FLOAT(NDATA-1)

FDATA(I) = F(XDATA(I))

10 CONTINUE

! Compute cubic spline interpolant

CALL CSINT (XDATA, FDATA, BREAK, CSCOEF)

DO 20 I=1, N

XVEC(I) = FLOAT(I-1)/FLOAT(2*NDATA-2)

FVALUE(I) = F(XVEC(I))

20 CONTINUE

IDERIV = 0

NINTV = NDATA - 1

CALL CS1GD (IDERIV, XVEC, BREAK, CSCOEF, VALUE)

! Get output unit number.

CALL UMACH (2, NOUT)

! Write heading

WRITE (NOUT,99999)

99999 FORMAT (13X, 'X', 9X, 'Interpolant', 5X, 'Error')

! Print the interpolant and the error

! on a finer grid

DO 30 J=1, N

WRITE (NOUT,'(2F15.3,F15.6)') XVEC(J), VALUE(J),&

FVALUE(J)-VALUE(J)

30 CONTINUE

END

Output

 

X Interpolant Error

0.000 0.000 0.000000

0.050 0.809 -0.127025

0.100 0.997 0.000000

0.150 0.723 0.055214

0.200 0.141 0.000000

0.250 -0.549 -0.022789

0.300 -0.978 0.000000

0.350 -0.843 -0.016246

0.400 -0.279 0.000000

0.450 0.441 0.009348

0.500 0.938 0.000000

0.550 0.903 0.019947

0.600 0.412 0.000000

0.650 -0.315 -0.004895

0.700 -0.880 0.000000

0.750 -0.938 -0.029541

0.800 -0.537 0.000000

0.850 0.148 0.034693

0.900 0.804 0.000000

0.950 1.086 -0.092559

1.000 0.650 0.000000