1 !!! FGRAPH 11-DEC-74 R. LEAVITT EDIT 03 08-JUL-77 !!! !!! GRAPHS UP TO 5 POLYNOMIAL FUNCTIONS AND DATA POINTS !!! !!! DATA STATEMENTS START AT LINE 11900 AND SHOULD BE !!! !!! IN THE FOLLOWING ORDER: !!! 2 !!! THE 7 COEFS FOR EACH OF THE 5 FUNCTIONS, 0'S IF NOT !!! !!! USED; THE # OF DATA POINTS TO BE SUPERIMPOSED ON !!! !!! THE FUNCTION PLOT; AND THE (X,Y) DATA POINTS. !!! !!! NOTE: ALL ABOVE DATA CAN BE RECEIVED FROM POLFTE !!! 3 !!! 20000 IS CHAIN IN POINT FROM "PAMSTD" 100 RESTORE 200 ON ERROR GOTO 13600 300 DIM G%(5),N%(80),C(4,6),P(200,1) 500 FOR I1%=0% TO 4% 600 FOR I2%=0% TO 6% 700 READ C(I1%,I2%) ! GET COEFS FOR FIVE FUNCTIONS 800 IF ABS(C(I1%,I2%))<1E-6 THEN C(I1%,I2%)=0 900 NEXT I2% 1000 NEXT I1% 1100 ON ERROR GOTO 13800 1200 READ I3% ! HOW MANY DATA POINTS 1300 FOR I1%=0% TO I3%-1% 1400 READ P(I1%,0),P(I1%,1) ! GET (X,Y) COORDINATES 1500 NEXT I1% 2020 N$=SYS(CHR$(6)+CHR$(-7)) : ON ERROR GOTO 13910 2100 I=1 : A$="ABCDEFGH" : IF S1% THEN G%(1)=1% : A$="*" : GOTO 3500 2200 PRINT "TYPE IN THE LAST LETTERS OF THE FUNCTION YOU WANT GRAPHED" 2300 PRINT "EG. B,C,E WILL GRAPH FNB, FNC, AND FNE" 2400 INPUT LINE N$ : GOSUB 14000 2600 G%(I2%)=0% FOR I2%=1% TO 5% 2700 FOR I1%=1% TO LEN(N$) STEP 2% 2800 FOR I2%=1% TO 5% 2900 IF MID(A$,I2%,1%)=MID(N$,I1%,1%) THEN 3300 3000 NEXT I2% 3100 PRINT "ILLEGAL FUNCTION-->";MID(N$,I1%,1%) 3200 PRINT"RE-ENTER THE LAST LETTERS OF THE FUNCTIONS YOU WANT GRAPHED":GOTO 2400 3300 G%(I2%)=1% ! LOAD ONLY FUNCTIONS REQUESTED 3400 NEXT I1% 3500 PRINT "BEGINNING AND END POINTS FOR THE GRAPH"; : IF S1% THEN PRINT ". DEFAULT VALUES ARE 0 AND";B; : INPUT LINE N$ : GOSUB 14000 : IF N$="" THEN 3850 ELSE V%=INSTR(1,N$,",") : A=VAL(LEFT(N$,V%-1%)) : B=VAL(RIGHT(N$,V%+1%)) : GOTO 3700 3510 INPUT A,B 3700 IF A<=B THEN 3800 ELSE PRINT "SMALLER NUMBER FIRST, PLEASE":GOTO 3500 3800 IF A"Y" THEN 3890 3900 PRINT # 7% : PRINT # 7% : I=A : IF S1% THEN PRINT #7%,"STD CURVE FOR ";W$; "; X-AXIS/10^"; X%;". Y-AXIS IN NG INJ" : S1%=1% : PRINT #7% 4000 C%=0% : S=1.E+38 : M=-1.E+38 4600 Y=(B-A)/50 4700 FOR I=A TO B STEP Y ! SET UP Y-AXIS SCALE 4800 IF ABS(I)<1E-5 THEN I=0 4900 FOR I1%=1% TO 5% 5000 IF G%(I1%) THEN GOSUB 10600 5100 IF X>S THEN 5300 5200 S=X ! GET SMALLEST VALUE OF FN(X) 5300 IF X<=M THEN 5500 5400 M=X ! GET LARGEST VALUE OF FN(X) 5500 NEXT I1% 5600 NEXT I 5610 FOR I1%=0% TO I3%-1% 5620 IF P(I1%,0)B+Y/2 THEN 5640 5630 X=P(I1%,1) 5631 IF X>=S THEN 5633 5632 S=X 5633 IF X<=M THEN 5640 5634 M=X 5640 NEXT I1% 5700 IFM=S THEN PRINT # 7%"THE GRAPH IS A HORIZONTAL LINE AT Y=";S:GOTO10300 5800 Y=(M-S)/60 5900 GOSUB 11200 6000 S=S/(10*Y) 6100 S=INT(S)*10*Y ! MAKE SURE WE START WITH A MULTIPLE OF THE Y-AXIS SCALER 6200 FOR V%=1% TO 8% : N$=NUM$(S+10%*(V%-1%)*Y) : I=LEN(N$) 6300 PRINT # 7% TAB(10%*V%-I+1%);LEFT(N$,I-1%); ! Y-AXIS VALUES 6400 NEXT V% : PRINT # 7% 6500 M=(B-A)/50 6600 FOR I=A TO B+.1*M STEP M ! SET UP LINES PRINTING X-AXIS VALUES EVERY 5TH 6700 IF ABS(I)<1E-5 THEN I=0 6800 IF C%=INT(C%/5%)*5%THEN N$=LEFT(NUM$(I),LEN(NUM$(I))-1%) ELSE N$=" " 6900 IF LEN(N$)<9 THEN N$=N$+" " : GOTO 6900 7000 IF LEN(N$)>9% THEN N$=LEFT(N$,INSTR(1%,N$,"E")-2%)+RIGHT(N$,INSTR(1%,N$,"E")) : GOTO 7000 7100 N$=N$+ "X + + + + + + X" 7200 CHANGE N$ TO N% 7300 IF C%=INT(C%/5%)*5% THEN N%(10),N%(80)=ASCII("+") 7400 IF C%=0% OR C%=50% THEN 7500 ELSE 7800 7500 FOR V%=11% TO 79% 7600 IF V%=INT(V%/10%)*10% THEN 7700 ELSE N%(V%)=ASCII("Y") 7700 NEXT V% 7800 FOR I1%=1% TO 5% 7900 IF G%(I1%)=0% THEN 8300 8000 GOSUB 10600 8100 GOSUB 11800 ! SCALE POINT 8200 N%(V%)=ASCII(MID(A$,I1%,1%)) ! PUT IN FN(X)'S LETTER FOR POINT 8300 NEXT I1% 8400 FOR I1%=0% TO I3%-1% ! NOW PUT IN ACTUAL DATA POINTS AS "O"'S 8500 IF P(I1%,0)=-.1E32 THEN 8800 8600 IF I>=P(I1%,0)+M/2 THEN 8800 8700 IF I=P(I1%,0) OR I>P(I1%,0)-M/2 OR I-M/2>=P(I1%,0) THEN X=P(I1%,1) : GOSUB 11800 : P(I1%,0)=-.1E32 : N%(V%)=ASCII("O") 8800 NEXT I1% 8900 CHANGE N% TO N$ : PRINT # 7% N$ 9000 C%=C%+1% 9100 NEXT I 9200 PRINT # 7% : PRINT # 7% TAB(5); : V%=0% 9300 FOR I1%=1% TO 5% ! LIST OUT COEFS FOR EACH FUNCTION USED 9400 IF G%(I1%) THEN IF S1% THEN PRINT #7% "EQUATION COEFS:" ELSE PRINT # 7% "FN";MID(A$,I1%,1);"(X)-->";MID(A$,I1%,1);" "; 9500 NEXT I1% : PRINT # 7% : PRINT # 7% 9600 FOR I2%=0% TO 6%-4%*S1% 9700 PRINT # 7% "X^";RIGHT(NUM$(I2%),2); 9800 FOR I1%=1% TO 5% 9900 IF G%(I1%) THEN PRINT # 7% TAB(V%*13%+5%);C(I1%-1%,I2%); : V%=V%+1% 10000 NEXT I1% : PRINT # 7% 10100 V%=0% 10200 NEXT I2% 10300 PRINT # 7% CHR$(12); : IF S1% THEN 21000 ELSE INPUT "WANT DIFFERENT END POINTS AND/OR FUNCTIONS";N$ 10400 IF LEFT(N$,1%)="Y" THEN IF I4% THEN 12600 ELSE 100 10410 IF L$<>"" THEN PRINT "CHAIN BACK TO '";L$;"' 32000"; : INPUT N$ : IF LEFT(N$,1)="Y" THEN CHAIN L$ 32000 10500 GOTO 30000 10600 X9,X=0 : ON ERROR GOTO 11100 10700 FOR I5%=0% TO 6% : X9=C(I1%-1%,I5%)*I^I5% 10800 X=X+X9 10900 NEXT I5% : RETURN 11100 IF ERR<>49% THEN GOTO 13910 ELSE X9=0 : RESUME 10900 11200 I=LOG10(Y) 11300 I1%=INT(I) 11400 I=I-I1% : I=10^I 11500 IF I=1 THEN I=1 ELSE IF I<=2 THEN I=2 ELSE IF I<=5 THEN I=5 ELSE IF I<=10 THEN I=10 11600 Y=I*10^I1% 11700 RETURN 11800 V%=INT((X-S)/Y+.5)+10% : RETURN 11900 DATA 0,0,1,0,0,0,0 12000 DATA 137.149,-1.64666,.593864E-2,0,0,0,0 12100 DATA 225.341,-6.24578,.792895E-1,-.347077E-3,0,0,0 12200 DATA 2460.09,-172.448,4.51339,-.500076E-1,.192718E-3,0,0 12300 DATA 0,0,0,0,0,0,0 12400 DATA 9 12500 DATA -4,16,-3,9,-2,4,-1,1,0,0,1,1,2,4,3,9,4,16 12600 DIM #1%,D(4,6),P1(201,1) : OPEN "POLFTE.DAT" FOR INPUT AS FILE 1% 12650 L$=SYS(CHR$(7)) 12700 FOR I1%=0% TO 4% : FOR I2%=0% TO 6% 12800 C(I1%,I2%)=D(I1%,I2%) 12900 NEXT I2% : NEXT I1% 13000 I3%=P1(0,0) 13100 FOR I1%=1% TO I3% 13200 P(I1%-1%,I2%)=P1(I1%,I2%) FOR I2%=0% TO 1% 13300 NEXT I1% 13400 CLOSE 1% 13500 I4%=1% : GOTO 2020 13600 IF ERR=57 THEN PRINT"OUT OF DATA BUT WILL CONTINUE" ELSE ON ERROR GOTO 0 13700 RESUME 1600 13800 IF ERR=57 THEN PRINT"INCORRECT # OF DATA POINTS SPECIFIED" ELSE ON ERROR GOTO 0 13900 RESUME 1600 13910 IF ERR<>28% THEN ON ERROR GOTO 0 13920 N$=SYS(CHR$(0)) : IF S1% THEN RESUME 21000 ELSE RESUME 10410 14000 N$=LEFT(N$,LEN(N$)-1%) : I1%=ASCII(RIGHT(N$,LEN(N$))) : IF I1%=13% OR I1%=10% THEN 14000 ELSE RETURN 20000 DIM #5%,D3(20,4),D2(15,20) : DIM #6%,W8$(0)=32%,W9$(20),W9(20,1) 20010 OPEN "PAMSTD.PLT" FOR INPUT AS FILE 5% : IF D2(0,0)<1000 THEN N$=NUM$(D2(0,0)) ELSE N$=NUM$(D2(0,0)-1000) : W$="DK1:" 20020 OPEN W$+"$WINDOW."+N$ FOR INPUT AS FILE 6% 20030 INPUT "WHICH STD # DO YOU WANT";S1% : IF S1%<1% OR S1%>W9(0,0) THEN PRINT I1%,W9$(I1%) FOR I1%=1% TO W9(0,0) : GOTO 20030 20035 IF D3(S1%,3)=-1 THEN PRINT "INSUFFICIENT POINTS FOR STD CURVE OF ";W9$(S1%) : GOTO 20030 20040 C(0,I1%)=D3(S1%,I1%) FOR I1%=0% TO 2% : W$=W9$(S1%) : X%=D3(S1%,3) : B=D3(S1%,4)/10.^X% 20050 I3%=INT(D2(0,1%)) 20060 FOR I1%=1% TO I3% : IF D2(I1%,S1%)<>0 THEN P(I1%-1%,1)=D2(I1%,0)*W9(S1%,1) ELSE P(I1%-1%,1)=0 20070 P(I1%-1%,0)=D2(I1%,S1%) : NEXT I1% : CLOSE 5%,6% : GOTO 2020 21000 INPUT "PLOT DIFFERENT STD";N$ : IF LEFT(N$,1)="Y" THEN 20000 21020 INPUT "WANT TO SEE CALC DATA";N$ : IF LEFT(N$,1)="Y" THEN CHAIN "$PAMCAL"31000 30000 CLOSE 1%,2%,3%,4%,7% : END