Evaluates the derivative of a piecewise polynomial on a grid.
XVEC — Array of
length N
containing the points at which the piecewise polynomial 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 polynomial
representation. (Input)
BREAK must be strictly
increasing.
PPCOEF — Matrix of size KORDER by NINTV containing the local coefficients of the polynomial pieces. (Input)
VALUE — Array of length N containing the values of the IDERIV-th derivative of the piecewise polynomial at the points in XVEC. (Output)
IDERIV — Order of
the derivative to be evaluated. (Input)
In particular, IDERIV = 0 returns the
values of the piecewise polynomial.
Default: IDERIV = 1.
N — Length of
vector XVEC.
(Input)
Default: N = size (XVEC,1).
KORDER — Order of
the polynomial. (Input)
Default: KORDER = size (PPCOEF,1).
NINTV — Number of
polynomial pieces. (Input)
Default: NINTV = size
(PPCOEF,2).
Generic: CALL PP1GD (XVEC, BREAK, PPCOEF, VALUE [,…])
Specific: The specific interface names are S_PP1GD and D_PP1GD.
Single: CALL PP1GD (IDERIV, N, XVEC, KORDER, NINTV, BREAK, PPCOEF, VALUE)
Double: The double precision name is DPP1GD.
The routine PP1GD evaluates a piecewise polynomial function f (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 piecewise polynomial function f that is represented by a breakpoint sequence and coefficient matrix this routine returns the values
in the array VALUE. The functionality of this routine is the same as that of PPDER called in a loop, however PP1GD is much more efficient.
1. Workspace may be explicitly provided, if desired, by use of P21GD/DP21GD. The reference is:
CALL P21GD (IDERIV, N, XVEC, KORDER, NINTV, BREAK, PPCOEF, 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 PP1GD, we modify the example program for PPDER. In this example, a piecewise polynomial interpolant to F is computed. The values of this polynomial are then compared with the exact function values. The routine PP1GD is based on the routine PPVALU in de Boor (1978, page 89).
USE IMSL_LIBRARIES
IMPLICIT NONE
INTEGER KORDER, N, NCOEF, NDATA, NKNOT
PARAMETER (KORDER=4, N=20, NCOEF=20, NDATA=20,&
NKNOT=NDATA+KORDER)
!
INTEGER I, NINTV, NOUT, NPPCF
REAL BREAK(NCOEF), BSCOEF(NCOEF), DF, EXP, F,&
FDATA(NDATA), FLOAT, PPCOEF(KORDER,NCOEF), VALUE1(N),&
VALUE2(N), X, XDATA(NDATA), XKNOT(NKNOT), XVEC(N)
INTRINSIC EXP, FLOAT
!
F(X) = X*EXP(X)
DF(X) = (X+1.)*EXP(X)
! Set up interpolation points
DO 10 I=1, NDATA
XDATA(I) = FLOAT(I-1)/FLOAT(NDATA-1)
FDATA(I) = F(XDATA(I))
10 CONTINUE
! Generate knot sequence
CALL BSNAK (NDATA, XDATA, KORDER, XKNOT)
! Compute the B-spline interpolant
CALL BSINT (NCOEF, XDATA, FDATA, KORDER, XKNOT, BSCOEF)
! Convert to piecewise polynomial
CALL BSCPP (KORDER, XKNOT, NCOEF, BSCOEF, NPPCF, BREAK, PPCOEF)
! Compute evaluation points
DO 20 I=1, N
XVEC(I) = FLOAT(I-1)/FLOAT(N-1)
20 CONTINUE
! Compute values of the piecewise
! polynomial
NINTV = NPPCF
CALL PP1GD (XVEC, BREAK, PPCOEF, VALUE1, IDERIV=0, NINTV=NINTV)
! Compute the values of the first
! derivative of the piecewise
! polynomial
CALL PP1GD (XVEC, BREAK, PPCOEF, VALUE2, IDERIV=1, NINTV=NINTV)
! Get output unit number
CALL UMACH (2, NOUT)
! Write heading
WRITE (NOUT,99998)
! Print the results on a uniform
! grid
DO 30 I=1, N
WRITE (NOUT,99999) XVEC(I), VALUE1(I), F(XVEC(I)) - VALUE1(I)&
, VALUE2(I), DF(XVEC(I)) - VALUE2(I)
30 CONTINUE
99998 FORMAT (11X, 'X', 8X, 'S(X)', 7X, 'Error', 7X, 'S''(X)', 7X,&
'Error')
99999 FORMAT (' ', 2F12.3, F12.6, F12.3, F12.6)
END
X
S(X)
Error
S'(X)
Error
0.000 0.000
0.000000 1.000
-0.000112
0.053 0.055
0.000000 1.109
0.000030
0.105 0.117
0.000000 1.228
-0.000008
0.158 0.185
0.000000 1.356
0.000002
0.211 0.260
0.000000 1.494
0.000000
0.263 0.342
0.000000 1.643
0.000000
0.316 0.433
0.000000 1.804
-0.000001
0.368 0.533
0.000000 1.978
0.000002
0.421 0.642
0.000000 2.165
0.000001
0.474 0.761
0.000000 2.367
0.000000
0.526 0.891
0.000000 2.584
-0.000001
0.579 1.033
0.000000 2.817
0.000001
0.632 1.188
0.000000 3.068
0.000001
0.684 1.356
0.000000 3.338
0.000001
0.737 1.540
0.000000 3.629
0.000001
0.789 1.739
0.000000 3.941
0.000000
0.842 1.955
0.000000 4.276
-0.000006
0.895 2.189
0.000000 4.636
0.000024
0.947 2.443
0.000000 5.022
-0.000090
1.000 2.718
0.000000 5.436
0.000341
Visual Numerics, Inc. PHONE: 713.784.3131 FAX:713.781.9260 |