10 ' 20 ' DISCHARGE OF A CAPACITOR IN AN RC CIRCUIT 30 ' 40 '------------------- 1/5/88 --------------------------- 50 ' 60 ' This program calculates and plots the amount of ' charge remaining on a discharging capacitor as a ' function of time. It calculates an approximate ' value for the charge using an iterative procewdure ' in which the charge during an interval DT is given ' by DQ=Q*DT/TAU. It also calculates the exact value ' of the charge. 120 ' --> LIST OF PROCEDURES <-- 130 ' 140 GOSUB 250 'INITIALIZATIONS 150 GOSUB 330 'INPUT 160 GOSUB 500 'LOOP OVER TIMES 170 GOSUB 630 'PLOT THE RESULTS 180 PRINT 190 PRINT 200 INPUT "WANT TO RUN ANOTHER (Y/N)? ", AGAIN$ 210 IF AGAIN$ = "Y" OR AGAIN$ = "y" THEN 150 220 END 230 ' 240 '------------------------------------------------------ 250 'INITIALIZATIONS 260 ' 270 DIM YSTRG$(101),X(101),Y1(101),Y2(101) 280 NYMAX = 51 290 READ BLANK$,PLUS$,EX$,ASTER$,DOT$ 300 DATA " ","+","X","*","." 310 RETURN 320 '------------------------------------------------------ 330 'INPUT 340 ' 350 PRINT "INPUT VALUES FOR THE FOLLOWING:" 360 INPUT "TIME CONSTANT (TAU)= ";TAU 370 INPUT "TIME STEP (DT)= ";DT 380 INPUT "NUMBER OF STEPS (N)= ";NXMAX 390 ' 400 '-- Q1=The exact value of the charge remaining 410 ' Q2=The approximate value of the charge remaining 420 ' at time T=0 both Q1 and Q2 are assumed to be 1.0 430 ' 440 T = 0 450 Q1 = 1 460 Q2 = 1 470 ' 480 RETURN 490 '------------------------------------------------------ 500 'LOOP OVER TIMES 510 ' 520 FOR NX = 1 TO NXMAX 530 ' 540 ' -- Calculates the next values of Q1 and Q2 550 ' 560 T = T + DT : X(NX) = T 570 DQ = - Q2 * DT / TAU 580 Q2 = Q2 + DQ : Y2(NX) = Q2 590 Q1 = EXP ( - T / TAU): Y1(NX) = Q1 600 NEXT NX 610 RETURN 620 '----------------------------------------------------- 630 'PLOT THE RESULT 640 ' 650 PRINT 660 INPUT "PRINTER (Y/N)? ",ANS$ 670 IF ANS$ = "Y" OR ANS$ = "y" THEN OPEN "LPT1:" FOR OUTPUT AS #1 680 IF ANS$ <> "Y" AND ANS$ <> "y" THEN OPEN "SCRN:" FOR OUTPUT AS #1 690 ' 700 ' -- Plot the graph header: 710 ' 720 PRINT #1, " TAU = ";TAU;" DT = ";DT;" # STEPS =_ ";NXMAX 730 PRINT #1, 740 PRINT #1, 750 PRINT #1, " EXACT APPROX" 760 PRINT #1, " Q Q-> 0"; 770 FOR NY = 2 TO NYMAX - 1 780 PRINT #1, BLANK$; 790 NEXT NY 800 PRINT #1, "1" 810 ' 820 ' -- Plot the top line of the graph: 830 ' 840 PRINT #1, " TIME * + "; 850 FOR NY = 1 TO NYMAX 860 YSTRG$(NY) = BLANK$ 870 PRINT #1, DOT$; 880 NEXT NY 890 PRINT #1, 900 ' 910 ' -- Plot the various lines: 920 ' 930 FOR NX = 1 TO NXMAX 940 PRINT #1, USING " ##.##";X(NX); 950 PRINT #1, USING " #.### ";Y1(NX); 960 PRINT #1, USING "#.### ";Y2(NX); 970 PNY1 = 1 + INT ( Y1(NX) * ( NYMAX - 1 ) + .5 ) 980 PNY2 = 1 + INT ( Y2(NX) * ( NYMAX - 1 ) + .5 ) 990 IF PNY1 > NYMAX THEN PNY1= NYMAX 1000 IF PNY2 > NYMAX THEN PNY2 = NYMAX 1010 YSTRG$(1) = DOT$ 1020 YSTRG$(NYMAX) = DOT$ 1030 YSTRG$(PNY1) = ASTER$ 1040 YSTRG$(PNY2) = PLUS$ 1050 FOR NY = 1 TO NYMAX 1060 PRINT #1, YSTRG$(NY); 1070 NEXT NY 1080 PRINT #1, 1090 YSTRG$(PNY1) = BLANK$ 1100 YSTRG$(PNY2) = BLANK$ 1110 NEXT NX 1120 ' 1130 ' -- Print bottom line: 1140 ' 1150 PRINT #1, " "; 1160 FOR NY = 1 TO NYMAX 1170 PRINT #1, DOT$; 1180 NEXT NY 1190 ' 1200 PRINT #1, 1210 PRINT #1, 1220 CLOSE #1 1230 RETURN 1240 '-------------- END OF PROGRAM LINES ------------------