diff options
author | Joseph Hunkeler <jhunkeler@gmail.com> | 2015-07-08 20:46:52 -0400 |
---|---|---|
committer | Joseph Hunkeler <jhunkeler@gmail.com> | 2015-07-08 20:46:52 -0400 |
commit | fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 (patch) | |
tree | bdda434976bc09c864f2e4fa6f16ba1952b1e555 /math/bevington/gradls.f | |
download | iraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz |
Initial commit
Diffstat (limited to 'math/bevington/gradls.f')
-rw-r--r-- | math/bevington/gradls.f | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/math/bevington/gradls.f b/math/bevington/gradls.f new file mode 100644 index 00000000..f6b88d68 --- /dev/null +++ b/math/bevington/gradls.f @@ -0,0 +1,113 @@ +C SUBROUTINE GRADLS.F +C +C SOURCE +C BEVINGTON, PAGES 220-222. +C +C PURPOSE +C MAKE A GRADIENT-SEARCH LEAST-SQUARES FIT TO DATA WITH A +C SPECIFIED FUNCTION WHICH IS NOT LINEAR IN COEFFICIENTS +C +C USAGE +C CALL GRADLS (X, Y, SIGMAY, NPTS, NTERMS, MODE, A, DELTAA, +C 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 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 +C COMMENTS +C DIMENSION STATEMENT VALID FOR NTERMS UP TO 10 +C + SUBROUTINE GRADLS (X,Y,SIGMAY,NPTS,NTERMS,MODE,A,DELTAA, + *YFIT,CHISQR) + DIMENSION X(1),Y(1),SIGMAY(1),A(1),DELTAA(1),YFIT(1) + DIMENSION GRAD(10) + REAL FUNCTN + EXTERNAL FUNCTN + +C +C EVALUATE CHI SQUARE AT BEGINNING +C +11 NFREE=NPTS-NTERMS + IF (NFREE) 13,13,21 +13 CHISQR=0. + GOTO 110 +21 DO 22 I=1,NPTS +22 YFIT(I)=FUNCTN (X,I,A) + CHISQ1=FCHISQ (Y,SIGMAY,NPTS,NFREE,MODE,YFIT) +C +C EVALUATE GRADIENT OF CHI SQUARE +C +31 SUM=0. +32 DO 39 J=1,NTERMS + DELTA=0.1*DELTAA(J) + A(J)=A(J)+DELTA + DO 36 I=1,NPTS +36 YFIT(I)=FUNCTN (X,I,A) + A(J)=A(J)-DELTA + GRAD(J)=CHISQ1-FCHISQ (Y,SIGMAY,NPTS,NFREE,MODE,YFIT) +39 SUM=SUM+GRAD(J)**2 +41 DO 42 J=1,NTERMS +42 GRAD(J)=DELTAA(J)*GRAD(J)/SQRT(SUM) +C +C EVALUATE CHI SQUARE AT NEW POINT +C +51 DO 52 J=1,NTERMS +52 A(J)=A(J)+GRAD(J) +53 DO 54 I=1,NPTS +54 YFIT(I)=FUNCTN (X,I,A) + CHISQ2=FCHISQ (Y,SIGMAY,NPTS,NFREE,MODE,YFIT) +C +C MAKE SURE CHI SQUARE DECREASES +C +61 IF (CHISQ1-CHISQ2) 62,62,71 +62 DO 64 J=1,NTERMS + A(J)=A(J)-GRAD(J) +64 GRAD(J)=GRAD(J)/2. + GOTO 51 +C +C INCREMENT PARAMETERS UNTIL CHI SQUARE STARTS TO INCREASE +C +71 DO 72 J=1,NTERMS +72 A(J)=A(J)+GRAD(J) + DO 74 I=1,NPTS +74 YFIT(I)=FUNCTN (X,I,A) +75 CHISQ3=FCHISQ (Y,SIGMAY,NPTS,NFREE,MODE,YFIT) +76 IF (CHISQ3-CHISQ2) 81,91,91 +81 CHISQ1=CHISQ2 +82 CHISQ2=CHISQ3 + GOTO 71 +C +C FIND MINIMUM OF PARABOLA DEFINED BY LAST THREE POINTS +C +91 DELTA=1./(1.+(CHISQ1-CHISQ2)/(CHISQ3-CHISQ2))+0.5 + DO 93 J=1,NTERMS +93 A(J)=A(J)-DELTA*GRAD(J) + DO 95 I=1,NPTS +95 YFIT(I)=FUNCTN (X,I,A) + CHISQR=FCHISQ (Y,SIGMAY,NPTS,NFREE,MODE,YFIT) +101 IF (CHISQ2-CHISQR) 102,110,110 +102 DO 103 J=1,NTERMS +103 A(J)=A(J)+(DELTA-1.)*GRAD(J) +104 DO 105 I=1,NPTS +105 YFIT(I)=FUNCTN (X,I,A) +106 CHISQR=CHISQ2 +110 RETURN + END |