Sei sulla pagina 1di 5

PROGRAM LINFIT

$CHAREQU
CHARACTER*1 TC,TCALGN(2)
CHARACTER PROGNM*18,MAINLN*54,CRKEY*12,CRLINE*72
REAL*8 X,Y,SX,SY,SXY,SXX,SYY,BY,BX,B1,B2,B,X2,Y2,XY,Q,XBAR,YBAR,VALUE
REAL*8 XERR,YERR,SERR,X1,XA,Y1,YA,XMIN,XMAX,XRANGE,XSTEP,R
REAL*4 POINTS(100,2),PLOTAR(201)
INTEGER*4 N,MENU,INDST3,INDEX3
INTEGER*2 ASC,SCAN,KBF1,KBF2,ERR,IASC,ISCAN,IKBF1,IKBF2,IERR
LOGICAL*4 DOCR
LOGICAL*2 ABORT,ESCAPE,INTRPT,RSH,LSH,CTRL,ALT,SCRL,NUML,CAPS,INS,INYET,FOOB
LOGICAL*1 LOGLOG
EQUIVALENCE (ASC,IASC),(SCAN,ISCAN),(KBF1,IKBF1),(KBF2,IKBF2),(ERR,IERR)
EQUIVALENCE (TCALGN(1),IASC),(TCALGN(2),TC)
COMMON /KEYGET/IASC,ISCAN,IKBF1,IKBF2,IERR,/NTRVN/ABORT,ESCAPE,INTRPT
COMMON /SHFSTA/RSH,LSH,CTRL,ALT,SCRL,NUML,CAPS,INS,/KTESTS/INYET,FOOB
COMMON /NAMEPR/PROGNM,MAINLN,/GNORF9/CRKEY,CRLINE,DOCR
SAVE /KEYGET/,/NTRVN/,/SHFSTA/,/KTESTS/,/NAMEPR/,/GNORF9/
SAVE
CALL OPESCR
DOCR = .TRUE.
CRKEY = 'cOPYrIGHT@@@'
CRLINE = 'COPYRIGHT 1987: Kevin G. Rhoads & High Voltage Research Lab @ MIT'
PROGNM = 'Least-Squares Fitting'
MAINLN = ' Linear fit: Y-Ymean = slope * (X-Xmean)'
CALL CRCLS
N = 0
SX = 0.0D0
SY = 0.0D0
SXY = 0.0D0
SYY = 0.0D0
SXX = 0.0D0
XERR = 0.0D0
YERR = 0.0D0
SERR = 0.0D0
XMIN = 1.0/0.0
XMAX = -1.0/0.0
9000 CONTINUE
PRINT *,' 1 = DO LINEAR FIT'
PRINT *,' 2 = exit '
PRINT *,' 3 = do LogLog fit'
IF (N.GT.1) THEN
PRINT *,' 4 = redisplay last'
I = MENU(1,0,4)
ELSE
I = MENU(1,0,3)
ENDIF
IF (I.EQ.2) STOP ' So Long ...'
IF (I.EQ.4) THEN
CALL CRCLS
CALL GOTOXY(0,15)
IF (LOGLOG) THEN
PRINT *,' Log-Log: ln(Y/Ymean) = slope * ln(X/Xmean) '
WRITE (*,'(A,G25.18,A,G25.18)') 'MEANS: X=',DEXP(XBAR),' Y=',DEXP(YBAR)
ELSE
PRINT *,' Linear fit: Y-Ymean = slope * (X-Xmean)'
WRITE (*,'(A,G25.18,A,G25.18)') 'MEANS: X=',XBAR,' Y=',YBAR
ENDIF
IF (XERR.LT.1.0E-10.AND.YERR.LT.1.0E-10.AND.SERR.LT.1.0E-10) THEN
WRITE (*,'(A,G25.18)')' Y fit to X, X independent, slope = ',BY
WRITE (*,'(A,G25.18)')' Y fit to X, Y independent, slope = ',BX
WRITE (*,'(A,G25.18)')' Y fit to X, * SYMMETRIC *, slope = ',B
ELSE
WRITE (*,'(A,G25.18,A,G25.18)')'Y fit, X ind. slope= ',BY,' ERROR',YERR
WRITE (*,'(A,G25.18,A,G25.18)')'Y fit, Y ind. slope= ',BX,' ERROR',XERR
WRITE (*,'(A,G25.18,A,G25.18)')'Y FIT SYMMETRIC, SLOPE= ',B,' ERROR',SERR
ENDIF
WRITE (*,'(A,G25.18)')' Correlation coefficient = ',R
CALL DOWAIT
GOTO 9000
ENDIF
LOGLOG = I.EQ.3
N = 0
SX = 0.0D0
SY = 0.0D0
SXY = 0.0D0
SYY = 0.0D0
SXX = 0.0D0
XERR = 0.0D0
YERR = 0.0D0
SERR = 0.0D0
XMIN = 1.0/0.0
XMAX = -1.0/0.0
9099 CONTINUE
CALL CRCLS
PRINT *,' '
IF (LOGLOG) THEN
PRINT *,' Log-Log: ln(Y/Ymean) = slope * ln(X/Xmean) '
MAINLN = ' Log-Log: ln(Y/Ymean) = slope * ln(X/Xmean) '
ELSE
PRINT *,' Linear fit: Y-Ymean = slope * (X-Xmean)'
MAINLN = ' Linear fit: Y-Ymean = slope * (X-Xmean)'
ENDIF
PRINT *,' '
9001 CALL GOTOXY(0,7)
PRINT *,'Enter Data pair number ',N+1
9002 PRINT *,' X = ?'
READ (*,'(BN,G34.0)',ERR=9002,END=9999) X
9003 PRINT *,' Y = ?'
READ (*,'(BN,G34.0)',ERR=9003,END=9999) Y
PRINT '(A,G34.18,3X,A,G34.18)',' X=',X,' Y=',Y
PRINT *,' OK? (1=OK, 2=re-enter, 3=plot, 4=end input, 5=remove prev.)'
I = MENU(1,0,5)
IF (I.EQ.2) GOTO 9001
IF (I.EQ.4) THEN
IF (N.LT.2) GOTO 9000
GOTO 8000
ENDIF
*
IF (LOGLOG) THEN
X = DLOG(X)
Y = DLOG(Y)
ENDIF
IF (I.EQ.5) THEN
N = N - 1
SX = SX - X
SY = SY - Y
SXX = SXX - X*X
SXY = SXY - X*Y
SYY = SYY - Y*Y
ELSE
N = N + 1
SX = SX + X
SY = SY + Y
SXX = SXX + X*X
SXY = SXY + X*Y
SYY = SYY + Y*Y
IF (N.LE.100) THEN
POINTS(N,1) = X
POINTS(N,2) = Y
ENDIF
IF (X.GT.XMAX) THEN
XMAX = X
ELSEIF (X.LT.XMIN) THEN
XMIN = X
ENDIF
ENDIF
*
XBAR = SX/N
YBAR = SY/N
X2 = SXX - SX*SX/N
XY = SXY - SX*SY/N
Y2 = SYY - SY*SY/N
R = XY / DSQRT(X2*Y2)
*
Q = X2 - Y2
Q = Q + SIGN(1.0D0,Q)*DSQRT(Q*Q + 4.0D0*XY*XY)
Q = Q * 0.5D0
*
B1 = XY/Q
B2 = -Q/XY
BY = XY/X2
BX = Y2/XY
CRUD = (BY-B1)**2 + (BX-B1)**2
GARB = (BY-B2)**2 + (BX-B2)**2
IF (CRUD.LT.GARB) THEN
B = B1
ELSE
B = B2
ENDIF
*
IF (N.GT.1) THEN
CALL XYGOTO(0,15)
IF (LOGLOG) THEN
PRINT *,' Log-Log: ln(Y/Ymean) = slope * ln(X/Xmean) '
WRITE (*,'(A,G25.18,A,G25.18)') 'MEANS: X=',DEXP(XBAR),' Y=',DEXP(YBAR)
ELSE
PRINT *,' Linear fit: Y-Ymean = slope * (X-Xmean)'
WRITE (*,'(A,G25.18,A,G25.18)') 'MEANS: X=',XBAR,' Y=',YBAR
ENDIF
WRITE (*,'(A,G25.18)')' Y fit to X, X independent, slope = ',BY
WRITE (*,'(A,G25.18)')' Y fit to X, Y independent, slope = ',BX
WRITE (*,'(A,G25.18)')' Y fit to X, * SYMMETRIC *, slope = ',B
WRITE (*,'(A,G25.18)')' Correlation coefficient = ',R
ENDIF
*
IF (I.EQ.1.OR.I.EQ.5) GOTO 9001
CALL GRCLS
XBAR = SX/N
YBAR = SY/N
XERR = 0.0D0
YERR = 0.0D0
SERR = 0.0D0
DO 8101 I = 1,N
X = POINTS(N,1) - XBAR
Y = POINTS(N,2) - YBAR
XERR = XERR + (X-Y/BX)**2
YERR = YERR + (Y-X*BY)**2
SERR = SERR + (Y-X*B)**2
8101 CONTINUE
XERR = SQRT(XERR)
YERR = SQRT(YERR)
SERR = SQRU(SERR/(1.0+B*B))
CALL B2THRD
CALL XYGOTO(0,0)
IF (LOGLOG) THEN
PRINT *,' Log-Log: ln(Y/Ymean) = slope * ln(X/Xmean) '
WRITE (*,'(A,G25.18,A,G25.18)') 'MEANS: X=',DEXP(XBAR),' Y=',DEXP(YBAR)
ELSE
PRINT *,' Linear fit: Y-Ymean = slope * (X-Xmean)'
WRITE (*,'(A,G25.18,A,G25.18)') 'MEANS: X=',XBAR,' Y=',YBAR
ENDIF
WRITE (*,'(A,G25.18,A,G25.18)')'Y fit, X ind. slope= ',BY,' ERROR',YERR
WRITE (*,'(A,G25.18,A,G25.18)')'Y fit, Y ind. slope= ',BX,' ERROR',XERR
WRITE (*,'(A,G25.18,A,G25.18)')'Y FIT SYMMETRIC, SLOPE= ',B,' ERROR',SERR
WRITE (*,'(A,G25.18)')' Correlation coefficient = ',R
CALL B2THRD
* PLOTTING GOES HERE
I = INDST3(N,2,2)
XRANGE = XMAX - XMIN
XSTEP = XRANGE/(N-1)
X = XMIN
IF (LOGLOG) THEN
DO 8102 I = 1,N
Y = YBAR + B * (X-XBAR)
PLOTAR(INDEX3(I,1,1)) = X
PLOTAR(INDEX3(I,1,2)) = Y
X = X + XSTEP
8102 CONTINUE
ELSE
DO 8103 I = 1,N
Y = YBAR + B * (X-XBAR)
PLOTAR(INDEX3(I,1,1)) = DEXP(X)
PLOTAR(INDEX3(I,1,2)) = DEXP(Y)
X = X + XSTEP
8103 CONTINUE
ENDIF
CALL DOWAIT
CALL FULLSC
* POST PROCESSING
8000 CONTINUE
XBAR = SX/N
YBAR = SY/N
XERR = 0.0D0
YERR = 0.0D0
SERR = 0.0D0
DO 8001 I = 1,N
X = POINTS(N,1) - XBAR
Y = POINTS(N,2) - YBAR
XERR = XERR + (X-Y/BX)**2
YERR = YERR + (Y-X*BY)**2
SERR = SERR + (Y-X*B)**2
8001 CONTINUE
XERR = SQRT(XERR)
YERR = SQRT(YERR)
SERR = SQRT(SERR/(1.0+B*B))
CALL CRCLS
CALL GOTOXY(0,0)
IF (LOGLOG) THEN
PRINT *,'Log-Log: ln(Y/Ymean) = slope * ln(X/Xmean) .'
CALL GOTOXY(0,3)
WRITE (*,'(A,G25.18,A,G25.18)') 'MEANS: X=',DEXP(XBAR),' Y=',DEXP(YBAR)
ELSE
PRINT *,' Linear fit: Y-Ymean = slope * (X-Xmean)'
CALL GOTOXY(0,3)
WRITE (*,'(A,G25.18,A,G25.18)') 'MEANS: X=',XBAR,' Y=',YBAR
ENDIF
WRITE (*,'(A,G25.18,A,G25.18)')'Y fit, X ind. slope= ',BY,' ERROR',YERR
WRITE (*,'(A,G25.18,A,G25.18)')'Y fit, Y ind. slope= ',BX,' ERROR',XERR
WRITE (*,'(A,G25.18,A,G25.18)')'Y FIT SYMMETRIC, SLOPE= ',B,' ERROR',SERR
WRITE (*,'(A,G25.18)')' Correlation coefficient = ',R
*
8002 CONTINUE
CALL GOTOXY(0,15)
PRINT *,' Action? 1=GET X predict Y'
PRINT *,' 2=get Y predict X'
PRINT *,' 3=exit'
PRINT *,' 4=continue fit'
PRINT *,' 5=new fit'
PRINT *,' 6=redisplay'
I = MENU(1,0,6)
CALL GOTOXY(0,15)
IF (I.EQ.3) STOP ' So Long ...'
IF (I.EQ.4) GOTO 9099
IF (I.EQ.5) GOTO 9000
IF (I.EQ.6) GOTO 8000
8003 PRINT *,' Value = ?'
READ (*,'(BN,G34.0)',ERR=8003,END=9999) VALUE
IF (LOGLOG) VALUE = DLOG(VALUE)
CALL XYGOTO(0,8)
IF (I.EQ.1) THEN
X = VALUE - XBAR
Y = YBAR + X * B
Y1 = YBAR + X * BY
YA = YBAR + X * BX
IF (LOGLOG) THEN
Y = DEXP(Y)
Y1 = DEXP(Y1)
YA = DEXP(YA)
ENDIF
WRITE (*,'(A,G25.18)')' Y fit to X, SYMMETRIC = ',Y
WRITE (*,'(A,G25.18)')' Y fit to X, X ind. = ',Y1
WRITE (*,'(A,G25.18)')' Y fit to X, Y ind. = ',YA
ELSEIF (I.EQ.2) THEN
Y = VALUE - YBAR
X = XBAR + Y / B
X1 = XBAR + Y / BY
XA = XBAR + Y / BX
IF (LOGLOG) THEN
X = DEXP(X)
X1 = DEXP(X1)
XA = DEXP(XA)
ENDIF
WRITE (*,'(A,G25.18)')' X fit to Y, SYMMETRIC = ',X
WRITE (*,'(A,G25.18)')' X fit to Y, X ind. = ',X1
WRITE (*,'(A,G25.18)')' X fit to Y, Y ind. = ',XA
ENDIF
GOTO 8002
*
9999 STOP ' UNRECOVERABLE ERROR IN KEYBOARD INPUT ROUTINES'
END

Potrebbero piacerti anche