5  REM		POLY  ADAPTED BY DSAA
10  PRINT "PROGRAM TO FIND POLYNOMIAL TO APPROXIMATE A TABLE"
11  PRINT "OFF 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
43  REM     POLY:    POLYNOMIAL APPROXIMATION
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 N1=N+1
105  FOR I=1 TO N1
110  FOR J=1 TO N1
115 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"
460  INPUT K
470  IF K=1 THEN 550
480  IF K=2 THEN 600
490  IF K=3 THEN 700
500 GOTO 999
550  LET N=N+1
560 IF N<=11 THEN MAT A=ZER:MATB=ZER:MATC=ZER:MATP=ZER:GOTO65
570  PRINT "DEGREE GREATER THAN 11"
580  LET N=11
590  GOTO 430
600  LET I=19
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
