polyvl.f 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. *DECK POLYVL
  2. SUBROUTINE POLYVL (NDER, XX, YFIT, YP, N, X, C, WORK, IERR)
  3. C***BEGIN PROLOGUE POLYVL
  4. C***PURPOSE Calculate the value of a polynomial and its first NDER
  5. C derivatives where the polynomial was produced by a previous
  6. C call to POLINT.
  7. C***LIBRARY SLATEC
  8. C***CATEGORY E3
  9. C***TYPE SINGLE PRECISION (POLYVL-S, DPOLVL-D)
  10. C***KEYWORDS POLYNOMIAL EVALUATION
  11. C***AUTHOR Huddleston, R. E., (SNLL)
  12. C***DESCRIPTION
  13. C
  14. C Written by Robert E. Huddleston, Sandia Laboratories, Livermore
  15. C
  16. C Abstract -
  17. C Subroutine POLYVL calculates the value of the polynomial and
  18. C its first NDER derivatives where the polynomial was produced by
  19. C a previous call to POLINT.
  20. C The variable N and the arrays X and C must not be altered
  21. C between the call to POLINT and the call to POLYVL.
  22. C
  23. C ****** Dimensioning Information *******
  24. C
  25. C YP must be dimensioned by at least NDER
  26. C X must be dimensioned by at least N (see the abstract )
  27. C C must be dimensioned by at least N (see the abstract )
  28. C WORK must be dimensioned by at least 2*N if NDER is .GT. 0.
  29. C
  30. C *** Note ***
  31. C If NDER=0, neither YP nor WORK need to be dimensioned variables.
  32. C If NDER=1, YP does not need to be a dimensioned variable.
  33. C
  34. C
  35. C ***** Input parameters
  36. C
  37. C NDER - the number of derivatives to be evaluated
  38. C
  39. C XX - the argument at which the polynomial and its derivatives
  40. C are to be evaluated.
  41. C
  42. C N - *****
  43. C * N, X, and C must not be altered between the call
  44. C X - * to POLINT and the call to POLYVL.
  45. C C - *****
  46. C
  47. C
  48. C ***** Output Parameters
  49. C
  50. C YFIT - the value of the polynomial at XX
  51. C
  52. C YP - the derivatives of the polynomial at XX. The derivative of
  53. C order J at XX is stored in YP(J) , J = 1,...,NDER.
  54. C
  55. C IERR - Output error flag with the following possible values.
  56. C = 1 indicates normal execution
  57. C
  58. C ***** Storage Parameters
  59. C
  60. C WORK = this is an array to provide internal working storage for
  61. C POLYVL. It must be dimensioned by at least 2*N if NDER is
  62. C .GT. 0. If NDER=0, WORK does not need to be a dimensioned
  63. C variable.
  64. C
  65. C***REFERENCES L. F. Shampine, S. M. Davenport and R. E. Huddleston,
  66. C Curve fitting by polynomials in one variable, Report
  67. C SLA-74-0270, Sandia Laboratories, June 1974.
  68. C***ROUTINES CALLED (NONE)
  69. C***REVISION HISTORY (YYMMDD)
  70. C 740601 DATE WRITTEN
  71. C 890531 Changed all specific intrinsics to generic. (WRB)
  72. C 890531 REVISION DATE from Version 3.2
  73. C 891214 Prologue converted to Version 4.0 format. (BAB)
  74. C 920501 Reformatted the REFERENCES section. (WRB)
  75. C***END PROLOGUE POLYVL
  76. DIMENSION YP(*),X(*),C(*),WORK(*)
  77. C***FIRST EXECUTABLE STATEMENT POLYVL
  78. IERR=1
  79. IF (NDER.GT.0) GO TO 10020
  80. C
  81. C ***** CODING FOR THE CASE NDER = 0
  82. C
  83. PIONE=1.0
  84. PONE=C(1)
  85. YFIT=PONE
  86. IF (N.EQ.1) RETURN
  87. DO 10010 K=2,N
  88. PITWO=(XX-X(K-1))*PIONE
  89. PIONE=PITWO
  90. PTWO=PONE+PITWO*C(K)
  91. PONE=PTWO
  92. 10010 CONTINUE
  93. YFIT=PTWO
  94. RETURN
  95. C
  96. C ***** END OF NDER = 0 CASE
  97. C
  98. 10020 CONTINUE
  99. IF (N.GT.1) GO TO 10040
  100. YFIT=C(1)
  101. C
  102. C ***** CODING FOR THE CASE N=1 AND NDER .GT. 0
  103. C
  104. DO 10030 K=1,NDER
  105. YP(K)=0.0
  106. 10030 CONTINUE
  107. RETURN
  108. C
  109. C ***** END OF THE CASE N = 1 AND NDER .GT. 0
  110. C
  111. 10040 CONTINUE
  112. IF (NDER.LT.N) GO TO 10050
  113. C
  114. C ***** SET FLAGS FOR NUMBER OF DERIVATIVES AND FOR DERIVATIVES
  115. C IN EXCESS OF THE DEGREE (N-1) OF THE POLYNOMIAL.
  116. C
  117. IZERO=1
  118. NDR=N-1
  119. GO TO 10060
  120. 10050 CONTINUE
  121. IZERO=0
  122. NDR=NDER
  123. 10060 CONTINUE
  124. M=NDR+1
  125. MM=M
  126. C
  127. C ***** START OF THE CASE NDER .GT. 0 AND N .GT. 1
  128. C ***** THE POLYNOMIAL AND ITS DERIVATIVES WILL BE EVALUATED AT XX
  129. C
  130. DO 10070 K=1,NDR
  131. YP(K)=C(K+1)
  132. 10070 CONTINUE
  133. C
  134. C ***** THE FOLLOWING SECTION OF CODE IS EASIER TO READ IF ONE
  135. C BREAKS WORK INTO TWO ARRAYS W AND V. THE CODE WOULD THEN
  136. C READ
  137. C W(1) = 1.
  138. C PONE = C(1)
  139. C *DO K = 2,N
  140. C * V(K-1) = XX - X(K-1)
  141. C * W(K) = V(K-1)*W(K-1)
  142. C * PTWO = PONE + W(K)*C(K)
  143. C * PONE = PWO
  144. C
  145. C YFIT = PTWO
  146. C
  147. WORK(1)=1.0
  148. PONE=C(1)
  149. DO 10080 K=2,N
  150. KM1=K-1
  151. NPKM1=N+K-1
  152. WORK(NPKM1)=XX-X(KM1)
  153. WORK(K)=WORK(NPKM1)*WORK(KM1)
  154. PTWO=PONE+WORK(K)*C(K)
  155. PONE=PTWO
  156. 10080 CONTINUE
  157. YFIT=PTWO
  158. C
  159. C ** AT THIS POINT THE POLYNOMIAL HAS BEEN EVALUATED AND INFORMATION
  160. C FOR THE DERIVATIVE EVALUATIONS HAVE BEEN STORED IN THE ARRAY
  161. C WORK
  162. IF (N.EQ.2) GO TO 10110
  163. IF (M.EQ.N) MM=NDR
  164. C
  165. C ***** EVALUATE THE DERIVATIVES AT XX
  166. C
  167. C ****** DO K=2,MM (FOR MOST CASES, MM = NDER + 1)
  168. C * ****** DO I=2,N-K+1
  169. C * * W(I) = V(K-2+I)*W(I-1) + W(I)
  170. C * * YP(K-1) = YP(K-1) + W(I)*C(K-1+I)
  171. C ****** CONTINUE
  172. C
  173. DO 10090 K=2,MM
  174. NMKP1=N-K+1
  175. KM1=K-1
  176. KM2PN=K-2+N
  177. DO 10090 I=2,NMKP1
  178. KM2PNI=KM2PN+I
  179. IM1=I-1
  180. KM1PI=KM1+I
  181. WORK(I)=WORK(KM2PNI)*WORK(IM1)+WORK(I)
  182. YP(KM1)=YP(KM1)+WORK(I)*C(KM1PI)
  183. 10090 CONTINUE
  184. IF (NDR.EQ.1) GO TO 10110
  185. FAC=1.0
  186. DO 10100 K=2,NDR
  187. XK=K
  188. FAC=XK*FAC
  189. YP(K)=FAC*YP(K)
  190. 10100 CONTINUE
  191. C
  192. C ***** END OF DERIVATIVE EVALUATIONS
  193. C
  194. 10110 CONTINUE
  195. IF (IZERO.EQ.0) RETURN
  196. C
  197. C ***** SET EXCESS DERIVATIVES TO ZERO.
  198. C
  199. DO 10120 K=N,NDER
  200. YP(K)=0.0
  201. 10120 CONTINUE
  202. RETURN
  203. END