7900  REM HP CONTRIBUTED LIBRARY, REV. B, 2/75
8000  Q=0
8001  READ N
8002  FOR I=1 TO N
8003  READ M,X
8004  FOR J=1 TO M
8005  READ Y
8006  Q=Q+1
8007  X[Q]=X
8008  Y[Q]=Y
8009  NEXT J
8010  NEXT I
8011  N=Q
8012  GOTO 9022
9000  REM  *****  CURFIT  *****  MATHEMATICS PROGRAM  *****
9001  REM   *****  VERSION 2   *****   10/24/72   **********
9002  REM  LEAST  SQUARES  CURVE  FIT  #2
9003  DIM X[200],Y[200],U[200],V[200],A[7],B[7],C[7],S[6],F[7]
9004  DIM T[7,3]
9005  READ N
9006  PRINT 
9007  FOR I=1 TO N
9008  READ X[I],Y[I]
9020  NEXT I
9021  PRINT 
9022  MAT F=CON
9023  PRINT " ","LEAST SQUARES CURVES FIT"
9024  PRINT 
9025  PRINT "CURVE TYPE","  INDEX  OF","   A","   B"
9026  PRINT " ","DETERMINATION"
9027  PRINT 
9028  FOR I=1 TO 7
9029  MAT S=ZER
9030  GOSUB 9146
9031  IF (I-5)*(I-6)=0 THEN 9047
9032  IF (I-2)*(I-3)=0 THEN 9040
9033  FOR J=1 TO N
9034  LET V[J]=Y[J]
9035  GOSUB 9123
9036  NEXT J
9037  IF I=1 THEN 9057
9038  IF I=7 THEN 9062
9039  GOTO 9068
9040  FOR J=1 TO N
9041  IF Y[J] <= 0 THEN 9054
9042  LET V[J]=LOG(Y[J])
9043  GOSUB 9123
9044  NEXT J
9045  IF I=3 THEN 9062
9046  GOTO 9057
9047  FOR J=1 TO N
9048  IF Y[J]=0 THEN 9054
9049  LET V[J]=1/Y[J]
9050  GOSUB 9123
9051  NEXT J
9052  IF I=6 THEN 9068
9053  GOTO 9057
9054  PRINT "CAN'T FIT"
9055  LET F[I]=0
9056  GOTO 9075
9057  FOR J=1 TO N
9058  LET U[J]=X[J]
9059  GOSUB 9126
9060  NEXT J
9061  GOTO 9073
9062  FOR J=1 TO N
9063  IF X[J] <= 0 THEN 9054
9064  LET U[J]=LOG(X[J])
9065  GOSUB 9126
9066  NEXT J
9067  GOTO 9073
9068  FOR J=1 TO N
9069  IF X[J]=0 THEN 9054
9070  LET U[J]=1/X[J]
9071  GOSUB 9126
9072  NEXT J
9073  GOSUB 9193
9074  PRINT C[I],A[I],B[I]
9075  NEXT I
9076  PRINT 
9077  PRINT 
9078  PRINT " ","STANDARD ERROR ESTIMATES",LIN(2)
9079  PRINT "CURVE TYPE","REGRESSION","INTERCEPT(A)","SLOPE(B)",LIN(2)
9080  FOR I=1 TO 7
9081  GOSUB 9146
9082  IF F[I]=1 THEN 9085
9083  PRINT "COULD NOT BE FIT"
9084  GOTO 9086
9085  PRINT T[I,1],T[I,2],T[I,3]
9086  NEXT I
9087  PRINT 
9088  PRINT 
9089  PRINT 
9090  PRINT "DETAILS FOR CURVE TYPE";
9091  INPUT I
9092  IF I=0 THEN 9225
9093  GOSUB 9131
9094  IF F[I]=1 THEN 9098
9095  GOSUB 9146
9096  PRINT " COULD NOT BE FIT."
9097  GOTO 9087
9098  GOSUB 9167
9099  IF (I-1)*(I-5)*(I-6)#0 THEN 9109
9100  FOR J=1 TO N
9101  LET Y=A[I]+B[I]*X[J]
9102  IF I=1 THEN 9106
9103  LET Y=1/Y
9104  IF I=5 THEN 9106
9105  LET Y=X[J]*Y
9106  GOSUB 9215
9107  NEXT J
9108  GOTO 9087
9109  FOR J=1 TO N
9110  IF I=2 THEN 9119
9111  IF I=3 THEN 9117
9112  IF I=4 THEN 9115
9113  LET Y=A[7]+B[7]*LOG(X[J])
9114  GOTO 9120
9115  LET Y=A[4]+B[4]/X[J]
9116  GOTO 9120
9117  LET Y=A[3]*(X[J]^B[3])
9118  GOTO 9120
9119  LET Y=A[2]*EXP(B[2]*X[J])
9120  GOSUB 9215
9121  NEXT J
9122  GOTO 9087
9123  LET S[5]=S[5]+V[J]^2
9124  LET S[3]=S[3]+V[J]
9125  RETURN 
9126  LET S[1]=S[1]+U[J]
9127  LET S[2]=S[2]+U[J]^2
9128  IF I>1 THEN 9129
9129  LET S[4]=S[4]+U[J]*V[J]
9130  RETURN 
9131  FOR K=1 TO N-1
9132  LET M=K
9133  FOR J=K+1 TO N
9134  IF X[M] <= X[J] THEN 9136
9135  LET M=J
9136  NEXT J
9137  IF M=K THEN 9144
9138  LET P=X[M]
9139  LET Q=Y[M]
9140  LET X[M]=X[K]
9141  LET Y[M]=Y[K]
9142  LET Y[K]=Q
9143  LET X[K]=P
9144  NEXT K
9145  RETURN 
9146  LET K=I
9147  IF K=1 THEN 9165
9148  IF K=2 THEN 9163
9149  IF K=3 THEN 9161
9150  IF K=4 THEN 9159
9151  IF K=5 THEN 9157
9152  IF K=6 THEN 9155
9153  PRINT "7. Y=A+B*LOG(X)";
9154  RETURN 
9155  PRINT "6. Y=X/(A+B*X) ";
9156  RETURN 
9157  PRINT "5. Y=1/(A+B*X) ";
9158  RETURN 
9159  PRINT "4. Y=A+(B/X)",
9160  RETURN 
9161  PRINT "3. Y=A*(X^B)",
9162  RETURN 
9163  PRINT "2. Y=A*EXP(B*X)";
9164  RETURN 
9165  PRINT "1. Y=A+(B*X)",
9166  RETURN 
9167  PRINT "   ";
9168  GOSUB 9146
9169  PRINT " IS A";
9170  IF K=1 THEN 9176
9171  IF K=2 THEN 9178
9172  IF K=3 THEN 9180
9173  IF K=7 THEN 9182
9174  PRINT " HYPERBOLIC";
9175  GOTO 9183
9176  PRINT " LINEAR";
9177  GOTO 9183
9178  PRINT "N EXPONENTIAL";
9179  GOTO 9183
9180  PRINT " POWER";
9181  GOTO 9183
9182  PRINT " LOGARITHMIC";
9183  PRINT " FUNCTION.  THE RESULTS"
9184  IF K=1 THEN 9186
9185  PRINT "      OF A LEAST-SQUARES FIT OF ITS LINEAR TRANSFORM"
9186  PRINT "      (SORTED IN ORDER OF ASCENDING VALUES OF X)"
9187  PRINT "      ARE AS FOLLOWS:"
9188  PRINT 
9189  PRINT "X-ACTUAL","Y-ACTUAL"," Y-CALC"," PCT DIFFER"
9190  PRINT 
9191  RETURN 
9192  PRINT 
9193  LET B=(N*S[4]-S[1]*S[3])/(N*S[2]-(S[1]^2))
9194  LET A=(S[3]-B*S[1])/N
9195  LET S1=S[5]-(S[3]^2)/N
9196  LET S2=(B^2)*(S[2]-(S[1]^2)/N)
9197  LET C[I]=S2/S1
9198  T[I,1]=SQR((S1-S2)/(N-2))
9199  T[I,2]=T[I,1]*SQR(S[2]/(N*(S[2]-(S[1]^2/N))))
9200  T[I,3]=T[I,1]/SQR(S[2]-(S[1]^2/N))
9201  IF (I-1)*(I-4)*(I-5)*(I-7)=0 THEN 9212
9202  IF (I-2)*(I-3)=0 THEN 9209
9203  LET A[6]=B
9204  LET B[6]=A
9205  Z=T[6,2]
9206  T[6,2]=T[6,3]
9207  T[6,3]=Z
9208  RETURN 
9209  LET A[I]=EXP(A)
9210  T[I,2]=EXP(T[I,2])
9211  GOTO 9213
9212  LET A[I]=A
9213  LET B[I]=B
9214  RETURN 
9215  PRINT X[J],Y[J],Y,
9216  LET D=Y[J]-Y
9217  LET D=.1*SGN(D)*INT(1000*ABS(D/Y))
9218  IF D<0 THEN 9223
9219  IF D>0 THEN 9222
9220  PRINT "      0"
9221  RETURN 
9222  PRINT "       ";
9223  PRINT D
9224  RETURN 
9225  STOP 
9900  DATA 4
9901  DATA 3,60,110,135,120
9902  DATA 4,62,120,140,130,135
9903  DATA 2,64,150,145
9904  DATA 3,70,170,185,160
9999  END 
