'===========================================================================
' Subject: GRAPH INTEGRALS                    Date: 11-13-95 (00:00)       
'  Author: Toshihiro Horie                    Code: QB, QBasic, PDS        
'  Origin: www.ocf.berkeley.edu/~horie      Packet: ALGOR.ABC
'===========================================================================
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

