DEFDBL A-Z '##################################################################### '//GRAPH (ALMOST) ANY INTEGRAL WITHOUT KNOWING ITS ANALYTIC SOLUTION '//PROGRAMMED FOR CALCULUS STUDENTS '//BY TOSHIHIRO HORIE 11/13/95 '//BASED ON SIMPSON.BAS BY T. Horie '##################################################################### DECLARE SUB GRID (XC%, YC%, XS%, YS%, XN%, YN%) ON ERROR GOTO er CONST FALSE = 0, TRUE = NOT FALSE CONST e = 2.7182818# VARS: OPTION BASE 1 DIM SHARED ISECT(3) DIM XOLD(2), YOLD(2), YP(2) iformat$ = "X=+##.# Integral=+#######.###" XS% = 640: YS% = 480: 'dimensions of screen 12 XC% = XS% \ 2: YC% = YS% \ 2 XM% = 10: YM% = 5: 'X AND Y DIMENSIONS OF GRID XN% = XS% \ XM%: YN% = INT(XS% \ YM% * 1.33333) XI = .2: 'coarseness of the plotted line MAIN: GRID XC%, YC%, XS%, YS%, XN%, YN% 'GOSUB EQUATION: 'get endpoints a and b 'LINE (a * XN% + XC%, 0)-(a * XN% + XC%, YS%), 7, , &HAAAA 'LINE (b * XN% + XC%, 0)-(b * XN% + XC%, YS%), 7, , &HBBBB x = -XC% / XN% - 1: GOSUB EQUATION DO x = x + XI FOR N = 1 TO 2 'TRANSLATE TO SCREEN COORDINATES.... GOSUB EQUATION IF y(N) > YM% THEN y(N) = YM% IF y(N) < -YM% THEN y(N) = -YM% XP% = x * XN% + XC% YP%(N) = -y(N) * YN% + YC% LINE (XOLD%(N), YOLD%(N))-(XP%, YP%(N)), N + 9 XOLD%(N) = XP%: YOLD%(N) = YP%(N) NEXT N LOOP WHILE x < (XC% / XN%) a = -XC% / XN%: PSET (-XC% * XN - 1, YC%) 'A=0:PSET (xc%, yc%):'to start at origin LOCATE 5, 1: COLOR 7: PRINT "Calculating...": COLOR 15 CONST b = 0 'from definition of integral? DO: '------------------------------------------------------------------ astart = a N% = 10 '50 subdivisions (N% must be even!) h = (b - a) / N% 'dx for each subdivision integral = 0 'init integral to 0 s = 0 'init sum x = a + h: GOSUB EQUATION: s = s + y(1) * 4 x = a + h + h 'init x position to start FOR lp% = 1 TO N% - 2 GOSUB EQUATION IF ((lp% - 1) MOD 2) = 0 THEN s = s + y(1) * 2 ELSE s = s + y(1) * 4 END IF x = x + h NEXT lp% x = a: GOSUB EQUATION: s = s + y(1) x = b: GOSUB EQUATION: s = s + y(1) integral = -h / 3 * s xpi% = INT(astart * XN% + XC%) ypi% = INT((-integral) * YN% + YC%) LINE -(xpi%, ypi%), 14 LOCATE 60, 1 PRINT USING iformat$; astart; integral; PALETTE 7, RND * 64: 'flash the Calculating prompt a = a + XI IF INKEY$ <> "" THEN STOP LOOP WHILE a < (XC% / XN%): '--------------------------------------------- END er: y(1) = 0 RESUME NEXT EQUATION: 'WARNING: you MUST set b=1 by definition, to get correct graph for LOGs. y(1) = 1 / (1 + x ^ 2) ' take the integral of this function (for x>0) y(2) = ATN(x) ' analytic solution+C (0 if don't know) ' If we're lucky, this is zero, and ' the yellow and blue lines will overlap. 'y(1) = 2 * x / (1 + x ^ 4) 'y(2) = ATN(x ^ 2) RETURN DEFINT A-Z SUB GRID (XC%, YC%, XS%, YS%, XN%, YN%) STATIC SCREEN 12: CLS : COLOR 15 WIDTH 80, 60: LOCATE 1, 1 PRINT "Basic Integral Grapher v1.0" PRINT "uses Simpson's Rule for fast calc" PRINT "by Toshihiro Horie 11/13/95" PRINT "Internal revision: 11/25/95" LOCATE 1, 58: PRINT "Today's date:"; DATE$ LOCATE 24, 4: PRINT "Scale: 1 unit= 1" LINE (XC, 0)-(XC, YS), 15: LINE (0, YC)-(XS, YC), 15: REM Center CN = -1 FOR X1 = XC TO XS STEP XN CN = CN + 1: IF CN MOD 5 = 0 THEN CL = 12 ELSE CL = 14 LINE (X1, YC)-(X1, YC + 3), CL LINE (X1 + 1, YC)-(X1 + 1, YC + 3), CL NEXT X1 CN = -1 FOR X1 = XC TO 0 STEP -XN CN = CN + 1: IF CN MOD 5 = 0 THEN CL = 12 ELSE CL = 14 LINE (X1, YC)-(X1, YC + 3), CL LINE (X1 + 1, YC)-(X1 + 1, YC + 3), CL NEXT X1 CN = -1 FOR Y1 = YC TO YS STEP YN CN = CN + 1: IF CN MOD 5 = 0 THEN CL = 12 ELSE CL = 14 LINE (XC, Y1)-(XC + 4, Y1), CL NEXT Y1 CN = -1 FOR Y1 = YC TO 0 STEP -YN CN = CN + 1: IF CN MOD 5 = 0 THEN CL = 12 ELSE CL = 14 LINE (XC, Y1)-(XC + 4, Y1), CL NEXT Y1 END SUB