DEFINITION MODULE Differ;

  (*------------------------------------------------------------------------*)
  (* Modul zur Berechnung von numerischen Gradienten                        *)
  (* Module for calculation of numerical gradients                          *)
  (*------------------------------------------------------------------------*)
  (* Implementation : Michael Riedl                                         *)
  (* Licence        : GNU Lesser General Public License (LGPL)              *)
  (*------------------------------------------------------------------------*)

  (* $Id: Differ.def,v 1.2 2016/10/04 07:52:09 mriedl Exp mriedl $ *)

FROM LMathLib IMPORT Funktion1;

PROCEDURE Ableit1p5(VAR Y  : ARRAY OF LONGREAL; (*  ==> Funktionswerte  *)
                    VAR dY : ARRAY OF LONGREAL; (* <==  Erste Ableitung *)
                        dH : LONGREAL;          (* Schrittweite         *)
                        n  : CARDINAL);         (* Anzahl Datenpunkte   *)

          (*-----------------------------------------------------------------*)
          (* Berechnet in dY die gen"aherte erste Ableitung einer in Y als   *)
          (* Werte vorgegebenen Funktion nach einer f"unf - Punkte - Formel. *)
          (* Die Randwerte werden nach anderen, schlechteren Formeln be-     *)
          (* rechnet. Die Funktion mu\3 dabei mit der Schrittweite dH ausge- *)
          (* wertet worden sein.                                             *)
          (* Die globale Variable Errors.Fehler wird auf TRUE gesetzt, wenn  *)
          (* (n < 3) oder (dH <= 0.0).                                       *)
          (* Lit.: Bronstein-Semendjajew, Taschenbuch der Mathematik. (768)  *)
          (*-----------------------------------------------------------------*)

PROCEDURE Ableit1p7(VAR Y   : ARRAY OF LONGREAL; (*  ==> Funktionswerte  *)
                    VAR dY1 : ARRAY OF LONGREAL; (* <==  Erste Ableitung *)
                        dH  : LONGREAL;          (* Schrittweite         *)
                        N   : CARDINAL);         (* Anzahl Datenpunkte   *)

          (*-----------------------------------------------------------------*)
          (* Berechnet in dY die gen"aherte erste Ableitung einer in Y als   *)
          (* Werte vorgegebenen Funktion nach einer sieben  Punkte - Formel. *)
          (* Die Randwerte werden nach anderen, schlechteren Formeln be-     *)
          (* rechnet. Die Funktion mu\3 dabei mit der Schrittweite dH ausge- *)
          (* wertet worden sein.                                             *)
          (* Die globale Variable Errors.Fehler wird auf TRUE gesetzt, wenn  *)
          (* (n < 7) oder (dH <= 0.0).                                       *)
          (* Lit.: Bronstein-Semendjajew, Taschenbuch der Mathematik. (768)  *)
          (*-----------------------------------------------------------------*)

PROCEDURE Ableit2p5(VAR Y   : ARRAY OF LONGREAL; (*  ==> Funktionswerte   *)
                    VAR dY1 : ARRAY OF LONGREAL; (* <==  Erste  Ableitung *)
                        dH  : LONGREAL;          (* Schrittweite          *)
                        n   : CARDINAL);         (* Anzahl Datenpunkte    *)

          (*----------------------------------------------------------------*)
          (*  Berechnet die zweite Ableitug der in Y gespeicherten          *)
          (*  Funktionswerte, mit Y[i]:=f(X[i]), nach einer 5-Punkte-       *)
          (*  methode, wobei Randwerte anders ( schlechter !) berechnet     *)
          (*  werden.                                                       *)
          (*  Die X_i M"USSEN equvidistant liegen !                         *)
          (*  n > 5 notwendig, ansonsten Fehlermeldung !                    *)
          (*  dY2 : 2. Ableitungen an den Stellen X_i                       *)
          (*----------------------------------------------------------------*)

PROCEDURE Ableit2p7(VAR Y   : ARRAY OF LONGREAL; (*  ==> Funktionswerte   *)
                    VAR dY2 : ARRAY OF LONGREAL; (* <==  Zweite Ableitung *)
                        dH  : LONGREAL;          (* Schrittweite          *)
                        n   : CARDINAL);         (* Anzahl Datenpunkte    *)

          (*----------------------------------------------------------------*)
          (*  Berechnet die zweite Ableitug der in Y gespeicherten          *)
          (*  Funktionswerte, mit Y[i]:=f(X[i]), nach einer 7-Punkte-       *)
          (*  methode, wobei Randwerte anders ( schlechter !) berechnet     *)
          (*  werden.                                                       *)
          (*  Die X_i M"USSEN equvidistant liegen !                         *)
          (*  n   > 7 notwendig, ansonsten Fehlermeldung !                  *)
          (*  dY2 : 2. Ableitungen an den Stellen X_i                       *)
          (*----------------------------------------------------------------*)

PROCEDURE AbleitN(VAR X,Y   : ARRAY OF LONGREAL;
                  VAR dY    : ARRAY OF LONGREAL; 
                      ndata : CARDINAL;
                      Grad  : CARDINAL;
                      NAbl  : CARDINAL);

          (*----------------------------------------------------------------*)
          (* Berechnet die n. Ableitung der in X,Y "ubergabenen Daten       *)
          (*                                                                *)
          (*  ==> X,Y   : Daten.                                            *)
          (* <==  dY    : 1. Ableitung von Y an den Stellen X_i .           *)
          (*  ==> ndata : Anzahl der Datenpunkte in X,Y.                    *)
          (*  ==> Grad  : Anzahl der gew"unschten St"utzstellen.            *)
          (*  ==> NAbl  : Ordnung der gew"unschten Ableitung.               *)
          (*                                                                *)
          (* Die X_i m"ussen nicht equvidistant liegen, wie es bei den      *)
          (* anderen Ableitungsprozeduren der Fall ist. Allerdings mu\3     *)
          (* Grad mindestens NAbl + 1 und die Anzahl der Datenpunkte mu\3   *)
          (* mindestens Grad + 2 betragen.                                  *)
          (*----------------------------------------------------------------*)

PROCEDURE Ableit1und2(    X     : LONGREAL;
                          H     : LONGREAL;
                          Funk  : Funktion1;
                      VAR Y1,Y2 : LONGREAL);

          (*----------------------------------------------------------------*)
          (* Berechnet die 1. und die 2. Ableitung f"ur eine Funktion Funk  *)
          (* nach dem Zweipunkt- bzw. Dreipunkt-Verfahren.                  *)
          (*   X  : Argumentwert der Funktion F, an dem die Ableitungen     *)
          (*        berechnet werden                                        *)
          (*   H  : Schrittweite                                            *)
          (*   Y1 : Numerisch bestimmte 1. Ableitung von F an der Stelle X  *)
          (*   Y2 : Numerisch bestimmte 2. Ableitung von F an der Stelle X  *)
          (*----------------------------------------------------------------*)

END Differ.
