home *** CD-ROM | disk | FTP | other *** search
- ~~BASICA~~
- 10 '--------------------------------------------------------------
- 20 ' TableCurve BASICA Library Module
- 30 '--------------------------------------------------------------
- 40 ' This code is specific to BASICA/GWBASIC. BASICA's double
- 50 ' precision differs from most other languages. Its range is
- 60 ' limited to 1D-38 to 1D+38 although there are 15 digits
- 70 ' precision. To have all math functions performed using double-
- 80 ' precision, it is necessary to start BASICA on the command
- 90 ' line with the /D option.
- 100 '--------------------------------------------------------------
- 110 ' The polynomial and rational equations use a polynomial
- 120 ' calculation subroutine rather than coding the equation on a
- 130 ' single line. Such single line expressions are too complex for
- 140 ' BASICA to evaluate.
- 150 '--------------------------------------------------------------
- 160 DEFDBL X,Y : DEFINT I,J
- 170 DIM COEF#(11)`FPNRT`
- 180 DIM X(17),Y(17)
- 190 KEY OFF
- 200 FORE1%=1 : BACK1%=7 : FORE2%=15 : BACK2%=1
- 210 COLOR FORE1%,BACK1%,BACK1% : CLS
- 220 LOCATE 1,2 : PRINT CHR$(201);
- 230 LOCATE 25,2 : PRINT CHR$(200);
- 240 LOCATE 1,79 : PRINT CHR$(187);
- 250 LOCATE 25,79 : PRINT CHR$(188);
- 260 FOR I=3 TO 78 : LOCATE 1,I : PRINT CHR$(205); : NEXT I
- 270 FOR I=3 TO 78 : LOCATE 25,I : PRINT CHR$(205); : NEXT I
- 280 FOR I=2 TO 24 : LOCATE I,2 : PRINT CHR$(186); : NEXT I
- 290 FOR I=2 TO 24 : LOCATE I,79 : PRINT CHR$(186); : NEXT I
- 300 LOCATE 1,`POSN1`
- 310 PRINT " TableCurve Subroutine: `FILE` `DATE` `TIME` ";
- 320 COLOR FORE2%,BACK2%,BACK2%
- 330 FOR I=5 TO 23 : LOCATE I,33 : PRINT SPACE$(45); : NEXT I
- 340 LOCATE 5,33 : PRINT CHR$(218);
- 350 LOCATE 24,33 : PRINT CHR$(192);
- 360 LOCATE 5,77 : PRINT CHR$(191);
- 370 LOCATE 24,77 : PRINT CHR$(217);
- 380 FOR I=34 TO 76 : LOCATE 5,I : PRINT CHR$(196); : NEXT I
- 390 FOR I=34 TO 76 : LOCATE 24,I : PRINT CHR$(196); : NEXT I
- 400 FOR I=6 TO 23 : LOCATE I,33 : PRINT CHR$(179); : NEXT I
- 410 FOR I=6 TO 23 : LOCATE I,77 : PRINT CHR$(179); : NEXT I
- 420 LOCATE 5,`POSN2` : PRINT " `TITLE` ";
- 430 LOCATE 6,35 : PRINT "`XTITLE`";
- 440 LOCATE 6,57 : PRINT "`YTITLE`";
- 450 COLOR FORE1%,BACK1%,BACK1%
- 460 LOCATE 3,4 : PRINT "`EQSTR`";
- 470 LOCATE 4,6 : PRINT "Eqn# `EQNO`";
- 480 LOCATE 5,6 : PRINT "r2=`R2VAL`";
- 490 LOCATE 6,6 : PRINT "a= `ASTR`";
- 500 LOCATE 7,6 : PRINT "b= `BSTR`";
- 510 LOCATE 8,6 : PRINT "c= `CSTR`";
- 520 LOCATE 9,6 : PRINT "d= `DSTR`";
- 530 LOCATE 10,6 : PRINT "e= `ESTR`";
- 540 LOCATE 11,6 : PRINT "f= `FSTR`";
- 550 LOCATE 12,6 : PRINT "g= `GSTR`";
- 560 LOCATE 13,6 : PRINT "h= `HSTR`";
- 570 LOCATE 14,6 : PRINT "i= `ISTR`";
- 580 LOCATE 15,6 : PRINT "j= `JSTR`";
- 590 LOCATE 16,6 : PRINT "k= `KSTR`";
- 600 LOCATE 18,4 : PRINT "X= `XTITLE`";
- 610 LOCATE 19,4 : PRINT "Y= `YTITLE`";
- 620 LOCATE 21,4 : PRINT "Enter Value [x=,y=]";
- 630 LOCATE 24,4 : PRINT "Press ESC to End Program";
- 640 IROW=7
- 650 IATMAX=0
- 660 ON ERROR GOTO 880
- 670 J=IROW-6
- 680 COLOR FORE2%,BACK2%,BACK2%
- 690 NFLD$="": ROWFLD=22: COLFLD=4: MAXLEN=25: STATUS=0
- 700 GOSUB 11500
- 710 IF STATUS=0 THEN 890
- 720 IF STATUS>0 THEN X(J)=VAL(NFLD$):X=X(J):GOSUB 10000:Y(J)=Y:GOTO 750
- 730 IF IDIR=1 THEN IDIR=0 ELSE IDIR=1
- 740 YR=VAL(NFLD$) : GOSUB 11000 : X(J)=X : Y(J)=YR
- 750 IF IROW=23 THEN LOCATE 23,34 : PRINT SPACE$(42);
- 760 LOCATE IROW,35
- 770 FMT$="########.########"
- 780 IF ABS(X(J))>1E+07 OR ABS(X(J))<.0001 THEN FMT$=" +#.#######^^^^"
- 790 PRINT USING FMT$;X(J);
- 800 LOCATE IROW,57
- 810 FMT$="########.########"
- 820 IF ABS(Y(J))>1E+07 OR ABS(Y(J))<.0001 THEN FMT$=" +#.#######^^^^"
- 830 PRINT USING FMT$;Y(J);
- 840 IROW=IROW+1
- 850 IF IROW>23 THEN IROW=23:IATMAX=1
- 860 COLOR FORE1%,BACK1%,BACK1%
- 870 GOTO 670
- 880 RESUME 670
- 890 CLS
- 900 SYSTEM
- 910 END
-
- !!BASICA!!
- 10000 'TableCurve Subroutine:`FILE` `DATE` `TIME`
- 10010 '`TITLE`
- 10020 'X= `XTITLE`
- 10030 'Y= `YTITLE`
- 10040 'Eqn# `EQNO` `EQSTR`
- 10050 'r2=`R2VAL`
- 10060 'r2adj=`R2ADJ`
- 10070 'StdErr=`STDERR`
- 10080 'Fval=`Fval`
- 10090 'a= `ASTR`
- 10100 'b= `BSTR`
- 10110 'c= `CSTR`
- 10120 'd= `DSTR`
- 10130 'e= `ESTR`
- 10140 'f= `FSTR`
- 10150 'g= `GSTR`
- 10160 'h= `HSTR`
- 10170 'i= `ISTR`
- 10180 'j= `JSTR`
- 10190 'k= `KSTR`
- 10200 `SCOPE`DIM COEF#(11)`FPNRT`
- 10210 OLDX#=X#
- 10220 X#=`FX`
- 10230 N#=`FBAL2`
- 10240 N#=`FAUX`
- 10250 COEF#(1)=`PBb`
- 10260 COEF#(2)=`PBd`
- 10270 COEF#(3)=`PBf`
- 10280 COEF#(4)=`PBh`
- 10290 COEF#(5)=`PBj`
- 10300 ORDER%=`ORDPB1` : GOSUB 10900 : Y1#=X#*YPN#`LISTPB`
- 10305 XN#=X# : X#=N#`LISTPB`
- 10310 COEF#(1)=`PBa`
- 10320 COEF#(2)=`PBc`
- 10330 COEF#(3)=`PBe`
- 10340 COEF#(4)=`PBg`
- 10350 COEF#(5)=`PBi`
- 10360 COEF#(6)=`PBk`
- 10370 ORDER%=`ORDPB2` : GOSUB 10900 : Y2#=YPN#`LISTPB`
- 10375 X#=XN#`LISTPB`
- 10380 Y#=Y1#+Y2#`LISTPB`
- 10390 COEF#(1)=`RTa`
- 10400 COEF#(2)=`RTc`
- 10410 COEF#(3)=`RTe`
- 10420 COEF#(4)=`RTg`
- 10430 COEF#(5)=`RTi`
- 10440 COEF#(6)=`RTk`
- 10450 ORDER%=`ORDRTN` : GOSUB 10900`LISTRT`
- 10460 YNUM#=YPN#`LISTRT`
- 10470 COEF#(1)=`RTb`
- 10480 COEF#(2)=`RTd`
- 10490 COEF#(3)=`RTf`
- 10500 COEF#(4)=`RTh`
- 10510 COEF#(5)=`RTj`
- 10520 ORDER%=`ORDRTD` : GOSUB 10900`LISTRT`
- 10530 Y#=YNUM#/(1.0+X#*YPN#)`LISTRT`
- 10540 COEF#(1)= `PNa`
- 10550 COEF#(2)= `PNb`
- 10560 COEF#(3)= `PNc`
- 10570 COEF#(4)= `PNd`
- 10580 COEF#(5)= `PNe`
- 10590 COEF#(6)= `PNf`
- 10600 COEF#(7)= `PNg`
- 10610 COEF#(8)= `PNh`
- 10620 COEF#(9)= `PNi`
- 10630 COEF#(10)=`PNj`
- 10640 COEF#(11)=`PNk`
- 10650 ORDER%=`ORDPN` : GOSUB 10900`LISTPN`
- 10660 Y#=YPN#`LISTPN`
- 10665 ERFBAS#=`ERFBAS`
- 10670 Z=ABS(ERFBAS#)
- 10680 T=1.0/(1.0+0.5*Z)
- 10690 ANS=T*(-1.13520398+T*(1.48851587+T*(-.82215223+T*.17087277)))
- 10700 ANS=T*(.09678418+T*(-.18628806+T*(.27886807+ANS)))
- 10710 ANS=(T*EXP(-Z*Z-1.26551223+T*(1.00002368+T*(.37409196#+ANS))))
- 10720 IF ERFBAS#>=0.0 THEN ERF#=1.0-ANS ELSE ERF#=-1.0+ANS
- 10730 DEF FNERF#(X#)=ERF#
- 10740 X1#=`F1`
- 10750 X2#=`F2`
- 10760 X3#=`F3`
- 10770 X4#=`F4`
- 10780 Y#=`EQNCODE`
- 10790 Y#=`FY`
- 10800 X#=OLDX#
- 10810 RETURN
-
- 10900 'Polynomial Calculation Subroutine`FPNRT`
- 10910 YPN#=COEF#(ORDER%+1)`FPNRT`
- 10920 FOR ITER%=ORDER% TO 1 STEP -1`FPNRT`
- 10930 YPN#= YPN#*X#+COEF#(ITER%)`FPNRT`
- 10940 NEXT ITER%`FPNRT`
- 10950 RETURN`FPNRT`
-
- !!BASICA!!
-
- 11000 'Root Find Routine Using Bi-section Method
- 11010 XACC=1E-6*`XMEAN`
- 11020 XINC=`XRANGE`/4
- 11030 FOR I=0 TO 4
- 11040 IF I=4 THEN XV1=`XATYMIN`: XV2=`XATYMAX` :GOTO 11070
- 11050 IF IDIR=1 THEN XV2=`XMAXIMUM`-XINC*I : XV1=`XMAXIMUM`-XINC*(I+1): GOTO 11070
- 11060 XV1=`XMINIMUM`+XINC*I : XV2=`XMINIMUM`+XINC*(I+1)
- 11070 X=XV1 : GOSUB 10000 : XF=YR-Y
- 11080 X=XV2 : GOSUB 10000 : XM=YR-Y
- 11090 IF XF*XM>=0 THEN 11190
- 11100 IF XF<0.0 THEN XD=XV2-XV1 : XRTB=XV1 : GOTO 11120
- 11110 XD=XV1-XV2 : XRTB=XV2
- 11120 FOR IJ=1 TO 100
- 11130 XD=XD*0.5
- 11140 XMID=XRTB+XD
- 11150 X=XMID : GOSUB 10000 : XM=YR-Y
- 11160 IF XM<=0 THEN XRTB=XMID
- 11170 IF ABS(XD)<XACC OR XM=0 THEN X=XRTB : Y=YR : GOTO 11210
- 11180 NEXT IJ
- 11190 NEXT I
- 11200 X=0 : Y=YR
- 11210 RETURN
-
- 11500 'Numeric Input Subroutine, Fills NFLD$ with entry
- 11510 LOCATE ROWFLD,COLFLD,1: PRINT SPACE$(MAXLEN);
- 11520 LOCATE ROWFLD,COLFLD,1
- 11530 ICHAR=0 : IYFLAG=0 : IEXP=0
- 11540 C=ASC(INPUT$(1))
- 11550 IPASS=0
- 11560 IF ICHAR=0 AND (C=89 OR C=121) THEN IYFLAG=1: IPASS=1
- 11570 IF ICHAR=0 AND (C=88 OR C=120) THEN IPASS=1
- 11580 IF ICHAR=1 AND C=61 THEN IPASS=1
- 11590 IF((C>=48 AND C<=57) OR C=45 OR C=43 OR C=46 OR ((C=69 OR C=101) AND IEXP=0) OR IPASS=1) THEN 11600 ELSE 11650
- 11600 IF IPASS=0 THEN NFLD$=NFLD$+CHR$(C)
- 11610 IF C=69 OR C=101 THEN IEXP=1
- 11620 LOCATE ROWFLD,COLFLD+ICHAR,1: PRINT CHR$(C);
- 11630 LOCATE ROWFLD,COLFLD+ICHAR+1,1
- 11640 ICHAR=ICHAR+1
- 11650 IF((C=10 OR C=13 OR ICHAR=MAXLEN) AND ICHAR>0) THEN 11730
- 11660 IF(C=8 AND ICHAR>0) THEN 11670 ELSE 11710
- 11670 ICHAR=ICHAR-1: IF ICHAR=0 THEN IYFLAG=0
- 11680 LOCATE ROWFLD,COLFLD+ICHAR,1: PRINT CHR$(32);
- 11690 LOCATE ROWFLD,COLFLD+ICHAR,1
- 11700 IF LEN(NFLD$)>0 THEN NFLD$=LEFT$(NFLD$,LEN(NFLD$)-1)
- 11710 IF(C=27) THEN ICHAR=0 : GOTO 11730
- 11720 IF(ICHAR<MAXLEN) GOTO 11540
- 11730 IF IYFLAG=0 THEN STATUS=ICHAR ELSE STATUS=-ICHAR
- 11740 RETURN
- ~~BASICA~~
-