1   REM THIS PROGRAM APPEARS AT PAGE 179 OF THE ITALIAN VERSION OF
2   REM "PROGRAMMING IN BASIC" 1ST EDITION, BY BYRON S. GOTTFRIED 
5   REM		LEAST SQUARES CURVE FITTING
10  DIM X(100),Y(100)
15  PRINT "INPUT N=0 FOR A POWER FUNCTION, N=1 FOR AN EXPONENTIAL ";
20  PRINT "FUNCTION"
25  PRINT "FOR A POLYNOMIAL, LET N EQUAL THE NUMBER OF TERMS IN ";
30  PRINT "THE POLYNOMIAL."
35  PRINT "N=";
40  INPUT N
45  REM
50  REM		ENTER DATA POINTS
55  REM
60  PRINT
65  PRINT "ENTER THE Y-VALUES"
70  MAT INPUT Y
75  LET M=NUM
80  PRINT
85  PRINT "ENTER THE X-VALUES"
90  MAT INPUT X
95  IF NUM=M THEN 115
100 PRINT "THE NUMBER OF Y-VALUES DOES NOT CORRESPOND TO THE ";
105 PRINT "NUMBER OF X-VALUES"
110 STOP
115 REM
120 REM		CALCULATE LOGARITHMS OF X- AND Y-VALUES IF NECESSARY
125 REM
127 DIM A(M,M),D(M) ' THIS LINE IS NOT PRESENT IN THE ORIGINAL CODE
130 IF N>=2 THEN 170
135 FOR I=1 TO M
140 	LET Y(I)=LOG(Y(I))
145 NEXT I
150 IF N=1 THEN 170
155 FOR I=1 TO M
160	LET X(I)=LOG(X(I))
165 NEXT I
170 REM 
175 REM		CALCULATE ELEMENTS OF A-MATRIX AND D-VECTOR
180 REM
185 LET N1=N
190 IF N1>=2 THEN 200
195 LET N1=2
200 MAT A=ZER(N1,N1)
202 DIM B(N1,N1),C(N1)	' THIS LINE WAS NOT PRESENT IN THE ORIGINAL CODE
205 MAT D=ZER(N1)
210 FOR I=1 TO N1
215 	FOR J=1 TO N1
220		IF I+J>2 THEN 235
225		LET A(I,J)=M
230		GO TO 250
235		FOR K=1 TO M
240			LET A(I,J)=A(I,J)+X(K)^(I+J-2)
245		NEXT K
250	NEXT J
255 	FOR K=1 TO M
260		IF I>1 THEN 275
265		LET D(I)=D(I)+Y(K)
270		GO TO 280
275		LET D(I)=D(I)+Y(K)*X(K)^(I-1)
280	NEXT K
285 NEXT I
290 REM
295 REM		PRINT SIMULTANEOUS LINEAR EQUATIONS
300 REM
305 PRINT
310 PRINT "COEFFICIENTS IN SYSTEM OF LINEAR EQUATIONS"
315 PRINT
320 FOR I=1 TO N1
325	FOR J=1 TO N1
330		PRINT A(I,J);
335	NEXT J
340	PRINT D(I)
345 	PRINT
350 NEXT I
355 REM
360 REM		SOLVE SIMULTANEOUS LINEAR EQUATIONS
365 REM
370 MAT B=INV(A)
375 MAT C=B*D
380 REM
385 REM		PRINT EQUATION FOR CURVE FIT
390 REM
395 IF N>1 THEN 430
400 LET C1=EXP(C(1))
405 IF N=1 THEN 420
410 PRINT "POWER FUNCTION:  Y=";C1;"*X^";C(2)
415 GO TO 490
420 PRINT "EXPONENTIAL FUNCTION:  Y=";C1;"*EXP(";C(2);"*X)"
425 GO TO 490
430 IF C(2)>=0 THEN 445
435 PRINT "POLYNOMIAL FUNCTION:  Y=";C(1);C(2);"*X";
440 GO TO 450
445 PRINT "POLYNOMIAL FUNCTION:  Y=";C(1);"+";C(2);"*X";
450 IF N=2 THEN 485
455 FOR I=3 TO N
460	IF C(I)>=0 THEN 475
465	PRINT C(I);"*X^";I-1;
470	GO TO 480
475	PRINT "+";C(I);"*X^";I-1;
480 NEXT I
485 PRINT
490 REM
495 REM		PRINT INPUT VALUES OF X AND Y AND CALCULATED VALUES OF Y
500 REM
505 IF N>=2 THEN 545
510 FOR I=1 TO M
515	LET Y(I)=EXP(Y(I))
520 NEXT I
525 IF N=1 THEN 545
530 FOR I=1 TO M
535	LET X(I)=EXP(X(I))
540 NEXT I
545 PRINT
550 PRINT TAB(2);"X";TAB(16);"Y (ACTUAL)";TAB(30);"Y (CALCULATED)"
555 LET S=0
560 FOR I=1 TO M
565 	IF N>=2 THEN 595
570	IF N=1 THEN 585
575	LET Y1=C1*X(I)^C(2)
580 	GO TO 615
585 	LET Y1=C1*EXP(C(2)*X(I))
590	GO TO 615
595	LET Y1=C(1)
600	FOR J=2 TO N
605		LET Y1=Y1+C(J)*X(I)^(J-1)
610	NEXT J
615	LET S=S+(Y(I)-Y1)^2
620	PRINT X(I),Y(I),Y1
625 NEXT I
630 PRINT
635 PRINT "SUM OF SQUARE ERRORS=";S
640 END
