PROGRAM GENERALFIT
IMPLICIT REAL*8 (A-H,O-Z)
C
C THIS PROGRAM IS FOR FITTING A SET OF DATE POINTS IN ONE VARIABLE,
C X, TO A POWER SERIES IN X, THEREBY FINDING THE DERIVATIVES WITH
C RESPECT TO X AT X = 0.
C
C IT USES THE ROMBERG SCHEME FOR PURGING HIGHER ORDER CONTAMINATION,
C AS IT WORKS THROUGH DERIVATIVES ORDER BY ORDER. THE ROMBERG SCHEME
C REQUIRES THAT THE DATA POINTS BE AT VALUES OF X THAT ARE IN THE
C RATIO OF 2, AS IN THE SET X = {0,3,6,12,...}. THE EVEN-TEMPERED
C ROMBERG SCHEME IN THIS PROGRAM REQUIRES ONLY THAT THE X VALUES
C HAVE A CONSISTENT RATIO FROM POINT TO POINT (I.E., RATIOS OTHER
C THAN 2 ARE ACCEPTABLE).
C
C THE PROGRAM DETERMINES THE RATIO OF X-VALUES BY TAKING AS
C INPUT DATA THE 2ND AND 3RD VALUES. THE FIRST X-VALUE IS 0.0.
C THE ASSOCIATED Y-VALUES MUST THEN BE ORDERED ACCORDING TO THE
C ORDER OF THE X-VALUES.
C
C A SPECIAL OPTION, CALLED "IEVEN", CAN BE USED TO HAVE THE FITTING
C DONE TO ELIMINATE ODD POWERS IN THE POWER SERIES EXPANSION. IN
C FACT, IT CAN BE USED FOR MORE SPECIALIZED FITS AS INDICATED BELOW.
C
C C. E. DYKSTRA - VERSION 1.1
C
DIMENSION E(40,40), X(40), P(40,40)
C
KLIMIT = 40
WRITE(6,800)
READ(5,*) KPTS, X(2), X(3), IEVEN
IF(KPTS. LE. KLIMIT) GO TO 10
WRITE(6,700) KPTS, KLIMIT
CALL EXIT
10 X(1) = 0.0D 0
C
C ANALYSIS CAN BE APPLIED TO EVEN POWER EXPANSIONS BY SIMPLY
C SQUARING THE COORDINATE VALUES
C
C IEVEN = 0 ALL POWERS OF X
C IEVEN = 1 POWERS OF X LIMITED TO 2, 4, 6, 8, ...
C IEVEN = 2 POWERS OF X LIMITED TO 4, 8, 12, ...
C
IF(IEVEN .NE. 0) X(2) = X(2) ** 2
IF(IEVEN .NE. 0) X(3) = X(3) ** 2
IF(IEVEN .EQ. 2) X(2) = X(2) ** 2
IF(IEVEN .EQ. 2) X(3) = X(3) ** 2
C = X(3) / X(2)
IF(C .LT. 1.0D 0) WRITE(6,710)
IF(KPTS .EQ. 3) GO TO 30
DO 20 K=4,KPTS
X(K) = X(K-1) * C
20 CONTINUE
30 REWIND 88
READ(88,*) (E(I,1),I=1,KPTS)
C
C FORM DIFFERENCES AS INITIAL DERIVATIVE VALUES
C
NORDER = KPTS
DO 50 N=2,NORDER
DO 40 I=N,KPTS
II = I - N + 1
E(I,N) = (E(I,N-1) - E(I-1,N-1)) / (X(I) - X(II))
40 CONTINUE
50 CONTINUE
C
C PURGE CONTAMINATION DUE TO HIGHER ORDER DERIVATIVES,
C DOING THIS DERIVATIVE BY DERIVATIVE
C
DO 90 N=2,NORDER
MAX = NORDER - N + 1
IF(MAX .LT. 2) GO TO 100
NDERIV = N - 1
NNNN = (IEVEN + 1) * NDERIV
WRITE(6,910) NNNN
N1 = N + 1
DO 60 I=N,KPTS
P(I,1) = E(I,N)
60 CONTINUE
WRITE(6,920)
WRITE(6,930) (I, P(I,1),I=N,KPTS)
KPTSN = KPTS
DO 80 ITER=2,MAX
ITPURGE = ITER + N - 2
KPTSN = KPTSN - 1
IF(KPTSN . LT. N1) GO TO 80
WRITE(6,940) ITPURGE
CQ = C**(ITER - 1)
CQ1 = CQ - 1.0D 0
DO 70 L=N1,KPTSN
P(L,ITER) = (CQ * P(L,ITER-1) - P(L+1,ITER-1)) / CQ1
70 CONTINUE
WRITE(6,930) (L,P(L,ITER),L=N1,KPTSN)
80 CONTINUE
90 CONTINUE
100 WRITE(6,950)
WRITE(6,960)
CALL EXIT
C
700 FORMAT(' >>> EXECUTION TERMINATED:',I6,' IS MORE THAN'
1 ' THE PROGRAM LIMIT OF'/
2 ' ',I6,' POINTS')
710 FORMAT(' >>> WARNING: RATIO OF VARIABLES IS LESS THAN 1'/)
800 FORMAT(' ENTER FORMAT-FREE (1) THE NUMBER OF DATA POINTS'/
1 ' (2) THE 2ND POINT-S VARIABLE VALUE'/
2 ' (3) THE 3RD POINT-S VARIABLE VALUE'/
3 ' (4) ZERO (NORMAL) OR ONE IF NO'/
4 ' ODD POWERS IN EXPANSION [N]'/)
910 FORMAT(/' RESULTS FOR DERIVATIVE'I5)
920 FORMAT(/' INITIAL VALUES BY POINTS')
930 FORMAT(I8,G16.8,I6,G16.8,I6,G16.8)
940 FORMAT(/' PURGING THROUGH'I5' VALUES BY POINTS:')
950 FORMAT(/' ... DERIVATIVE FITTING PROGRAM VERSION 1.1 '
1 ' BY C. E. DYKSTRA ... '/)
960 FORMAT(' VALUES GENERATED AFTER PURGING HIGHER ORDER'
3 ' CONTAMINATION ARE EXPANSION'/' COEFFICIENTS IN A SIMPLE'
4 ' POLYNOMIAL: F(X) = C0 + C1*X + C2*X*X + C3*X*X*X ...'
5 /' FACTORS OF 2, 6, 24, 120 AND SO ON SHOULD MULTIPLY'
6 ' THESE COEFFICIENTS'/' TO USE THEM AS '
7 ' DERIVATIVE VALUES IN A TAYLOR EXPANSION OF F(X).'/)
END