aboutsummaryrefslogtreecommitdiff
path: root/math/bevington/chifit.f
blob: ff4b0669811f37d1abbbbceaaa86cdbc634a4c0f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
C SUBROUTINE CHIFIT.F
C
C SOURCE
C   BEVINGTON, PAGES 228-231.
C
C PURPOSE
C   MAKE A LEAST-SQUARES FIT TO A NON-LINEAR FUNCTION
C      WITH A PARABOLIC EXPANSION OF CHI SQUARE 
C
C USAGE 
C   CALL CHIFIT (X, Y, SIGMAY, NPTS, NTERMS, MODE, A, DELTAA,
C      SIGMAA, YFIT, CHISQR)
C
C DESCRIPTION OF PARAMETERS
C   X      - ARRAY OF DATA POINTS FOR INDEPENDENT VARIABLE
C   Y      - ARRAY OF DATA POINTS FOR DEPENDENT VARIABLE
C   SIGMAY - ARRAY OF STANDARD DEVIATIONS FOR Y DATA POINTS
C   NPTS   - NUMBER OF PAIRS OF DATA POINTS
C   NTERMS - NUMBER OF PARAMETERS
C   MODE   - DETERMINES METHOD OF WEIGHTING LEAST-SQUARES FIT
C            +1 (INSTRUMENTAL) WEIGHT(I) = 1./SIGMAY(I)**2
C             0 (NO WEIGHTING) WEIGHT(I) = 1.
C            -1 (STATISTICAL)  WEIGHT(I) = 1./Y(I)
C   A      - ARRAY OF PARAMETERS
C   DELTAA - ARRAY OF INCREMENTS FOR PARAMETERS A
C   SIGMAA - ARRAY OF STANDARD DEVIATIONS FOR PARAMETERS A
C   YFIT   - ARRAY OF CALCULATED VALUES OF Y
C   CHISQR - REDUCED CHI SQUARE FOR FIT 
C
C SUBROUTINES AND FUNCTION SUBPROGRAMS REQUIRED 
C   FUNCTN (X, I, A)
C      EVALUATES THE FITTING FUNCTION FOR THE ITH TERM
C   FCHISQ (Y, SIGMAY, NPTS, NFREE, MODE, YFIT) 
C      EVALUATES REDUCED CHI SQUARED FOR FIT TO DATA
C   MATINV (ARRAY, NTERMS, DET) 
C      INVERTS A SYMMETRIC TWO-DIMENSIONAL MATRIX OF DEGREE NTERMS
C      AND CALCULATES ITS DETERMINANT
C
C COMMENTS
C   DIMENSION STATEMENT VALID FOR NTERMS UP TO 10
C
      SUBROUTINE CHIFIT (X,Y,SIGMAY,NPTS,NTERMS,MODE,A,DELTAA,
     *SIGMAA,YFIT,CHISQR)
      DOUBLE PRECISION ALPHA
      DIMENSION X(1),Y(1),SIGMAY(1),A(1),DELTAA(1),SIGMAA(1), 
     *YFIT(1)
      DIMENSION ALPHA(10,10),BETA(10),DA(10)
      REAL FUNCTN
      EXTERNAL FUNCTN
C 
11    NFREE=NPTS-NTERMS
      FREE=NFREE
      IF (NFREE) 14,14,16
14    CHISQR=0.
      GOTO 120
16    DO 17 I=1,NPTS
17    YFIT(I)=FUNCTN (X,I,A)
      CHISQ1=FCHISQ (Y,SIGMAY,NPTS,NFREE,MODE,YFIT)
C 
C EVALUATE ALPHA AND BETA MATRICES
C 
20    DO 60 J=1,NTERMS
C 
C A(J) + DELTAA(J)
C 
21    AJ=A(J) 
      A(J)=AJ+DELTAA(J)
      DO 24 I=1,NPTS
24    YFIT(I)=FUNCTN (X,I,A)
      CHISQ2=FCHISQ (Y,SIGMAY,NPTS,NFREE,MODE,YFIT)
      ALPHA(J,J)=CHISQ2-2.*CHISQ1
      BETA(J)=-CHISQ2 
31    DO 50 K=1,NTERMS
      IF (K-J) 33,50,36
33    ALPHA(K,J)=(ALPHA(K,J)-CHISQ2)/2.
      ALPHA(J,K)=ALPHA(K,J)
      GOTO 50 
36    ALPHA(J,K)=CHISQ1-CHISQ2
C 
C A(J) + DELTAA(J) AND A(K) + DELTAA(K) 
C 
41    AK=A(K) 
      A(K)=AK+DELTAA(K)
      DO 44 I=1,NPTS
44    YFIT(I)=FUNCTN (X,I,A)
      CHISQ3=FCHISQ (Y,SIGMAY,NPTS,NFREE,MODE,YFIT)
      ALPHA(J,K)=ALPHA(J,K)+CHISQ3
      A(K)=AK 
50    CONTINUE
C 
C A(J) - DELTAA(J)
C 
51    A(J)=AJ-DELTAA(J)
      DO 53 I=1,NPTS
53    YFIT(I)=FUNCTN (X,I,A)
      CHISQ3=FCHISQ (Y,SIGMAY,NPTS,NFREE,MODE,YFIT)
      A(J)=AJ 
      ALPHA(J,J)=(ALPHA(J,J)+CHISQ3)/2.
      BETA(J)=(BETA(J)+CHISQ3)/4.
60    CONTINUE
C 
C ELIMINATE NEGATIVE CURVATURE
C 
61    DO 70 J=1,NTERMS
      IF (ALPHA(J,J)) 63,65,70
63    ALPHA(J,J)=-ALPHA(J,J)
      GOTO 66 
65    ALPHA(J,J)=0.01 
C Changed from DO 70
66    DO 700 K=1,NTERMS		
C Changed from 68, 70, 68
      IF (K-J) 68,700,68
68    ALPHA(J,K)=0.
      ALPHA(K,J)=0.
C New continuation statement
700   CONTINUE
70    CONTINUE
C 
C INVERT MATRIX AND EVALUATE PARAMETER INCREMENTS
C 
71    CALL MATINV (ALPHA,NTERMS,DET)
      DO 76 J=1,NTERMS
      DA(J)=0.
74    DO 75 K=1,NTERMS
75    DA(J)=DA(J)+BETA(K)*ALPHA(J,K)
76    DA(J)=0.2*DA(J)*DELTAA(J)
C 
C MAKE SURE CHI SQUARE DECREASES
C 
81    DO 82 J=1,NTERMS
82    A(J)=A(J)+DA(J) 
83    DO 84 I=1,NPTS
84    YFIT(I)=FUNCTN (X,I,A)
      CHISQ2=FCHISQ (Y,SIGMAY,NPTS,NFREE,MODE,YFIT)
      IF (CHISQ1-CHISQ2) 87,91,91
87    DO 89 J=1,NTERMS
      DA(J)=DA(J)/2.
89    A(J)=A(J)-DA(J) 
      GOTO 83 
C 
C INCREMENT PARAMETERS UNTIL CHI SQUARE STARTS TO INCREASE
C 
91    DO 92 J=1,NTERMS
92    A(J)=A(J)+DA(J) 
      DO 94 I=1,NPTS
94    YFIT(I)=FUNCTN (X,I,A)
      CHISQ3=FCHISQ (Y,SIGMAY,NPTS,NFREE,MODE,YFIT)
      IF (CHISQ3-CHISQ2) 97,101,101
97    CHISQ1=CHISQ2
      CHISQ2=CHISQ3
99    GOTO 91 
C 
C FIND MINIMUM OF PARABOLA DEFINED BY LAST THREE POINTS 
C 
101   DELTA=1./(1.+(CHISQ1-CHISQ2)/(CHISQ3-CHISQ2))+0.5
      DO 104 J=1,NTERMS
      A(J)=A(J)-DELTA*DA(J)
104   SIGMAA(J)=DELTAA(J)*SQRT(FREE*ALPHA(J,J))
      DO 106 I=1,NPTS 
106   YFIT(I)=FUNCTN (X,I,A)
      CHISQR=FCHISQ (Y,SIGMAY,NPTS,NFREE,MODE,YFIT)
111   IF (CHISQ2-CHISQR) 112,120,120
112   DO 113 J=1,NTERMS
113   A(J)=A(J)+(DELTA-1.)*DA(J)
      DO 115 I=1,NPTS 
115   YFIT(I)=FUNCTN (X,I,A)
      CHISQR=CHISQ2
120   RETURN
      END