PPVAL
This function evaluates a piecewise polynomial.
Function Return Value
PPVAL — Value of the piecewise polynomial at X. (Output)
Required Arguments
X — Point at which the polynomial is to be evaluated. (Input)
BREAK — Array of length NINTV + 1 containing the breakpoints of the piecewise polynomial representation. (Input)
BREAK must be strictly increasing.
PPCOEF — Array of size KORDER * NINTV containing the local coefficients of the piecewise polynomial pieces. (Input)
PPCOEF is treated internally as a matrix of size KORDER by NINTV.
Optional Arguments
KORDER — Order of the polynomial. (Input)
Default: KORDER = size (PPCOEF,1).
NINTV — Number of polynomial pieces. (Input)
Default: NINTV = size (PPCOEF,2).
FORTRAN 90 Interface
Generic: PPVAL (X, BREAK, PPCOEF [, …])
Specific: The specific interface names are S_PPVAL and D_PPVAL.
FORTRAN 77 Interface
Single: PPVAL (X, KORDER, NINTV, BREAK, PPCOEF)
Double: The double precision function name is DPPVAL.
Description
The routine PPVAL evaluates a piecewise polynomial at a given point. This routine is a special case of the routine PPDER, which evaluates the derivative of a piecewise polynomial. (The value of a piecewise polynomial is its zero-th derivative.)
The routine PPDER is based on the routine PPVALU in de Boor (1978, page 89).
Example
In this example, a spline interpolant to a function f is computed using the IMSL routine BSINT. This routine represents the interpolant as a linear combination of B-splines. This representation is then converted to piecewise polynomial representation by calling the IMSL routine BSCPP. The piecewise polynomial is evaluated using PPVAL. These values are compared to the corresponding values of f.
USE PPVAL_INT
USE BSNAK_INT
USE BSCPP_INT
USE BSINT_INT
USE UMACH_INT
IMPLICIT NONE
INTEGER KORDER, NCOEF, NDATA, NKNOT
PARAMETER (KORDER=4, NCOEF=20, NDATA=20, NKNOT=NDATA+KORDER)
!
INTEGER I, NOUT, NPPCF
REAL BREAK(NCOEF), BSCOEF(NCOEF), EXP, F, FDATA(NDATA),&
FLOAT, PPCOEF(KORDER,NCOEF), S, X, XDATA(NDATA),&
XKNOT(NKNOT)
INTRINSIC EXP, FLOAT
! Define function
F(X) = X*EXP(X)
! Set up interpolation points
DO 30 I=1, NDATA
XDATA(I) = FLOAT(I-1)/FLOAT(NDATA-1)
FDATA(I) = F(XDATA(I))
30 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)
! Get output unit number
CALL UMACH (2, NOUT)
! Write heading
WRITE (NOUT,99999)
! Print the interpolant on a uniform
! grid
DO 40 I=1, NDATA
X = FLOAT(I-1)/FLOAT(NDATA-1)
! Compute value of the piecewise
! polynomial
S = PPVAL(X,BREAK,PPCOEF)
WRITE (NOUT,'(2F12.3, E14.3)') X, S, F(X) - S
40 CONTINUE
99999 FORMAT (11X, 'X', 8X, 'S(X)', 7X, 'Error')
END
X S(X) Error
0.000 0.000 0.000E+00
0.053 0.055 -0.745E-08
0.105 0.117 0.000E+00
0.158 0.185 0.000E+00
0.211 0.260 -0.298E-07
0.263 0.342 0.298E-07
0.316 0.433 0.000E+00
0.368 0.533 0.000E+00
0.421 0.642 0.000E+00
0.474 0.761 0.596E-07
0.526 0.891 0.000E+00
0.579 1.033 0.000E+00
0.632 1.188 0.000E+00
0.684 1.356 0.000E+00
0.737 1.540 -0.119E-06
0.789 1.739 0.000E+00
0.842 1.955 0.000E+00
0.895 2.189 0.238E-06
0.947 2.443 0.238E-06
1.000 2.718 0.238E-06