FTN,L,B C C HP92405A CURVE FITTING PACKAGE C C SOURCE TAPE 92405-80001 REV. A C RELOC. TAPE 92405-60001 REV. A C C AUTHOR - T.A. SAPONAS C C VERSION 3 OCTOBER 1973 C C SUBROUTINE CRVFT(ITYPE,X,Y,N,A,B,ERRMX) C "CRVFT" PERFORMS A LEAST SQUARE ERROR CURVE FIT ON THE C FUNCTION ARGUMENTS IN ARRAY "X" AND THE CORRESPONDING C FUNCTION VALUES IN ARRAY "Y". "ITYPE" DETERMINES THE CURVE C TO BE FIT, AND "ERRMX" IS THE MAXIMUM ERROR OF THE DATA C FROM THE FITTED CURVE. C IF "ITYPE" OR "N" HAVE ILLEGAL VALUES ERRMX = -2.0 . C IF THE DATA WON'T FIT THE SELECTED CURVE ERRMX = -1.0 . C "A" AND "B" ARE THE COEFFICIENTS FOR THE EQUATION SELECTED C BY "ITYPE". SUBROUTINE "XYTTL" PERFORMS A RUNNING SUM, C SUM OF SQUARES AND SUM OF CROSS PRODUDCT. C DIMENSION X(1),Y(1),SUM(5) C C IF ITYPE < 1 OR ITYPE > 6 OR N < 1 SET ERRMX = -2.0 IF(N)901,901,1 1 IF(ITYPE)901,901,2 2 IF(ITYPE-7)3,901 C C INITIALIZE ACCUMULATORS 3 DO 4 I = 1,5 4 SUM(I) = 0. BSIGN = 1. C C BRANCH TO SELECTED EQUATION CURVE FIT GO TO (100,200,300,400,500,600),ITYPE C C CURVE FIT FOR Y = A*X + B 100 DO 101 I = 1,N 101 CALL XYTTL(SUM,X(I),Y(I)) GO TO 800 C C CURVE FIT FOR Y = A/X + B 200 DO 201 I = 1,N IF(X(I))201,900,201 201 CALL XYTTL(SUM,1./X(I),Y(I)) GO TO 800 C C CURVE FIT FOR Y = 1/( A*X + B ) 300 DO 301 I = 1,N IF(Y(I))301,900,301 301 CALL XYTTL(SUM,X(I),1./Y(I)) GO TO 800 C C CURVE FIT FOR Y = X/( A + B*X ) 400 DO 401 I = 1,N IF(X(I))402,900,402 402 IF(Y(I))401,900,401 401 CALL XYTTL(SUM,1./X(I),1./Y(I)) GO TO 800 C C CURVE FIT FOR Y = B*EXP( A*X ) 500 BSIGN = SIGN(1.,Y) DO 501 I = 1,N A = Y(I)*BSIGN IF(A)900,900,501 501 CALL XYTTL(SUM,X(I),ALOG(A)) GO TO 800 C C CURVE FIT FOR Y = B*X**A 600 BSIGN = SIGN(1.,Y) DO 601 I = 1,N A = BSIGN*Y(I) IF(X(I))900,900,602 602 IF(A)900,900,601 601 CALL XYTTL(SUM,ALOG(X(I)),ALOG(A)) 800 RN = N C C COMPUTE A AND B COEFFICIENTS FROM SUMS, SUM OF SQUARES AND C SUM OF CROSS PRODUCT A = (RN*SUM(4)-SUM*SUM(3))/(RN*SUM(2)-SUM*SUM) B = (SUM(3)-A*SUM)/RN IF(ITYPE-5)801,802 802 B = EXP(B) 801 ERRMX = 0. B = BSIGN*B C C COMPUTE MAXIMUM ERROR AND STANDARD ERROR OF CURVE FIT C BY EVALUATING CURVE AT EVERY POINT AND COMPARING TO DATA DO 805 I = 1,N C C BRANCH TO CORRESPONDING FUNCTION EVALUATION GO TO (810,820,830,840,850,860),ITYPE 810 F = A*X(I)+B GO TO 803 820 F = A/X(I)+B GO TO 803 830 F = 1./(A*X(I)+B) GO TO 803 840 F = X(I)/(A+B*X(I)) GO TO 803 850 F = B*EXP(A*X(I)) GO TO 803 860 F = B*X(I)**A C C COMPUTE MAGNITUDE OF ERROR 803 F = ABS(F-Y(I)) C C IF ERROR IS LARGER THAN PREVIOUS MAXIMUM, MAKE IT NEW MAXIMUM IF(ERRMX-F)804,805 804 ERRMX = F 805 CONTINUE RETURN C C ERROR RETURN WHEN DATA WILL NOT FIT CURVE ( EITHER A DIVIDE C BY ZERO OR BOTH POSITIVE AND NEGATIVE Y VALUES IN CURVES C 5 OR 6 ). 900 ERRMX = -1. RETURN C C ERROR RETURN FOR BAD N OR ITYPE 901 ERRMX = -2. RETURN END SUBROUTINE XYTTL(SUM,X,Y) C C "XYTTL" COMPUTES RUNNING SUM, SUM OF SQUARES AND SUM OF C CROSS PRODUCT OF "X" AND "Y" DIMENSION SUM(5) SUM = SUM+X SUM(2) = SUM(2)+X*X SUM(3) = SUM(3)+Y SUM(4) = SUM(4)+X*Y SUM(5) = SUM(5)+Y*Y RETURN END END$