1  REM ****  HP TIME-SHARED BASIC PROGRAM LIBRARY *********************
2  REM
3  REM       POLY:    POLYNOMIAL APPROXIMATION   
4  REM
5  REM       36188    REV A      3/72    
6  REM
7  REM ****  CONTRIBUTED PROGRAM **************************************
9  IF  ERROR  THEN 500
10  PRINT "PROGRAM TO FIND POLYNOMIAL TO APPROXIMATE A TABLE"
11  PRINT "OF X-Y DATA IN A MINIMUM RMS ERROR MANNER"
12  PRINT 
15  DIM X[100],Y[100],A[11,11],B[11],C[11],P[22]
20  PRINT "DEGREE OF POLYNOMIAL N=";
25  INPUT N
26  PRINT "TYPE TERMINATOR VALUES"
27  INPUT T1,T2
30  PRINT "TYPE X-Y PAIRS."T1;","T2;" TERMINATES INPUT."
35  LET I=1
40  INPUT X[I],Y[I]
41  LET I=I+1
42  LET I9=I
45  IF X[I-1]#T1 OR Y[I-1]#T2 THEN 40
46  GOSUB 800
55  LET M=I-2
65  LET N2=2*N
70  FOR I=1 TO N2
75  LET P[I]=0
80  FOR J=1 TO M
85  LET P[I]=P[I]+X[J]^I
90  NEXT J
95  NEXT I
100  LET N1=N+1
105  FOR I=1 TO N1
110  FOR J=1 TO N1
115  LET K=I+J-2
120  IF K <= 0 THEN 135
125  LET A[I,J]=P[K]
130  GOTO 140
135  LET A[1,1]=M
140  NEXT J
145  NEXT I
150  LET B[1]=0
155  FOR J=1 TO M
160  LET B[1]=B[1]+Y[J]
165  NEXT J
170  FOR I=2 TO N1
175  LET B[I]=0
180  FOR J=1 TO M
185  LET B[I]=B[I]+Y[J]*X[J]^(I-1)
190  NEXT J
195  NEXT I
205  FOR K=1 TO N
210  LET K1=K+1
215  LET L=K
220  FOR I=K1 TO N1
225  IF ABS(A[I,K]) <= ABS(A[L,K]) THEN 235
230  LET L=I
235  NEXT I
238  IF L <= K THEN 280
240  FOR J=K TO N1
245  LET T=A[K,J]
250  LET A[K,J]=A[L,J]
255  LET A[L,J]=T
260  NEXT J
265  LET T=B[K]
270  LET B[K]=B[L]
275  LET B[L]=T
280  FOR I=K1 TO N1
285  LET F=A[I,K]/A[K,K]
290  LET A[I,K]=0
295  FOR J=K1 TO N1
300  LET A[I,J]=A[I,J]-F*A[K,J]
305  NEXT J
310  LET B[I]=B[I]-F*B[K]
315  NEXT I
320  NEXT K
325  LET C[N1]=B[N1]/A[N1,N1]
330  LET I=N
335  LET I1=I+1
340  LET S=0
345  FOR J=I1 TO N1
350  LET S=S+A[I,J]*C[J]
355  NEXT J
360  LET C[I]=(B[I]-S)/A[I,I]
365  LET I=I-1
370  IF I>0 THEN 335
375  PRINT 
376  PRINT "POLYNOMIAL OF DEGREE"N
380  PRINT "COEFFICIENTS OF POLYNOMIAL SUMMATION A(I)*X^I"
385  PRINT "I","A(I)"
386  PRINT "------------------"
390  FOR I=1 TO N1
395  PRINT I-1,C[I]
400  NEXT I
410  PRINT 
420  PRINT 
430  PRINT "TYPE 1 TO GO TO NEXT HIGHER DEGREE"
440  PRINT "TYPE 2 TO ENTER MORE DATA"
450  PRINT "TYPE 3 TO CHANGE DEGREE"
455  PRINT "TYPE 4 TO END"
460  INPUT K
470  IF K=1 THEN 550
480  IF K=2 THEN 600
490  IF K=3 THEN 700
500  CHAIN R,"*HELP"
510  SYSTEM X,"BYE"
550  LET N=N+1
560  IF N <= 11 THEN 65
570  PRINT "DEGREE GREATER THAN 11"
580  LET N=11
590  GOTO 430
600  LET I=I9
610  PRINT "DEGREE OF POLYNOMIAL?  (0 MEANS SAME DEGREE AS BEFORE"
620  INPUT K
630  IF K=0 THEN 40
640  IF K>11 THEN 570
650  LET N=K
660  GOTO 40
700  PRINT "DEGREE OF POLYNOMIAL?";
710  INPUT N
720  GOTO 65
800  REM SUBROUTINE TO ORDER THE DATA
810  FOR I=1 TO I9-2
820  FOR J=I+1 TO I9-1
830  IF X[I]<X[J] THEN 900
840  LET Z=X[I]
850  LET X[I]=X[J]
860  LET X[J]=Z
870  LET Z=Y[I]
880  LET Y[I]=Y[J]
890  LET Y[J]=Z
900  NEXT J
910  NEXT I
920  RETURN 
999  END 
