| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 | *DECK BINTK      SUBROUTINE BINTK (X, Y, T, N, K, BCOEF, Q, WORK)C***BEGIN PROLOGUE  BINTKC***PURPOSE  Compute the B-representation of a spline which interpolatesC            given data.C***LIBRARY   SLATECC***CATEGORY  E1AC***TYPE      SINGLE PRECISION (BINTK-S, DBINTK-D)C***KEYWORDS  B-SPLINE, DATA FITTING, INTERPOLATIONC***AUTHOR  Amos, D. E., (SNLA)C***DESCRIPTIONCC     Written by Carl de Boor and modified by D. E. AmosCC     AbstractCC         BINTK is the SPLINT routine of the reference.CC         BINTK produces the B-spline coefficients, BCOEF, of theC         B-spline of order K with knots T(I), I=1,...,N+K, whichC         takes on the value Y(I) at X(I), I=1,...,N.  The spline orC         any of its derivatives can be evaluated by calls to BVALU.C         The I-th equation of the linear system A*BCOEF = B for theC         coefficients of the interpolant enforces interpolation atC         X(I)), I=1,...,N.  Hence, B(I) = Y(I), all I, and A isC         a band matrix with 2K-1 bands if A is invertible. The matrixC         A is generated row by row and stored, diagonal by diagonal,C         in the rows of Q, with the main diagonal going into row K.C         The banded system is then solved by a call to BNFAC (whichC         constructs the triangular factorization for A and stores itC         again in Q), followed by a call to BNSLV (which thenC         obtains the solution BCOEF by substitution). BNFAC does noC         pivoting, since the total positivity of the matrix A makesC         this unnecessary.  The linear system to be solved isC         (theoretically) invertible if and only ifC                 T(I) .LT. X(I)) .LT. T(I+K),        all I.C         Equality is permitted on the left for I=1 and on the rightC         for I=N when K knots are used at X(1) or X(N).  Otherwise,C         violation of this condition is certain to lead to an error.CC     Description of ArgumentsC         InputC           X       - vector of length N containing data point abscissaC                     in strictly increasing order.C           Y       - corresponding vector of length N containing dataC                     point ordinates.C           T       - knot vector of length N+KC                     since T(1),..,T(K) .LE. X(1) and T(N+1),..,T(N+K)C                     .GE. X(N), this leaves only N-K knots (not nec-C                     essarily X(I)) values) interior to (X(1),X(N))C           N       - number of data points, N .GE. KC           K       - order of the spline, K .GE. 1CC         OutputC           BCOEF   - a vector of length N containing the B-splineC                     coefficientsC           Q       - a work vector of length (2*K-1)*N, containingC                     the triangular factorization of the coefficientC                     matrix of the linear system being solved.  TheC                     coefficients for the interpolant of anC                     additional data set (X(I)),YY(I)), I=1,...,NC                     with the same abscissa can be obtained by loadingC                     YY into BCOEF and then executingC                         CALL BNSLV (Q,2K-1,N,K-1,K-1,BCOEF)C           WORK    - work vector of length 2*KCC     Error ConditionsC         Improper  input is a fatal errorC         Singular system of equations is a fatal errorCC***REFERENCES  D. E. Amos, Computation with splines and B-splines,C                 Report SAND78-1968, Sandia Laboratories, March 1979.C               Carl de Boor, Package for calculating with B-splines,C                 SIAM Journal on Numerical Analysis 14, 3 (June 1977),C                 pp. 441-472.C               Carl de Boor, A Practical Guide to Splines, AppliedC                 Mathematics Series 27, Springer-Verlag, New York,C                 1978.C***ROUTINES CALLED  BNFAC, BNSLV, BSPVN, XERMSGC***REVISION HISTORY  (YYMMDD)C   800901  DATE WRITTENC   890531  Changed all specific intrinsics to generic.  (WRB)C   890831  Modified array declarations.  (WRB)C   890831  REVISION DATE from Version 3.2C   891214  Prologue converted to Version 4.0 format.  (BAB)C   900315  CALLs to XERROR changed to CALLs to XERMSG.  (THJ)C   900326  Removed duplicate information from DESCRIPTION section.C           (WRB)C   920501  Reformatted the REFERENCES section.  (WRB)C***END PROLOGUE  BINTKC      INTEGER IFLAG, IWORK, K, N, I, ILP1MX, J, JJ, KM1, KPKM2, LEFT,     1 LENQ, NP1      REAL BCOEF(*), Y(*), Q(*), T(*), X(*), XI, WORK(*)C     DIMENSION Q(2*K-1,N), T(N+K)C***FIRST EXECUTABLE STATEMENT  BINTK      IF(K.LT.1) GO TO 100      IF(N.LT.K) GO TO 105      JJ = N - 1      IF(JJ.EQ.0) GO TO 6      DO 5 I=1,JJ      IF(X(I).GE.X(I+1)) GO TO 110    5 CONTINUE    6 CONTINUE      NP1 = N + 1      KM1 = K - 1      KPKM2 = 2*KM1      LEFT = KC                ZERO OUT ALL ENTRIES OF Q      LENQ = N*(K+KM1)      DO 10 I=1,LENQ        Q(I) = 0.0E0   10 CONTINUECC  ***   LOOP OVER I TO CONSTRUCT THE  N  INTERPOLATION EQUATIONS      DO 50 I=1,N        XI = X(I)        ILP1MX = MIN(I+K,NP1)C        *** FIND  LEFT  IN THE CLOSED INTERVAL (I,I+K-1) SUCH THATC                T(LEFT) .LE. X(I) .LT. T(LEFT+1)C        MATRIX IS SINGULAR IF THIS IS NOT POSSIBLE        LEFT = MAX(LEFT,I)        IF (XI.LT.T(LEFT)) GO TO 80   20   IF (XI.LT.T(LEFT+1)) GO TO 30        LEFT = LEFT + 1        IF (LEFT.LT.ILP1MX) GO TO 20        LEFT = LEFT - 1        IF (XI.GT.T(LEFT+1)) GO TO 80C        *** THE I-TH EQUATION ENFORCES INTERPOLATION AT XI, HENCEC        A(I,J) = B(J,K,T)(XI), ALL J. ONLY THE  K  ENTRIES WITH  J =C        LEFT-K+1,...,LEFT ACTUALLY MIGHT BE NONZERO. THESE  K  NUMBERSC        ARE RETURNED, IN  BCOEF (USED FOR TEMP. STORAGE HERE), BY THEC        FOLLOWING   30   CALL BSPVN(T, K, K, 1, XI, LEFT, BCOEF, WORK, IWORK)C        WE THEREFORE WANT  BCOEF(J) = B(LEFT-K+J)(XI) TO GO INTOC        A(I,LEFT-K+J), I.E., INTO  Q(I-(LEFT+J)+2*K,(LEFT+J)-K) SINCEC        A(I+J,J)  IS TO GO INTO  Q(I+K,J), ALL I,J,  IF WE CONSIDER  QC        AS A TWO-DIM. ARRAY , WITH  2*K-1  ROWS (SEE COMMENTS INC        BNFAC). IN THE PRESENT PROGRAM, WE TREAT  Q  AS AN EQUIVALENTC        ONE-DIMENSIONAL ARRAY (BECAUSE OF FORTRAN RESTRICTIONS ONC        DIMENSION STATEMENTS) . WE THEREFORE WANT  BCOEF(J) TO GO INTOC        ENTRYC            I -(LEFT+J) + 2*K + ((LEFT+J) - K-1)*(2*K-1)C                   =  I-LEFT+1 + (LEFT -K)*(2*K-1) + (2*K-2)*JC        OF  Q .        JJ = I - LEFT + 1 + (LEFT-K)*(K+KM1)        DO 40 J=1,K          JJ = JJ + KPKM2          Q(JJ) = BCOEF(J)   40   CONTINUE   50 CONTINUECC     ***OBTAIN FACTORIZATION OF  A  , STORED AGAIN IN  Q.      CALL BNFAC(Q, K+KM1, N, KM1, KM1, IFLAG)      GO TO (60, 90), IFLAGC     *** SOLVE  A*BCOEF = Y  BY BACKSUBSTITUTION   60 DO 70 I=1,N        BCOEF(I) = Y(I)   70 CONTINUE      CALL BNSLV(Q, K+KM1, N, KM1, KM1, BCOEF)      RETURNCC   80 CONTINUE      CALL XERMSG ('SLATEC', 'BINTK',     +   'SOME ABSCISSA WAS NOT IN THE SUPPORT OF THE CORRESPONDING ' //     +   'BASIS FUNCTION AND THE SYSTEM IS SINGULAR.', 2, 1)      RETURN   90 CONTINUE      CALL XERMSG ('SLATEC', 'BINTK',     +   'THE SYSTEM OF SOLVER DETECTS A SINGULAR SYSTEM ALTHOUGH ' //     +   'THE THEORETICAL CONDITIONS FOR A SOLUTION WERE SATISFIED.',     +   8, 1)      RETURN  100 CONTINUE      CALL XERMSG ('SLATEC', 'BINTK', 'K DOES NOT SATISFY K.GE.1', 2,     +   1)      RETURN  105 CONTINUE      CALL XERMSG ('SLATEC', 'BINTK', 'N DOES NOT SATISFY N.GE.K', 2,     +   1)      RETURN  110 CONTINUE      CALL XERMSG ('SLATEC', 'BINTK',     +   'X(I) DOES NOT SATISFY X(I).LT.X(I+1) FOR SOME I', 2, 1)      RETURN      END
 |