1000  COM X[100],Y[100],Z[100],R[100],A[8],H[8,8],G[8]
1001  COM C$[3],T$[30],F$[20],M,N,D,W,T,F
1002  REM
1003  FILES DATFIL
1004  REM
1005  PRINT " ","LEAST SQUARES ANALYSIS"
1006  PRINT 
1007  LET M=100
1008  LET W=T=N=0
1009  LET F=1
1010  MAT X=ZER
1011  MAT Y=ZER
1012  MAT Z=ZER
1013  LET T$=""
1014  LET F$="POLYSIN COS CSN EXP "
1015  REM
1020  PRINT 
1030  PRINT "COMMAND ";
1040  INPUT C$[1,3]
1050  PRINT 
1100  IF C$="CLE" THEN 1008
1120  IF C$="DEL" THEN 1500
1125  IF C$="ENT" THEN 1600
1130  IF C$="FIT" THEN 5000
1140  IF C$="FUN" THEN 2000
1150  IF C$="HEL" THEN 2200
1160  IF C$="INS" THEN 2300
1170  IF C$="LIS" THEN 2500
1180  IF C$="NOT" THEN 2600
1190  IF C$="REA" THEN 2750
1200  IF C$="REP" THEN 2800
1210  IF C$="SHO" THEN 2900
1220  IF C$="SOR" THEN 3100
1225  IF C$="STO" THEN 9999
1230  IF C$="TAB" THEN 4000
1240  IF C$="TIT" THEN 4100
1250  IF C$="UNW" THEN 4200
1260  IF C$="WEI" THEN 4300
1270  IF C$="WRI" THEN 2700
1300  PRINT "INVALID COMMAND"
1310  GOTO 1020
1500  PRINT "INDEX ";
1510  INPUT I
1515  IF I>N OR I<1 THEN 1020
1520  FOR J=I TO N-1
1530  LET X[J]=X[J+1]
1540  LET Y[J]=Y[J+1]
1550  LET Z[J]=Z[J+1]
1560  NEXT J
1570  LET N=N-1
1580  GOTO 1020
1600  LET J=1
1610  IF N=0 THEN 1700
1620  PRINT N;"POINTS STORED, STARTING INDEX ";
1630  INPUT J
1640  IF J <= N+1 THEN 1680
1650  PRINT N;"POINTS, STARTING INDEX WILL BE";N+1
1660  LET J=N+1
1680  LET N=J-1
1700  PRINT "NUMBER OF POINTS";
1710  INPUT K
1720  PRINT 
1730  IF J-1+K <= M THEN 1760
1740  PRINT "NUMBER OF POINTS EXCEEDS LIMITS"
1750  GOTO 1700
1760  IF K=0 THEN 1020
1770  PRINT 
1780  PRINT "ENTER:  X, Y, AND DY"
1790  PRINT 
1800  FOR I=1 TO K
1810  LET I1=J+I-1
1820  PRINT I1;
1830  INPUT X[I1],Y[I1],Z[I1]
1835  LET Z[I1]=ABS(Z[I1])
1840  NEXT I
1850  LET N=N+K
1860  PRINT 
1870  GOTO 1020
2000  PRINT "FUNCTION";
2010  INPUT C$[1,3]
2030  FOR F=1 TO 5
2040  IF C$=F$[4*F-3,4*F-1] THEN 1020
2050  NEXT F
2100  LET F=1
2105  IF C$="HEL" THEN 2150
2110  PRINT "INVALID FUNCTION"
2120  PRINT 
2130  GOTO 2000
2150  PRINT "POLYNOMIAL, SIN, COS, CSN (SIN-COS), EXP"
2160  GOTO 2120
2200  PRINT "      CRVFT COMMANDS:"
2205  PRINT '10"1. DATA MANIPULATION"
2210  PRINT '10"CLEAR"'10'13"DELETE"'10'13"ENTER"'10'13"INSERT"'10'13"LIST"'10'13"READ"'10'13"REPLACE"'10'13"SORT"
2220  PRINT "TITLE"'10'13"WRITE"
2230  PRINT '10"2. FIT OPTIONS"
2235  PRINT '10"FIT"'10'13"FUNCTION"'10'13"UNWEIGHT"'10'13"WEIGHT"
2240  PRINT '10"3. PRINT OPTIONS"
2245  PRINT '10"TABLE"'10'13"NOTABLE"
2250  PRINT '10"4. GENERAL"
2260  PRINT '10"HELP"'10'13"SHOW"'10'13"STOP"'10
2297  GOTO 1020
2300  IF N<M THEN 2350
2310  PRINT "ARRAYS FULL"
2320  GOTO 1020
2350  PRINT "AFTER WHICH INDEX";
2360  INPUT J
2370  IF J>N THEN 1020
2380  LET J=J+1
2390  FOR I=N+1 TO J+1 STEP -1
2400  LET X[I]=X[I-1]
2410  LET Y[I]=Y[I-1]
2420  LET Z[I]=Z[I-1]
2430  NEXT I
2440  LET K=1
2450  GOTO 1770
2500  PRINT '10'10" ",T$;'10
2540  PRINT " N","   X","   Y","   DY"
2550  PRINT 
2560  FOR I=1 TO N
2570  PRINT I,X[I],Y[I],Z[I]
2580  NEXT I
2590  PRINT 
2595  GOTO 1020
2600  LET T=1
2610  GOTO 1020
2700  READ #1,1
2710  PRINT #1;N
2715  PRINT #1;T$
2720  FOR I=1 TO N
2730  PRINT #1;X[I],Y[I],Z[I]
2735  NEXT I
2736  READ #1,2
2737  READ #1,1
2740  GOTO 1020
2750  READ #1,1;N
2755  READ #1;T$
2760  FOR I=1 TO N
2765  READ #1;X[I],Y[I],Z[I]
2770  NEXT I
2780  READ #1,1
2790  GOTO 1020
2800  PRINT "INDEX";
2810  INPUT J
2820  IF J>N OR J<1 THEN 1020
2830  LET K=1
2840  LET N=N-1
2850  GOTO 1770
2900  PRINT '10"TITLE:  ";T$;'10
2930  PRINT N;"POINTS STORED"
2940  IF W=0 THEN 2960
2950  PRINT "UN";
2960  PRINT "WEIGHTED"
2970  IF T=0 THEN 2990
2980  PRINT "NO";
2990  PRINT "TABLE"
3000  PRINT "FUNCTION:  ";F$[4*F-3,4*F]
3010  PRINT '10'10;
3030  GOTO 1020
3100  LET M1=N
3110  LET M1=INT(M1/2)
3120  IF M1=0 THEN 1030
3130  LET K=N-M1
3140  LET I=1
3150  LET L=I
3160  LET J=L+M1
3170  IF X[L] <= X[J] THEN 3400
3200  LET A=X[L]
3210  LET X[L]=X[J]
3220  LET X[J]=A
3230  LET A=Y[L]
3240  LET Y[L]=Y[J]
3250  LET Y[J]=A
3260  LET A=Z[L]
3270  LET Z[L]=Z[J]
3280  LET Z[J]=A
3290  LET L=L-M1
3300  IF L>0 THEN 3160
3400  LET I=I+1
3410  IF K >= I THEN 3150
3420  GOTO 3110
4000  LET T=0
4010  GOTO 1030
4100  PRINT "ENTER TITLE:  ";
4110  INPUT T$
4120  GOTO 1020
4200  LET W=1
4210  GOTO 1030
4300  LET W=0
4310  GOTO 1030
5000  PRINT "DEGREE";
5010  INPUT D
5020  LET D=INT(D)
5030  IF D <= -1 OR N=0 THEN 7900
5050  IF D<8 THEN 5100
5060  PRINT "   DEGREE, 0<= D <=7"
5070  GOTO 5000
5100  IF W=0 THEN 5150
5110  FOR I=1 TO N
5120  LET R[I]=1
5130  NEXT I
5140  GOTO 5250
5150  FOR I=1 TO N
5160  IF Z[I]=0 THEN 5190
5170  LET R[I]=1/Z[I]^2
5180  GOTO 5200
5190  LET R[I]=1.E+06*(ABS(Y[I])+1)
5200  NEXT I
5250  LET L=D+1
5260  MAT H=ZER[L,L]
5270  REM
5300  FOR I=1 TO L
5310  FOR J=I TO L
5320  FOR K=1 TO N
5330  GOSUB 9020
5340  LET H[I,J]=H[I,J]+F1*F2*R[K]
5350  NEXT K
5360  LET H[J,I]=H[I,J]
5370  NEXT J
5380  NEXT I
5390  MAT H=INV(H)
5400  MAT G=ZER[L]
5410  LET J=1
5420  FOR I=1 TO L
5430  FOR K=1 TO N
5440  GOSUB 9020
5450  LET G[I]=G[I]+Y[K]*F1*R[K]
5460  NEXT K
5470  NEXT I
5500  MAT A=ZER[L]
5510  MAT A=H*G
5520  LET Q=0
5530  FOR K=1 TO N
5540  LET R1=R[K]
5550  LET R[K]=Y[K]
5560  FOR I=1 TO L
5570  GOSUB 9020
5580  LET R[K]=R[K]-A[I]*F1
5590  NEXT I
5600  LET Q=Q+R[K]^2*R1
5610  NEXT K
5620  LET N1=N-L
5630  LET S=1
5640  IF N1=0 THEN 5660
5650  LET S=Q/N1
5660  FOR K=1 TO L
5670  LET G[K]=SQR(ABS(H[K,K]*S))
5680  NEXT K
7000  PRINT '10'10"-"'10'10,T$
7030  PRINT '10"FIT OF DEGREE";D;"   FUNCTION:  ";F$[4*F-3,4*F]
7060  PRINT '10;N;"DATA POINTS"'10
7070  IF W=0 THEN 7100
7080  PRINT "EQUAL WEIGHTS"'10
7100  PRINT '10" K","    A(K)","   DA(K)"'10
7130  FOR I=1 TO L
7140  PRINT I-1,A[I],G[I]
7150  NEXT I
7200  PRINT '10'10'10"DEG OF FREE: ";N1;",   CHISQ = ";Q;",     VAR = ";S
7230  PRINT '10'10;
7250  IF T=1 THEN 7900
7300  PRINT "   X","   Y","   DY","  F(X)","   R"
7310  PRINT 
7320  FOR K=1 TO N
7330  PRINT X[K],Y[K],Z[K],Y[K]-R[K],R[K]
7340  NEXT K
7350  PRINT '10'10;
7400  LET P=45-2*W-L-N
7410  IF P <= 0 THEN 7900
7420  FOR I=1 TO P
7430  PRINT '10;
7440  NEXT I
7450  PRINT "-"
7900  GOTO 1020
9000  REM  *** FUNCTION ***
9010  REM
9020  LET I1=I-1
9030  LET J1=J-1
9040  GOTO F OF 9100,9200,9300,9400,9500
9100  LET F1=1
9120  IF I=1 THEN 9140
9130  LET F1=X[K]^I1
9140  LET F2=1
9150  IF J=1 THEN 9170
9160  LET F2=X[K]^J1
9170  RETURN 
9200  LET F1=1
9210  IF I=1 THEN 9230
9220  LET F1=SIN(I1*X[K])
9230  LET F2=1
9240  IF J=1 THEN 9260
9250  LET F2=SIN(J1*X[K])
9260  RETURN 
9300  LET F1=COS(I1*X[K])
9310  LET F2=COS(J1*X[K])
9320  RETURN 
9400  IF I=INT(I/2)*2 THEN 9430
9410  LET F1=COS(I1*X[K])
9420  GOTO 9450
9430  LET F1=SIN(I1*X[K])
9450  IF J=INT(J/2)*2 THEN 9480
9460  LET F2=COS(J1*X[K])
9470  RETURN 
9480  LET F2=SIN(J1*X[K])
9490  RETURN 
9500  LET F1=EXP(I1*X[K])
9510  LET F2=EXP(J1*X[K])
9520  RETURN 
9999  END 
