End of file
Contents
Index

F 10 Interpolating Polynomial Splines for Constructing Smooth Curves

F 10.1.2 Non-Parametric Cubic Splines


      SUBROUTINE ISPLNP (N,XN,FN,IB,ALPHA,BETA,B,C,D,DUMMY,IERR)
C
C*********************************************************************
C                                                                    *
C  ISPLNP computes the coefficients B(I), C(I), D(I) for I=0,1,...,  *
C  N-1 of a nonparametric cubic interpolating spline for various end *
C  point conditions.                                                 *
C  The end point condition can be specified using the parameter IB   *
C  The spline function S has the form:                               *
C                                                                    *
C  S(X) = FN(I) + B(I)(X-XN(I)) + C(I)(X-XN(I))**2 +                 *
C                               + D(I)(X-XN(I))**3                   *
C                                                                    *
C  for X in the interval [XN(I),XN(I+1)], I=0,1,...,N-1.             *
C                                                                    *
C                                                                    *
C  ASSUMPTIONS:    1.         N > 2                                  *
C  ============    2.     XN(I) < XN(I+1), I=0,1,...,N-1             *
C                  3.     FN(0) = FN(N)  , if IB = 4                 *
C                                                                    *
C                                                                    *
C  INPUT PARAMETERS:                                                 *
C  =================                                                 *
C  N  :  index of the final node                                     *
C  XN :  vector XN(0:N); the nodes XN(I), I = 0,1,...,N              *
C  FN :  vector FN(0:N); the functional values FN(I) = FN( XN(I) )   *
C                                                                    *
C  IB :  specifies the end point condition:                          *
C        IB = 1:  first end point derivative                         *
C        IB = 2:  second end point derivative                        *
C        IB = 3:  third end point derivative                         *
C        IB = 4:  periodic spline                                    *
C        IB = 5:  'not-a-node' - condition                           *
C                                                                    *
C  ALPHA :  IBth derivative at XN(0) ]  used only for IB = 1,2,3;    *
C  BETA  :  IBth derivative at XN(N) ]  not used for IB = 4,5.       *
C                                                                    *
C  (A natural spline will result by setting ALPHA = BETA = 0.0 and   *
C   IB = 2.)                                                         *
C                                                                    *
C                                                                    *
C  AUXILIARY VARIABLES:                                              *
C  ====================                                              *
C  DUMMY :  vector DUMMY(1:5*N+1)                                    *
C                                                                    *
C                                                                    *
C  OUTPUT PARAMETERS:                                                *
C  ==================                                                *
C  FN :  ]  N+1-vectors ..(0:N);                                     *
C  B  :  ]  The first N entries of B, C and D are the spline         *
C  C  :  ]  coefficients for S. B(N), C(N), D(N) are auxiliary       *
C  D  :  ]  variables.                                               *
C  IERR :  error parameter                                           *
C          =  0 :  All is ok                                         *
C          = -1 :  N < 4                                             *
C          = -2 :  IB < 1 or IB > 5                                  *
C          = -3 :  nodes not monotone, XN(I) => XN(I+1) for some     *
C                  I = 0, 1, ..., N-1                                *
C          = -4 :  IB = 4 and FN(0) not equal to FN(N)               *
C          =  1 :  crash in SUBROUTINE TRDSY, TRDIG or CYTSY,        *
C                  system matrix is numerically singular             *
C                                                                    *
C--------------------------------------------------------------------*
C                                                                    *
C  Subroutines required: ISPL1D, ISPL2D, ISPL3D, ISPLPE, ISPLNK,     *
C                        TRDSY, TRDSYS, CYTSY, CYTSYS, TRDIG         *
C                                                                    *
C*********************************************************************
C                                                                    *
C  Author   : Günter Palm                                            *
C  Date     : 15.04.1988                                             *
C  Source   : FORTRAN 77                                             *
C                                                                    *
C*********************************************************************
C
      IMPLICIT DOUBLE PRECISION (A-H, O-Z)
      DOUBLE PRECISION XN(0:N), FN(0:N), B(0:N), C(0:N), D(0:N),
     +                 DUMMY(1:5*N+1)
C
C-----Check input data
C
      IERR = -1
      IF (N .LT. 3) RETURN
      DO 10 I=0,N-1,1
        IF (XN(I) .GE. XN(I+1)) THEN
          IERR = -3
          RETURN
        ENDIF
   10 CONTINUE
C
C-----Compute spline coefficients for the indicated
C     end point condition
C
      IF (IB .EQ. 1) THEN
        CALL ISPL1D (N,XN,FN,ALPHA,BETA,1,B,C,D,DUMMY(1),DUMMY(N+1),
     +               DUMMY(2*N),DUMMY(3*N-1),IERR)
      ELSEIF (IB .EQ. 2) THEN
        CALL ISPL2D (N,XN,FN,ALPHA,BETA,1,B,C,D,DUMMY(1),DUMMY(N+1),
     +               DUMMY(2*N),DUMMY(3*N-1),IERR)
      ELSEIF (IB .EQ. 3) THEN
        CALL ISPL3D (N,XN,FN,ALPHA,BETA,B,C,D,DUMMY(1),DUMMY(N+1),
     +               IERR)
      ELSEIF (IB .EQ. 4) THEN
        CALL ISPLPE (N,XN,FN,1,B,C,D,DUMMY(1),DUMMY(N+2),
     +               DUMMY(2*N+2),DUMMY(3*N+2),DUMMY(4*N+2),IERR)
      ELSEIF (IB .EQ. 5) THEN
        CALL ISPLNK (N,XN,FN,B,C,D,DUMMY(1),DUMMY(N+1),DUMMY(2*N),
     +               IERR)
      ELSE
        IERR = -2
      ENDIF
      RETURN
      END


Begin of file
Contents
Index