Computes the optimal spline knot sequence.
NDATA Number of data points. (Input)
XDATA Array of length NDATA containing the location of the data points. (Input)
KORDER Order of the spline. (Input)
XKNOT Array of length NDATA + KORDER containing the knot sequence. (Output)
Generic: CALL BSOPK (NDATA, XDATA, KORDER, XKNOT)
Specific: The specific interface names are S_BSOPK and D_BSOPK.
Single: CALL BSOPK (NDATA, XDATA, KORDER, XKNOT)
Double: The double precision name is DBSOPK.
Given the abscissas x = XDATA for an interpolation problem and the order of the spline interpolant k = KORDER, BSOPK returns the knot sequence t = XKNOT that minimizes the constant in the error estimate
|| f − s || ≤ c || f (k) ||
In the above formula, f is any function in Ck and s is the spline interpolant to f at the abscissas x with knot sequence t.
The algorithm is based on a routine described in de Boor (1978, page 204), which in turn is based on a theorem of Micchelli, Rivlin and Winograd (1976).
1. Workspace may be explicitly provided, if desired, by use of B2OPK/DB2OPK. The reference is:
CALL B2OPK (NDATA, XDATA, KORDER, XKNOT, MAXIT, WK, IWK)
The additional arguments are as follows:
MAXIT Maximum number of iterations of Newton's Method. (Input) A suggested value is 10.
WK Work
array of length (NDATA
− KORDER) * (3 * KORDER
− 2) +
6 * NDATA + 2 * KORDER
+ 5.
IWK Work array of length NDATA.
2. Informational errors
Type Code
3 6 Newton's method iteration did not converge.
4 3 The XDATA values must be distinct.
4 4 Interpolation matrix is singular. The XDATA values may be too close together.
3. The default value for MAXIT is 10, this can be overridden by calling B2OPK/DB2OPK directly with a larger value.
In this example, we compute (for k = 3, , 8) six spline interpolants sk to F(x) = sin(10x3) on the interval [0, 1]. The routine BSOPK is used to generate the knot sequences for sk and then BSINT is called to obtain the interpolant. We evaluate the absolute error
| sk − F |
at 100 equally spaced points and print the maximum error for each k.
USE BSOPK_INT
USE BSINT_INT
USE UMACH_INT
USE BSVAL_INT
IMPLICIT NONE
INTEGER KMAX, KMIN, NDATA
PARAMETER (KMAX=8, KMIN=3, NDATA=20)
!
INTEGER I, K, KORDER, NOUT
REAL ABS, AMAX1, BSCOEF(NDATA), DIF, DIFMAX, F,&
FDATA(NDATA), FLOAT, FT, SIN, ST, T, X, XDATA(NDATA),&
XKNOT(KMAX+NDATA), XT
INTRINSIC ABS, AMAX1, FLOAT, SIN
! Define function and tau function
F(X) = SIN(10.0*X*X*X)
T(X) = 1.0 - X*X
! Set up data
DO 10 I=1, NDATA
XT = FLOAT(I-1)/FLOAT(NDATA-1)
XDATA(I) = T(XT)
FDATA(I) = F(XDATA(I))
10 CONTINUE
! Get output unit number
CALL UMACH (2, NOUT)
! Write heading
WRITE (NOUT,99999)
! Loop over different orders
DO 30 K=KMIN, KMAX
KORDER = K
! Generate knots
CALL BSOPK (NDATA, XDATA, KORDER, XKNOT)
! Interpolate
CALL BSINT (NDATA, XDATA, FDATA, KORDER, XKNOT, BSCOEF)
DIFMAX = 0.0
DO 20 I=1, 100
XT = FLOAT(I-1)/99.0
! Evaluate spline
ST = BSVAL(XT,KORDER,XKNOT,NDATA,BSCOEF)
FT = F(XT)
DIF = ABS(FT-ST)
! Compute maximum difference
DIFMAX = AMAX1(DIF,DIFMAX)
20 CONTINUE
! Print maximum difference
WRITE (NOUT,99998) KORDER, DIFMAX
30 CONTINUE
!
99998 FORMAT (' ', I3, 5X, F9.4)
99999 FORMAT (' KORDER', 5X, 'Maximum difference', /)
END
KORDER Maximum
difference
3
0.0096
4
0.0018
5
0.0005
6
0.0004
7
0.0007
8 0.0035
Visual Numerics, Inc. PHONE: 713.784.3131 FAX:713.781.9260 |