DEFINITION MODULE Integral;

  (*------------------------------------------------------------------------*)
  (* Stell einige Routinen zur numerischen Integration zur Verfuegung.      *)
  (* Module providing procedures for numerical integration.                 *)
  (*------------------------------------------------------------------------*)
  (* Implementation : Michael Riedl                                         *)
  (* Licence        : GNU Lesser General Public License (LGPL)              *)
  (*------------------------------------------------------------------------*)

  (* $Id: Integral.def,v 1.4 2018/03/02 10:48:13 mriedl Exp mriedl $ *)

FROM LMathLib IMPORT Funktion1;

PROCEDURE InitGaussInt(Nst : CARDINAL);

          (*----------------------------------------------------------------*)
          (* Initialisiert die St"utzstellen und Gewichte der Gauss-        *)
          (* integration, mu\3 vor dem ersten Aufruf von GaussInt           *)
          (* gerufen werden !                                               *)
          (* Der Parameter Nst gibt an, mit welcher St"utzstellenanzahl     *)
          (* gearbeitet werden soll.                                        *)
          (* Lit : H.R.Schwarz 'Numerische Mathematik',                     *)
          (*       B.G.Teubner 1988, 2.Auflage, S.353 ffg.                  *)
          (*----------------------------------------------------------------*)

PROCEDURE GaussInt(Untergr,Obergr : LONGREAL;
                   N              : CARDINAL;
                   Funk           : Funktion1) : LONGREAL;

          (*----------------------------------------------------------------*)
          (* Berechent das Integral der Funktion Funk(x) im Intervall       *)
          (* UnterGr..OberGr nach dem Gauss-Algorithmus.                    *)
          (*                                                                *)
          (*   Untergr    : Beginn des Integrationsbereichs                 *)
          (*   Obergr     : Ende   des Integrationsbereichs                 *)
          (*   N          : Anzahl der Intervalle im Integrationsbereich    *)
          (*   Funk       : Funktion, "uber die integriert wird             *)
          (*                                                                *)
          (* GaussInt mu\3 vor dem ersten Aufruf mit InitGaussInt           *)
          (* initialisiert werden, ansonsten wird standartm"a\3ig mit einer *)
          (* Zweipunkteformel gerechnet.                                    *)
          (*----------------------------------------------------------------*)

PROCEDURE GaussIntKonst(Untergr,Obergr : LONGREAL;
                        N              : CARDINAL;
                        NSt            : CARDINAL;
                        Funk           : Funktion1) : LONGREAL;

          (*----------------------------------------------------------------*)
          (* Berechent das Integral der Funktion Funk(x) im Intervall       *)
          (* UnterGr..OberGr nach dem Gauss-Algorithmus.                    *)
          (*                                                                *)
          (*   Untergr    : Beginn des Integrationsbereichs                 *)
          (*   Obergr     : Ende   des Integrationsbereichs                 *)
          (*   N          : Anzahl der Intervalle im Integrationsbereich    *)
          (*   NSt        : Anzahl der St"utzstellen                        *)
          (*   Funk       : Funktion, "uber die integriert wird             *)
          (*----------------------------------------------------------------*)

PROCEDURE SimpInt(Untergr,Obergr : LONGREAL;
                  genau          : LONGREAL;
                  MaxIter        : CARDINAL;
              VAR Iter           : CARDINAL;
                  Funk           : Funktion1) : LONGREAL;

          (*----------------------------------------------------------------*)
          (* Berechent das Integral der Funktion Funk(x) im Intervall       *)
          (* UnterGr..OberGr nach dem Simpson -Algorithmus.                 *)
          (*                                                                *)
          (*   Untergr    : Beginn des Integrationsbereichs                 *)
          (*   Obergr     : Ende   des Integrationsbereichs                 *)
          (*   genau      : Anzahl der Intervalle im Integrationsbereich    *)
          (*   MaxIter    : Maximale Anzahl der Simpson-Iterartionen        *)
          (*   Iter       : Anzahl der durchgefuehrten Iterationen          *)
          (*   Funk       : Funktion, "uber die integriert wird             *)
          (*----------------------------------------------------------------*)

PROCEDURE Romberg(UnterGr  : LONGREAL;
                  OberGr   : LONGREAL;
                  genau    : LONGREAL;
                  MaxIter  : CARDINAL;
              VAR Iter     : CARDINAL;
                  Funk     : Funktion1) : LONGREAL;

          (*----------------------------------------------------------------*)
          (* Berechent das Integral der Funktion Funk(x) im Intervall       *)
          (* UnterGr..OberGr nach dem Romberg-Algorithmus.                  *)
          (*                                                                *)
          (*   Untergr    : Beginn des Integrationsbereichs                 *)
          (*   Obergr     : Ende   des Integrationsbereichs                 *)
          (*   genau      : Anzahl der Intervalle im Integrationsbereich    *)
          (*   MaxIter    : Maximale Anzahl der Simpson-Iterartionen        *)
          (*   Iter       : Anzahl der durchgefuehrten Iterationen          *)
          (*   Funk       : Funktion, "uber die integriert wird             *)
          (*                                                                *)
          (* Wenn Iter > MaxIter, wird die globale Variable Fehler auf      *)
          (* TRUE gesetzt und Fehlerflag entsprechend gesetzt.              *)
          (*----------------------------------------------------------------*)

PROCEDURE Quadrature(Untergr,Obergr : LONGREAL;
                     eps            : LONGREAL; (* Geforderte Genauigkeit *)
                 VAR err            : LONGREAL; (* Fehlerabsch"atzung     *)
                     Funkt          : Funktion1) : LONGREAL;

          (*----------------------------------------------------------------*)
          (* Modula-Implementation des Algol-Algorithmus der modifizierten  *)
          (* Romberg-Integration nach Bulirsch/Stoer.                       *)
          (*                                                                *)
          (*   Untergr    : Beginn des Integrationsbereichs                 *)
          (*   Obergr     : Ende   des Integrationsbereichs                 *)
          (*   eps        : Geforderte Genauigkeit der Integration          *)
          (*   err        : Fehlerabschaetzung                              *)
          (*   Funk       : Funktion, "uber die integriert wird             *)
          (*                                                                *)
          (* Lit : Num.Math. 9, 1967, 271-278                               *)
          (*----------------------------------------------------------------*)

PROCEDURE NumInt(VAR X,Y : ARRAY OF LONGREAL;
                     N   : CARDINAL)          : LONGREAL;

          (*----------------------------------------------------------------*)
          (* Berechnet das Integral einer in Form von N Datenpunkten        *)
          (* X[i],Y[i] gegebenen Funktion (z.B. Me\3punkte) nach der        *)
          (* Trapetzregel.                                                  *)
          (*----------------------------------------------------------------*)

PROCEDURE Simson(VAR Y : ARRAY OF LONGREAL;
                     H : LONGREAL;
                     N : CARDINAL) : LONGREAL;

          (*----------------------------------------------------------------*)
          (* Berechnet das Integral einer in Form von N Datenpunkten        *)
          (* Y[i] gegebenen Funktion mit Schrittweite H nach dem Simpson    *)
          (* Algorithmus.                                                   *)
          (*----------------------------------------------------------------*)

PROCEDURE SimCum(VAR Y    : ARRAY OF LONGREAL;
                     H    : LONGREAL;
                     N    : CARDINAL) : LONGREAL;

          (*----------------------------------------------------------------*)
          (* A modified simpsons rule and fortran subroutine for            *)
          (* cumulative numerical integration of a function defined by      *)
          (* data points.                                                   *)
          (*                                                                *)
          (*   Y : Function / measurement values                            *)
          (*   H : Stepwidth of Mantissa (data point need to have equal     *)
          (*       distances)                                               *)
          (*   N : Number of data points                                    *)
          (*                                                                *)
          (* Blake, L. V.; Naval Research Laboratory (1971)                 *)
          (*----------------------------------------------------------------*)

END Integral.
