NUMAL Section 4.2.1.B

BEGIN SECTION : 4.2.1.B (July, 1974)

AUTHOR: H.N.GLORIE.

CONTRIBUTOR: H.FIOLET.

INSTITUTE: MATHEMATICAL CENTRE.

RECEIVED: 730606.

BRIEF DESCRIPTION:

    INTEGRAL  CALCULATES  THE DEFINITE INTEGRAL OF A  FUNCTION  OF  ONE
    VARIABLE, OVER  A  FINITE OR INFINITE INTERVAL OR OVER A NUMBER  OF
    CONSECUTIVE INTERVALS.

KEYWORDS:

    DEFINITE INTEGRAL,
    INFINITE INTERVAL,
    SIMPSON RULE,
    RICHARDSON CORRECTION.

CALLING SEQUENCE:

    THE HEADING OF THE PROCEDURE READS:
    "REAL" "PROCEDURE" INTEGRAL(X,A,B,FX,E,UA,UB);
    "VALUE" A,B;"REAL" X,A,B,FX;"ARRAY" E;"BOOLEAN" UA,UB;
    "CODE" 32051;

    INTEGRAL:

        DELIVERS THE  COMPUTED  VALUE  OF THE DEFINITE INTEGRAL OF  THE
        FUNCTION  FROM A TO B; AFTER SUCCESSIVE CALLS OF THE PROCEDURE,
        THE  INTEGRAL  OVER  THE TOTAL INTERVAL IS  DELIVERED, I.E. THE
        VALUE  OF  A IN  THE LAST CALL WITH UA="TRUE" IS  THE
        STARTING POINT OF THE INTERVAL.

    THE MEANING OF THE FORMAL PARAMETERS IS:
    X:      <VARIABLE>;
            INTEGRATION VARIABLE; X IS USED AS JENSEN-PARAMETER
            FOR  FX.
    A,B:    <ARITHMETIC EXPRESSION>;
            THE INTERVAL OF INTEGRATION IS EITHER (A,B) OR
            (A,INFINITY) (SEE PARAMETER UB); B<A IS ALLOWED;
    FX:     <ARITHMETIC EXPRESSION>;
            THE INTEGRAND F(X);
    E:      <ARRAY IDENTIFIER>;
            "ARRAY" E[1:6];
            ENTRY : E[1]:THE RELATIVE ACCURACY REQUIRED;
                    E[2]:THE ABSOLUTE ACCURACY REQUIRED;
                    E[5]:ALTERNATIVE STARTING POINT (SEE PAR. UA);
            EXIT:   E[3]:THE NUMBER OF SKIPPED INTEGRATION STEPS;
                    E[4]:THE VALUE OF THE INTEGRAL FROM A TO B;
                    E[5]:"IF" UB "THEN" B "ELSE" 0;
                    E[6]:"IF" UB "THEN" F(B) "ELSE" 0;
    UA:     <BOOLEAN EXPRESSION>;
            DETERMINES THE STARTING POINT OF THE INTEGRATION;
            STARTING POINT:="IF" UA "THEN" A "ELSE" E[5];
    UB:     <BOOLEAN EXPRESSION>;
            DETERMINES THE FINAL POINT OF THE INTEGRATION;
            FINAL POINT:="IF" UB "THEN" B "ELSE"
                      "IF" B>A "THEN" +INFINITY "ELSE" -INFINITY;
            IN  THE  CASE UB="FALSE" , THE VALUE OF B IS STILL RELEVANT
            (SEE METHOD AND PERFORMANCE).

PROCEDURES USED: NONE.

REQUIRED CENTRAL MEMORY:

    EXECUTION FIELD LENGTH: CIRCA 16 + 5 * RECURSION LEVEL.

RUNNING TIME: DEPENDS STRONGLY UPON THE INTEGRAL TO BE COMPUTED.

LANGUAGE: ALGOL 60.

METHOD AND PERFORMANCE:

    INTEGRAL USES THE  SUBPROCEDURE  QAD  FOR THE  CALCULATION  OF  THE
    DEFINITE INTEGRAL OVER A  FINITE INTERVAL. THIS IS DONE BY MEANS OF
    SIMPSON 'S RULE WITH RICHARDSON CORRECTION.IF THE FOURTH DERIVATIVE
    IS TOO LARGE (AND THUS THE CORRECTION TERM) , THE TOTAL INTERVAL IS
    SPLIT INTO TWO EQUAL PARTS AND  THE  INTEGRATION PROCESS IS INVOKED
    RECURSIVELY. THIS IS DONE IN  SUCH A  WAY  THAT THE TOTAL AMOUNT OF
    RICHARDSON  CORRECTIONS  IS  SLIGHTLY SMALLER  THAN  OR  EQUAL  TO
      E[1] * ABS ( THE INTEGRAL FROM A TO B OF (FX) ) + E[2].
    THE INTEGRATION OVER AN INFINITE INTERVAL REQUIRES TWO CALLS OF THE
    PROCEDURE QAD. IN THE FIRST CALL QAD COMPUTES THE DEFINITE INTEGRAL
    FROM  A  TO  B .  IN  THE  INTERVAL  FROM  B  TO  + OR -  INFINITY
    THE   INTEGRAND  IS  TRANSFORMED  BY   MEANS  OF  THE  SUBSTITUTION
    Z=1/(X+1-B) TO THE DEFINITE INTEGRAL OF F(B-1+1/Z)/Z**2 FROM  0  TO
    1. FOR  THE  INTEGRATION  OF  A  DEFINITE  INTEGRAL  OVER A  FINITE
    INTERVAL  THE  USE OF  QADRAT IS RECOMMENDED ,ESPECIALLY  WHEN HIGH
    ACCURACY IS REQUIRED.

REFERENCES:

    [1] T.J.DEKKER AND C.J.ROOTHART.
        INTRODUCTION TO NUMERICAL ANALYSIS.(DUTCH)
        MATH.CENTR. REPORT CR 24/71, AMSTERDAM.
    [2] C.J.ROOTHART AND H.FIOLET.
        QUADRATURE PROCEDURES.
        MATH.CENTR. REPORT MR 137/72, AMSTERDAM.

EXAMPLE OF USE:

    "BEGIN"
        "ARRAY" E[1:6];"REAL" A,B,X;"BOOLEAN" UA,UB;
        UA:="TRUE";E[1]:=E[2]:="-14;
        "FOR" B:=2,4,20,100 "DO"
        "BEGIN" UB:=B<50;
            A:=INTEGRAL(X,-1,-B,10/X**2,E,UA,UB);
            OUTPUT(61,"("N,B+DDB,N,2(B+DDDB),/")",
                   A,E[3],E[4],E[5],E[6]);
            UA:="FALSE"
        "END"
    "END"

    DELIVERS:
    -4.9999999999999"+000   +00 -4.9999999999999   -002  +003
    -7.4999999999998"+000   +00 -7.4999999999998   -004  +001
    -9.5000000000000"+000   +00 -9.5000000000000   -020  +000
    -9.9999999999998"+000   +01 -9.9999999999998   +000  +000   .

SOURCE TEXT(S):
"CODE" 32051;