Evaluates the derivative of a cubic spline on a grid.
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)
N — Length of
vector XVEC.
(Input)
Default: N = size (XVEC,1).
NINTV — Number of
polynomial pieces. (Input)
Default: NINTV = size
(BREAK,1) –
1.
Generic: CALL CS1GD (IDERIV, XVEC, BREAK, CSCOEF, VALUE [,…])
Specific: The specific interface names are S_CS1GD and D_CS1GD.
Single: CALL CS1GD (IDERIV, N, XVEC, NINTV, BREAK, CSCOEF, VALUE)
Double: The double precision name is DCS1GD.
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.
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
4 4 The points in XVEC must be strictly increasing.
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
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
Visual Numerics, Inc. PHONE: 713.784.3131 FAX:713.781.9260 |