REM least squares curve fit program "lstsq" REV 11-98 DEFINT I,N,J DIM X(500),Y(500),XRAW(500),YRAW(500),AF(5),BF(5) COLOR 15,1,1 CLS PRINT "MULTIFUNCTION LEAST SQUARES CURVE FIT Copyright 1998 by D. Raymer" PRINT PRINT "INPUT DATA POINTS X,Y RETURN TWICE TO END INPUT" FOR I=1 TO 500 INPUT " ",XRAW(I),YRAW(I) IF I>1 THEN IF XRAW(I)=0 AND YRAW(I)=0 AND XRAW(I-1)=0 AND YRAW(I-1)=0 THEN EXIT FOR END IF NEXT I N=I-2 54 CLS PRINT "RAYMER'S LEAST SQUARES CURVE FIT RESULTS " FOR J=1 TO 5 FOR I=1 TO n X(I)=XRAW(I) Y(I)=YRAW(I) IF (J=2 OR J=4) THEN Y(I)=LOG10(Y(I)) IF(J=3 OR J=4) THEN X(I)=LOG10(X(I)) IF(J=5) THEN X(I)=X(I)*X(I) IF(J=5) THEN Y(I)=Y(I)*Y(I) NEXT I SX2=0 SY2=0 SX=0 SY=0 SXY=0 FOR I=1 TO N SX2=SX2+X(I)*X(I) SY2=SY2+Y(I)*Y(I) SX=SX+X(I) SY=SY+Y(I) SXY=SXY+X(I)*Y(I) NEXT I D=SX2-SX*SX/N A=(SX2*SY-SX*SXY)/(N*D) B=(SXY-SX*SY/N)/D IF (SX2-SX*SX/N)*(SY2-SY*SY/N)>0. THEN CORELAT=(SXY-SX*SY/N)/SQR((SX2-SX*SX/N)*(SY2-SY*SY/N)) ELSE CORELAT=-999 END IF AF(J)=A BF(J)=B IF(J=1) THEN PRINT "linear : y= a+b*x "; IF(J=2) THEN PRINT "log y vs x : y= 10^(a+b*x ) "; IF(J=3) THEN PRINT "log x vs y : y= a+b*log10(x) "; IF(J=4) THEN PRINT "log-log : y= (10^a)*(x^b) "; IF(J=5) THEN PRINT "elliptic: y= sqrt(a+b*x^2) "; PRINT " a= ";A;" b= ";B;" Cor.= ";CORELAT NEXT J PRINT PRINT " Actual X Actual Y Y-linear Y-log y Y-logx Y-loglog Y-elliptic" IDUM=8 FOR I=1 TO N IDUM=IDUM+1 IF IDUM>23 THEN LOCATE 25,1 PRINT "Copy if desired. Press any key to continue"; WHILE NOT INSTAT : WEND: A$=INKEY$ CLS IDUM=1 END IF X(I)=XRAW(I) Y(I)=YRAW(I) PRINT USING ("#####.#####");XRAW(I);YRAW(I);(AF(1)+BF(1)*X(I));(10^(AF(2)+BF(2)*X(I))); _ (AF(3)+BF(3)*log10(X(I)));(10^AF(4)*X(I)^BF(4));(sqr(AF(5)+BF(5)*X(I)^2)) NEXT I LOCATE 25,1 PRINT "Done! Press R to revise inputs and recalculate. Press another key to Exit."; WHILE NOT INSTAT : WEND A$=INKEY$ IF A$="R" OR A$="r" THEN CLS PRINT "INPUT NEW X,Y POINTS. RETURN TO LEAVE BOTH X & Y UNCHANGED." FOR I=1 TO N PRINT "CURRENT: ",XRAW(I);", ",YRAW(I)," "; INPUT "INPUT NEW X,Y: ",XINPT,YINPT IF XINPT*YINPT<>0. THEN XRAW(I)=XINPT YRAW(I)=YINPT END IF NEXT I GOTO 54 END IF END