8990  REM  ****  HP BASIC PROGRAM LIBRARY  **************************
8991  REM
8992  REM        POLFTE:  FITS LEAST-SQUARES POLYNOMIALS
8993  REM
8994  REM        36246  REV A  --  2/73
8995  REM
8996  REM  ****  CONTRIBUTED PROGRAM  *******************************
9000  REM  ****  POLFTE (ORIGINALLY NAMED POLFIT)**MATHEMATICS PROGRAM
9001  REM  ****  VERSION 1 ****  7/31/69 *****
9002  REM  LEAST SQUARES POLYNOMIAL CURVE FIT
9003  READ M,N
9004  DIM A[15],B[15],S[15],G[15],U[15]
9005  DIM Q[35],P[35],X[35],Y[35],C[35]
9006  LET Z=0
9007  LET O=1
9008  LET K=12
9009  LET N=N+1
9010  IF N>12 THEN 9158
9011  IF M<N THEN 9160
9012  IF M>100 THEN 9155
9013  LET T7=Z
9014  LET T8=Z
9015  LET W7=Z
9016  FOR I=1 TO M
9017  READ X[I],Y[I]
9018  LET W7=W7+X[I]
9019  LET T7=T7+Y[I]
9020  LET T8=T8+Y[I]^2
9021  NEXT I
9022  LET T9=(M*T8-T7^2)/(M^2-M)
9023  PRINT 
9024  PRINT "L E A S T - S Q U A R E S  P O L Y N O M I A L S"
9025  PRINT 
9026  PRINT "     NUMBER OF POINTS =";M
9027  PRINT "      MEAN VALUE OF X =";W7/M
9028  PRINT "      MEAN VALUE OF Y =";T7/M
9029  PRINT "       STD ERROR OF Y =";SQR(T9)
9030  PRINT 
9031  PRINT "  NOTE:  CODE FOR 'WHAT NEXT?' IS:"
9032  PRINT 
9033  PRINT "     0 = STOP PROGRAM"
9034  PRINT "     1 = COEFFICIENTS ONLY"
9035  PRINT "     2 = ENTIRE SUMMARY"
9036  PRINT "     3 = FIT NEXT HIGHER DEGREE"
9037  PRINT 
9038  PRINT 
9039  FOR I=1 TO M
9040  LET P[I]=Z
9041  LET Q[I]=O
9042  NEXT I
9043  FOR I=1 TO 11
9044  LET A[I]=Z
9045  LET B[I]=Z
9046  LET S[I]=Z
9047  NEXT I
9048  LET E1=Z
9049  LET F1=Z
9050  LET W1=M
9051  LET N4=K
9052  LET I=1
9053  LET K1=2
9054  IF N=0 THEN 9056
9055  LET K1=N4
9056  LET W=Z
9057  FOR L=1 TO M
9058  LET W=W+Y[L]*Q[L]
9059  NEXT L
9060  LET S[I]=W/W1
9061  IF I-N4 >= 0 THEN 9081
9062  IF I-M >= 0 THEN 9081
9063  LET E1=Z
9064  FOR L=1 TO M
9065  LET E1=E1+X[L]*Q[L]*Q[L]
9066  NEXT L
9067  LET E1=E1/W1
9068  LET A[I+1]=E1
9069  LET W=Z
9070  FOR L=1 TO M
9071  LET V=(X[L]-E1)*Q[L]-F1*P[L]
9072  LET P[L]=Q[L]
9073  LET Q[L]=V
9074  LET W=W+V*V
9075  NEXT L
9076  LET F1=W/W1
9077  LET B[I+2]=F1
9078  LET W1=W
9079  LET I=I+1
9080  GOTO 9056
9081  FOR L=2 TO 11
9082  LET G[L]=Z
9083  NEXT L
9084  LET G[1]=O
9085  FOR J=1 TO N
9086  LET S1=Z
9087  FOR L=1 TO N
9088  IF L=1 THEN 9093
9089  IF L=2 THEN 9092
9090  LET G[L]=G[L]-A[L]*G[L-1]-B[L]*G[L-2]
9091  GOTO 9093
9092  LET G[2]=G[2]-A[2]*G[1]
9093  LET S1=S1+S[L]*G[L]
9094  NEXT L
9095  LET U[J]=S1
9096  LET L=N
9097  FOR I2=2 TO N
9098  LET G[L]=G[L-1]
9099  LET L=L-1
9100  NEXT I2
9101  LET G[1]=Z
9102  NEXT J
9103  PRINT 
9104  LET T=Z
9105  FOR L=1 TO M
9106  LET C[L]=Z
9107  LET J=N
9108  FOR I2=1 TO N
9109  LET C[L]=C[L]*X[L]+U[J]
9110  LET J=J-1
9111  NEXT I2
9112  LET T3=Y[L]-C[L]
9113  LET T=T+T3^2
9114  NEXT L
9115  IF M#N THEN 9118
9116  LET T5=0
9117  GOTO 9119
9118  LET T5=T/(M-N)
9119  LET Q7=1-T/(T9*(M-1))
9120  PRINT 
9121  PRINT "POLYFIT OF DEGREE";N-1;
9122  PRINT "INDEX OF DETERM =";Q7;
9123  GOSUB 9163
9124  PRINT 
9125  PRINT 
9126  IF R=0 THEN 9166
9127  IF R=3 THEN 9152
9128  PRINT "TERM","COEFFICIENT"
9129  PRINT 
9130  FOR J=1 TO N
9131  LET I2=J-1
9132  PRINT I2,U[J]
9133  NEXT J
9134  IF R=1 THEN 9149
9135  PRINT 
9136  PRINT "X-ACTUAL","Y-ACTUAL","Y-CALC","DIFF","PCT-DIFF"
9137  PRINT 
9138  FOR L=1 TO M
9139  LET Q8=Y[L]-C[L]
9140  PRINT X[L],Y[L],C[L],Q8,
9141  IF C[L]=0 THEN 9144
9142  PRINT 100*Q8/C[L]
9143  GOTO 9145
9144  PRINT "INFINITE"
9145  NEXT L
9146  PRINT 
9147  PRINT "          STD ERROR OF ESTIMATE FOR Y =";SQR(T5)
9148  IF K=N THEN 9166
9149  PRINT 
9150  GOSUB 9163
9151  GOTO 9126
9152  LET N=N+1
9153  IF M<N THEN 9160
9154  GOTO 9081
9155  PRINT 
9156  PRINT "PROGRAM SIZE LIMIT IS 100 DATA POINTS."
9157  GOTO 9166
9158  PRINT "ELEVENTH DEGREE IS THE LIMIT."
9159  GOTO 9166
9160  PRINT 
9161  PRINT "TOO FEW POINTS FOR FITTING DEGREE";N-1
9162  GOTO 9166
9163  PRINT "   WHAT NEXT";
9164  INPUT R
9165  RETURN 
9166  STOP 
9900  DATA 6,2
9901  DATA 1,2,3,4,5,6,7,8,9,10,11,12
9999  END 
