bint4.f 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. *DECK BINT4
  2. SUBROUTINE BINT4 (X, Y, NDATA, IBCL, IBCR, FBCL, FBCR, KNTOPT, T,
  3. + BCOEF, N, K, W)
  4. C***BEGIN PROLOGUE BINT4
  5. C***PURPOSE Compute the B-representation of a cubic spline
  6. C which interpolates given data.
  7. C***LIBRARY SLATEC
  8. C***CATEGORY E1A
  9. C***TYPE SINGLE PRECISION (BINT4-S, DBINT4-D)
  10. C***KEYWORDS B-SPLINE, CUBIC SPLINES, DATA FITTING, INTERPOLATION
  11. C***AUTHOR Amos, D. E., (SNLA)
  12. C***DESCRIPTION
  13. C
  14. C Abstract
  15. C BINT4 computes the B representation (T,BCOEF,N,K) of a
  16. C cubic spline (K=4) which interpolates data (X(I)),Y(I))),
  17. C I=1,NDATA. Parameters IBCL, IBCR, FBCL, FBCR allow the
  18. C specification of the spline first or second derivative at
  19. C both X(1) and X(NDATA). When this data is not specified
  20. C by the problem, it is common practice to use a natural
  21. C spline by setting second derivatives at X(1) and X(NDATA)
  22. C to zero (IBCL=IBCR=2,FBCL=FBCR=0.0). The spline is defined on
  23. C T(4) .LE. X .LE. T(N+1) with (ordered) interior knots at X(I))
  24. C values where N=NDATA+2. The knots T(1), T(2), T(3) lie to
  25. C the left of T(4)=X(1) and the knots T(N+2), T(N+3), T(N+4)
  26. C lie to the right of T(N+1)=X(NDATA) in increasing order. If
  27. C no extrapolation outside (X(1),X(NDATA)) is anticipated, the
  28. C knots T(1)=T(2)=T(3)=T(4)=X(1) and T(N+2)=T(N+3)=T(N+4)=
  29. C T(N+1)=X(NDATA) can be specified by KNTOPT=1. KNTOPT=2
  30. C selects a knot placement for T(1), T(2), T(3) to make the
  31. C first 7 knots symmetric about T(4)=X(1) and similarly for
  32. C T(N+2), T(N+3), T(N+4) about T(N+1)=X(NDATA). KNTOPT=3
  33. C allows the user to make his own selection, in increasing
  34. C order, for T(1), T(2), T(3) to the left of X(1) and T(N+2),
  35. C T(N+3), T(N+4) to the right of X(NDATA) in the work array
  36. C W(1) through W(6). In any case, the interpolation on
  37. C T(4) .LE. X .LE. T(N+1) by using function BVALU is unique
  38. C for given boundary conditions.
  39. C
  40. C Description of Arguments
  41. C Input
  42. C X - X vector of abscissae of length NDATA, distinct
  43. C and in increasing order
  44. C Y - Y vector of ordinates of length NDATA
  45. C NDATA - number of data points, NDATA .GE. 2
  46. C IBCL - selection parameter for left boundary condition
  47. C IBCL = 1 constrain the first derivative at
  48. C X(1) to FBCL
  49. C = 2 constrain the second derivative at
  50. C X(1) to FBCL
  51. C IBCR - selection parameter for right boundary condition
  52. C IBCR = 1 constrain first derivative at
  53. C X(NDATA) to FBCR
  54. C IBCR = 2 constrain second derivative at
  55. C X(NDATA) to FBCR
  56. C FBCL - left boundary values governed by IBCL
  57. C FBCR - right boundary values governed by IBCR
  58. C KNTOPT - knot selection parameter
  59. C KNTOPT = 1 sets knot multiplicity at T(4) and
  60. C T(N+1) to 4
  61. C = 2 sets a symmetric placement of knots
  62. C about T(4) and T(N+1)
  63. C = 3 sets TNP)=WNP) and T(N+1+I)=w(3+I),I=1,3
  64. C where WNP),I=1,6 is supplied by the user
  65. C W - work array of dimension at least 5*(NDATA+2)
  66. C if KNTOPT=3, then W(1),W(2),W(3) are knot values to
  67. C the left of X(1) and W(4),W(5),W(6) are knot
  68. C values to the right of X(NDATA) in increasing
  69. C order to be supplied by the user
  70. C
  71. C Output
  72. C T - knot array of length N+4
  73. C BCOEF - B-spline coefficient array of length N
  74. C N - number of coefficients, N=NDATA+2
  75. C K - order of spline, K=4
  76. C
  77. C Error Conditions
  78. C Improper input is a fatal error
  79. C Singular system of equations is a fatal error
  80. C
  81. C***REFERENCES D. E. Amos, Computation with splines and B-splines,
  82. C Report SAND78-1968, Sandia Laboratories, March 1979.
  83. C Carl de Boor, Package for calculating with B-splines,
  84. C SIAM Journal on Numerical Analysis 14, 3 (June 1977),
  85. C pp. 441-472.
  86. C Carl de Boor, A Practical Guide to Splines, Applied
  87. C Mathematics Series 27, Springer-Verlag, New York,
  88. C 1978.
  89. C***ROUTINES CALLED BNFAC, BNSLV, BSPVD, R1MACH, XERMSG
  90. C***REVISION HISTORY (YYMMDD)
  91. C 800901 DATE WRITTEN
  92. C 890531 Changed all specific intrinsics to generic. (WRB)
  93. C 890531 REVISION DATE from Version 3.2
  94. C 891214 Prologue converted to Version 4.0 format. (BAB)
  95. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  96. C 900326 Removed duplicate information from DESCRIPTION section.
  97. C (WRB)
  98. C 920501 Reformatted the REFERENCES section. (WRB)
  99. C***END PROLOGUE BINT4
  100. C
  101. INTEGER I, IBCL, IBCR, IFLAG, ILB, ILEFT, IT, IUB, IW, IWP, J,
  102. 1 JW, K, KNTOPT, N, NDATA, NDM, NP, NWROW
  103. REAL BCOEF,FBCL,FBCR,T, TOL,TXN,TX1,VNIKX,W,WDTOL,WORK,X, XL,
  104. 1 Y
  105. REAL R1MACH
  106. DIMENSION X(*), Y(*), T(*), BCOEF(*), W(5,*), VNIKX(4,4), WORK(15)
  107. C***FIRST EXECUTABLE STATEMENT BINT4
  108. WDTOL = R1MACH(4)
  109. TOL = SQRT(WDTOL)
  110. IF (NDATA.LT.2) GO TO 200
  111. NDM = NDATA - 1
  112. DO 10 I=1,NDM
  113. IF (X(I).GE.X(I+1)) GO TO 210
  114. 10 CONTINUE
  115. IF (IBCL.LT.1 .OR. IBCL.GT.2) GO TO 220
  116. IF (IBCR.LT.1 .OR. IBCR.GT.2) GO TO 230
  117. IF (KNTOPT.LT.1 .OR. KNTOPT.GT.3) GO TO 240
  118. K = 4
  119. N = NDATA + 2
  120. NP = N + 1
  121. DO 20 I=1,NDATA
  122. T(I+3) = X(I)
  123. 20 CONTINUE
  124. GO TO (30, 50, 90), KNTOPT
  125. C SET UP KNOT ARRAY WITH MULTIPLICITY 4 AT X(1) AND X(NDATA)
  126. 30 CONTINUE
  127. DO 40 I=1,3
  128. T(4-I) = X(1)
  129. T(NP+I) = X(NDATA)
  130. 40 CONTINUE
  131. GO TO 110
  132. C SET UP KNOT ARRAY WITH SYMMETRIC PLACEMENT ABOUT END POINTS
  133. 50 CONTINUE
  134. IF (NDATA.GT.3) GO TO 70
  135. XL = (X(NDATA)-X(1))/3.0E0
  136. DO 60 I=1,3
  137. T(4-I) = T(5-I) - XL
  138. T(NP+I) = T(NP+I-1) + XL
  139. 60 CONTINUE
  140. GO TO 110
  141. 70 CONTINUE
  142. TX1 = X(1) + X(1)
  143. TXN = X(NDATA) + X(NDATA)
  144. DO 80 I=1,3
  145. T(4-I) = TX1 - X(I+1)
  146. T(NP+I) = TXN - X(NDATA-I)
  147. 80 CONTINUE
  148. GO TO 110
  149. C SET UP KNOT ARRAY LESS THAN X(1) AND GREATER THAN X(NDATA) TO BE
  150. C SUPPLIED BY USER IN WORK LOCATIONS W(1) THROUGH W(6) WHEN KNTOPT=3
  151. 90 CONTINUE
  152. DO 100 I=1,3
  153. T(4-I) = W(4-I,1)
  154. JW = MAX(1,I-1)
  155. IW = MOD(I+2,5)+1
  156. T(NP+I) = W(IW,JW)
  157. IF (T(4-I).GT.T(5-I)) GO TO 250
  158. IF (T(NP+I).LT.T(NP+I-1)) GO TO 250
  159. 100 CONTINUE
  160. 110 CONTINUE
  161. C
  162. DO 130 I=1,5
  163. DO 120 J=1,N
  164. W(I,J) = 0.0E0
  165. 120 CONTINUE
  166. 130 CONTINUE
  167. C SET UP LEFT INTERPOLATION POINT AND LEFT BOUNDARY CONDITION FOR
  168. C RIGHT LIMITS
  169. IT = IBCL + 1
  170. CALL BSPVD(T, K, IT, X(1), K, 4, VNIKX, WORK)
  171. IW = 0
  172. IF (ABS(VNIKX(3,1)).LT.TOL) IW = 1
  173. DO 140 J=1,3
  174. W(J+1,4-J) = VNIKX(4-J,IT)
  175. W(J,4-J) = VNIKX(4-J,1)
  176. 140 CONTINUE
  177. BCOEF(1) = Y(1)
  178. BCOEF(2) = FBCL
  179. C SET UP INTERPOLATION EQUATIONS FOR POINTS I=2 TO I=NDATA-1
  180. ILEFT = 4
  181. IF (NDM.LT.2) GO TO 170
  182. DO 160 I=2,NDM
  183. ILEFT = ILEFT + 1
  184. CALL BSPVD(T, K, 1, X(I), ILEFT, 4, VNIKX, WORK)
  185. DO 150 J=1,3
  186. W(J+1,3+I-J) = VNIKX(4-J,1)
  187. 150 CONTINUE
  188. BCOEF(I+1) = Y(I)
  189. 160 CONTINUE
  190. C SET UP RIGHT INTERPOLATION POINT AND RIGHT BOUNDARY CONDITION FOR
  191. C LEFT LIMITS(ILEFT IS ASSOCIATED WITH T(N)=X(NDATA-1))
  192. 170 CONTINUE
  193. IT = IBCR + 1
  194. CALL BSPVD(T, K, IT, X(NDATA), ILEFT, 4, VNIKX, WORK)
  195. JW = 0
  196. IF (ABS(VNIKX(2,1)).LT.TOL) JW = 1
  197. DO 180 J=1,3
  198. W(J+1,3+NDATA-J) = VNIKX(5-J,IT)
  199. W(J+2,3+NDATA-J) = VNIKX(5-J,1)
  200. 180 CONTINUE
  201. BCOEF(N-1) = FBCR
  202. BCOEF(N) = Y(NDATA)
  203. C SOLVE SYSTEM OF EQUATIONS
  204. ILB = 2 - JW
  205. IUB = 2 - IW
  206. NWROW = 5
  207. IWP = IW + 1
  208. CALL BNFAC(W(IWP,1), NWROW, N, ILB, IUB, IFLAG)
  209. IF (IFLAG.EQ.2) GO TO 190
  210. CALL BNSLV(W(IWP,1), NWROW, N, ILB, IUB, BCOEF)
  211. RETURN
  212. C
  213. C
  214. 190 CONTINUE
  215. CALL XERMSG ('SLATEC', 'BINT4',
  216. + 'THE SYSTEM OF EQUATIONS IS SINGULAR', 2, 1)
  217. RETURN
  218. 200 CONTINUE
  219. CALL XERMSG ('SLATEC', 'BINT4', 'NDATA IS LESS THAN 2', 2, 1)
  220. RETURN
  221. 210 CONTINUE
  222. CALL XERMSG ('SLATEC', 'BINT4',
  223. + 'X VALUES ARE NOT DISTINCT OR NOT ORDERED', 2, 1)
  224. RETURN
  225. 220 CONTINUE
  226. CALL XERMSG ('SLATEC', 'BINT4', 'IBCL IS NOT 1 OR 2', 2, 1)
  227. RETURN
  228. 230 CONTINUE
  229. CALL XERMSG ('SLATEC', 'BINT4', 'IBCR IS NOT 1 OR 2', 2, 1)
  230. RETURN
  231. 240 CONTINUE
  232. CALL XERMSG ('SLATEC', 'BINT4', 'KNTOPT IS NOT 1, 2, OR 3', 2, 1)
  233. RETURN
  234. 250 CONTINUE
  235. CALL XERMSG ('SLATEC', 'BINT4',
  236. + 'KNOT INPUT THROUGH W ARRAY IS NOT ORDERED PROPERLY', 2, 1)
  237. RETURN
  238. END