--- a/LinLib.def
+++ b/LinLib.def
@@ -8,9 +8,9 @@
(* Licence : GNU Lesser General Public License (LGPL) *)
(*------------------------------------------------------------------------*)
- (* $Id: LinLib.def,v 1.2 2017/10/04 07:02:51 mriedl Exp mriedl $ *)
-
-FROM Deklera IMPORT VEKTOR,MATRIX,CARDVEKTOR,CVEKTOR,CMATRIX,PMATRIX;
+ (* $Id: LinLib.def,v 1.11 2018/08/31 14:14:46 mriedl Exp mriedl $ *)
+
+FROM Deklera IMPORT PMATRIX;
PROCEDURE CondHager(VAR A : ARRAY OF ARRAY OF LONGREAL;
N : INTEGER;
@@ -31,10 +31,10 @@
(* In case iFehl # 0 Cond is MAX(LONGREAL) *)
(*-----------------------------------------------------------------*)
-PROCEDURE Zerlege(VAR A : MATRIX; (* Koeffizientenmatrix *)
- VAR IndexI : CARDVEKTOR;
- VAR IndexJ : CARDVEKTOR;
- VAR RPivot : VEKTOR;
+PROCEDURE Zerlege(VAR A : ARRAY OF ARRAY OF LONGREAL;
+ VAR IndexI : ARRAY OF CARDINAL;
+ VAR IndexJ : ARRAY OF CARDINAL;
+ VAR RPivot : ARRAY OF LONGREAL;
VAR Det : LONGREAL; (* Determinante der Matrix *)
dim : CARDINAL; (* Dimension der qadr. Matrix *)
MaxPivot : BOOLEAN); (* w=Totalpivot, f=Zeilenpivot *)
@@ -48,23 +48,30 @@
(* Fehler auf TRUE gesetzt. *)
(*----------------------------------------------------------------*)
-PROCEDURE BerechneLoesung(VAR A : MATRIX;
- VAR X : VEKTOR;
- C : VEKTOR;
- VAR RPivot : VEKTOR;
- VAR IndexI : CARDVEKTOR;
- VAR IndexJ : CARDVEKTOR;
+PROCEDURE BerechneLoesung(VAR A : ARRAY OF ARRAY OF LONGREAL;
+ VAR X : ARRAY OF LONGREAL;
+ C : ARRAY OF LONGREAL;
+ VAR RPivot : ARRAY OF LONGREAL;
+ VAR IndexI : ARRAY OF CARDINAL;
+ VAR IndexJ : ARRAY OF CARDINAL;
dim : CARDINAL);
(*----------------------------------------------------------------*)
(* Berechnet den L\"osungsvektor X der Gleichung A X = C mit der *)
(* in der Zerlege nach Gauss zerlegten Matrix A *)
- (* IndexI : Zeilenvertauschungsinformationen. *)
- (* IndexJ : Spaltenvertauschungsinformationen. IndexJ_k = k wenn *)
- (* nur Zeilenpivot. *)
- (*----------------------------------------------------------------*)
-
-PROCEDURE Det(VAR A : MATRIX; dim : CARDINAL) : LONGREAL;
+ (* *)
+ (* A : Koeffizientenmatrix *)
+ (* X : Gesuchte Loesung des Gleichungssystems *)
+ (* C : Konstantenvektor, rechte Seite d. Gleichungssystems *)
+ (* RPivot : Reziproke Pivotelemente wie von Zerlege berechnet *)
+ (* IndexI : Zeilenvertauschungsinformationen. *)
+ (* IndexJ : Spaltenvertauschungsinformationen. IndexJ_k = k *)
+ (* wenn nur Zeilenpivot. *)
+ (* dim : Dimension der qadr. Matrix A *)
+ (*----------------------------------------------------------------*)
+
+PROCEDURE Det(VAR A : ARRAY OF ARRAY OF LONGREAL;
+ dim : CARDINAL) : LONGREAL;
(*----------------------------------------------------------------*)
(* Berechnet die Determinante von A, wobei die Koeffizienten- *)
@@ -73,9 +80,9 @@
(* die globale Variable Fehler auf TRUE gesetzt. *)
(*----------------------------------------------------------------*)
-PROCEDURE Gauss(VAR A : MATRIX; (* Koeffizientenmatrix *)
- VAR X : VEKTOR; (* L\"osungsvektor des LG *)
- C : VEKTOR; (* Konstantenvektor des LG *)
+PROCEDURE Gauss(VAR A : ARRAY OF ARRAY OF LONGREAL;
+ VAR X : ARRAY OF LONGREAL;
+ C : ARRAY OF LONGREAL;
dim : CARDINAL;
VAR Det : LONGREAL; (* Determinante von A *)
MaxIter : CARDINAL;
@@ -93,14 +100,24 @@
(* nachiteriert. *)
(* Wenn die Matrix singul\"ar oder sonstwie nicht l\"osbar ist, *)
(* wird die globale Variable Fehler auf TRUE gesetzt. *)
- (* iFehl = 0 : kein Fehler aufgetreten. *)
- (* 1 : Koeffizentenmatrix zerst\"ort (kein Nachiterieren) *)
- (* 2 : Iteration nicht konvergent. *)
- (* 3 : Koeffizentenmatix singul\"ar. *)
- (* 4 : Dimension der Matrix < 1 *)
- (*----------------------------------------------------------------*)
-
-PROCEDURE Householder(VAR A : MATRIX;
+ (* *)
+ (* A : Koeffizientenmatrix *)
+ (* X : L\"osungsvektor des LG *)
+ (* C : Konstantenvektor des LG *)
+ (* dim : Dimension von A *)
+ (* Det : Determinante von A *)
+ (* MaxIter : Maximalzahl der Nachiterationen *)
+ (* PivStrat : Pivotstrategie *)
+ (* iFehl : Fehlernummer *)
+ (* 0 : kein Fehler aufgetreten. *)
+ (* 1 : Koeffizentenmatrix zerst\"ort *)
+ (* (kein Nachiterieren moeglich) *)
+ (* 2 : Iteration nicht konvergent. *)
+ (* 3 : Koeffizentenmatix singul\"ar. *)
+ (* 4 : Dimension der Matrix < 1 *)
+ (*----------------------------------------------------------------*)
+
+PROCEDURE Householder(VAR A : ARRAY OF ARRAY OF LONGREAL;
VAR X : ARRAY OF LONGREAL;
C : ARRAY OF LONGREAL;
n : CARDINAL; (* Anzahl der Gleichungen, n >= m *)
@@ -194,9 +211,9 @@
(* Bauer/Reinsch, pp. 47 im "Handbuch", Alogol60 routine gidef2 *)
(*----------------------------------------------------------------*)
-PROCEDURE Jacobi(VAR A : MATRIX; (* <== *)
- VAR X : VEKTOR; (* <==> *)
- VAR C : ARRAY OF LONGREAL; (* <== *)
+PROCEDURE Jacobi(VAR A : ARRAY OF ARRAY OF LONGREAL; (* <== *)
+ VAR X : ARRAY OF LONGREAL; (* <==> *)
+ VAR C : ARRAY OF LONGREAL; (* <== *)
dim : CARDINAL;
Tol : LONGREAL;
Neu : CARDINAL;
@@ -239,37 +256,62 @@
(* F"ur alle Fehlercodes gr"o\3er 3 wurde kein L"osung gefunden. *)
(*----------------------------------------------------------------*)
-PROCEDURE GaussSeidel(VAR A : MATRIX; (* Koeffizinten - Matrix *)
- VAR X : VEKTOR; (* L\"osungsvektor *)
- VAR C : VEKTOR;
+PROCEDURE GaussSeidel(VAR A : ARRAY OF ARRAY OF LONGREAL;
+ VAR X : ARRAY OF LONGREAL;
+ VAR C : ARRAY OF LONGREAL;
dim : CARDINAL;
- genau : LONGREAL; (* Abbruchkriterium *)
+ genau : LONGREAL;
MaxIter : CARDINAL;
Neu : CARDINAL;
- FehlMeld : BOOLEAN; (* Fehlermeldungen j/n 1/0 *)
+ FehlMeld : BOOLEAN;
VAR Iter : CARDINAL;
VAR iFehl : INTEGER);
(*----------------------------------------------------------------*)
+ (* Solves the (diagonal dominant) linear system of equations *)
+ (* A x X = C by the (iterativ) Gauss - Seidel Algorithm. *)
+ (* (E - L)x^{k+1} = C + Ux^k mit A = E-U-L. *)
+ (* *)
(* L\"o\3t das (diagonal dominante) lineare Gleichungssystem *)
- (* A X = C nach dem (iterativen) Gauss - Seidel Algorithmus. *)
+ (* A x X = C nach dem (iterativen) Gauss - Seidel Algorithmus. *)
(* (E - L)x^{k+1} = C + Ux^k mit A = E-U-L. *)
- (* Neu = *)
+ (* *)
+ (* A : Koeffizinten - Matrix *)
+ (* X : L\"osungsvektor *)
+ (* C : Konstantenvektor *)
+ (* dim : Dimension der Koeffizientenmatrix *)
+ (* genau : Abbruchkriterium *)
+ (* MaxIter : Maximalzahl der Iterationen *)
+ (* Neu : s.u. *)
+ (* FehlMeld : Fehlermeldungen j/n 1/0 *)
+ (* Iter : Anzahl der benoetigten Iterationen *)
+ (* iFehl : s.u. *)
+ (* *)
+ (* Neu: *)
+ (* *)
(* 0 : Der Startvektor f\"ur X wird vorgegeben. *)
(* 1 : Der Startvektor f\"ur X wird neu berechnet. *)
- (* iFehl = *)
+ (* *)
+ (* iFehl: *)
+ (* *)
(* 0 : Es ist kein Fehler aufgetreten. *)
(* 1 : Es ist kein Fehler aufgetreten, die Matrix ist aber *)
(* nicht diagonal dominant. (h\"oherer Zeitaufwand) *)
(* 2 : MaxIter ist \"uberschritten *)
- (* 3 : Problem ist mit dieser Routine nicht l\"o\3bar. *)
- (* 6 : Ein Diagonalelement von A ist Null - es kann keine *)
+ (* 3 : Problem ist mit dieser Routine nicht l\"o\3bar da ein *)
+ (* Diagonalelement im Zuge der Berechnung zu klein geworden *)
+ (* ist *)
+ (* 4 : Die Matrix ist nicht diagonal dominant und die *)
+ (* Berechnung der Loesung divergiert *)
+ (* 6 : Ein Diagonalelement von A exakt Null - es kann keine *)
(* L"osung berechnet werden. *)
- (* In allen F\"allen, in denen FehlZahl > 0 werden auch die *)
- (* globalen Variablen Fehler und Fehlerflag entsprechend *)
- (* gesetzt. Wenn FehlZahl = 1 kann die Routine mit (Neu = 0) *)
- (* wieder gerufen werden. *)
- (* FehlMeld = *)
+ (* *)
+ (* In allen F\"allen, in denen iFehl > 0 werden auch die globalen *)
+ (* Variablen Fehler und Fehlerflag entsprechend gesetzt. Wenn *)
+ (* iFehl=1 kann die Routine mit (Neu = 0) wieder gerufen werden. *)
+ (* *)
+ (* FehlMeld: *)
+ (* *)
(* FALSE : Fehler werden nicht auf dem Bildschirm angezeigt. *)
(* TRUE : Alle Fehler werden auf dem Bildschirm angezeigt. *)
(* *)
@@ -321,6 +363,10 @@
VAR iFehl : INTEGER);
(*----------------------------------------------------------------*)
+ (* Calculates the solution of a linear system of equations *)
+ (* A x X = C with symmetric, positiv definite coefficien matrix *)
+ (* A stored in super linear form. *)
+ (* *)
(* Berechnet die L\"osung X eines linearen Gleichungsystem *)
(* A X = C mit symmetrischer, positiv definiten Koeffizienten - *)
(* matrix A in Superlinearform. *)
@@ -394,22 +440,28 @@
(* "Handbuch" routine cholsol1 *)
(*----------------------------------------------------------------*)
-PROCEDURE CZerlege(VAR A : CMATRIX; (* Koeffizientenmatrix *)
- VAR Index : CARDVEKTOR;
+PROCEDURE CZerlege(VAR A : ARRAY OF ARRAY OF LONGCOMPLEX;
+ VAR Index : ARRAY OF CARDINAL;
VAR Det : LONGCOMPLEX;
- VAR EDet : INTEGER; (* Det(A) = Det*2^EDet *)
- dim : CARDINAL); (* Dimension der qadr. Matrix *)
+ VAR EDet : INTEGER;
+ dim : CARDINAL);
(*----------------------------------------------------------------*)
(* Zerlegt die komplexe Matrix A. (LU = A) mit Zeilenpivotierung *)
(* Vertauschungen werden in Index angezeigt *)
(* Fehlermeldungen wenn A singul\"ar oder unl\"osbar. *)
- (*----------------------------------------------------------------*)
-
-PROCEDURE CBerechneLoesung(VAR A : CMATRIX;
- VAR X : CVEKTOR;
- C : CVEKTOR;
- Index : CARDVEKTOR;
+ (* *)
+ (* A : Koeffizientenmatrix *)
+ (* Index : Information ueber Vertauschungen durch Pivotierung *)
+ (* Det : Basis der Determinante von A *)
+ (* EDet : Det(A) = Det*2^EDet *)
+ (* dim : Dimension der qadr. Matrix A *)
+ (*----------------------------------------------------------------*)
+
+PROCEDURE CBerechneLoesung(VAR A : ARRAY OF ARRAY OF LONGCOMPLEX;
+ VAR X : ARRAY OF LONGCOMPLEX;
+ C : ARRAY OF LONGCOMPLEX;
+ VAR Index : ARRAY OF CARDINAL;
dim : CARDINAL);
(*----------------------------------------------------------------*)
@@ -418,7 +470,8 @@
(* Die Routine ist das komplexe Analogon zu BerechneLoesung. *)
(*----------------------------------------------------------------*)
-PROCEDURE CDet(dim : CARDINAL; VAR A : CMATRIX) : LONGCOMPLEX;
+PROCEDURE CDet( dim : CARDINAL;
+ VAR A : ARRAY OF ARRAY OF LONGCOMPLEX) : LONGCOMPLEX;
(*----------------------------------------------------------------*)
(* Berechnet die komplexe Determinante von A. *)
@@ -427,15 +480,15 @@
(* gesetzt und eine Fehlermeldung ausgeschrieben. *)
(*----------------------------------------------------------------*)
-PROCEDURE CLoeseGlSy(VAR A : CMATRIX;
- VAR X : CVEKTOR; (* L\"osungsvektor. *)
- C : CVEKTOR;
- VAR Det : LONGCOMPLEX; (* Determinte von A *)
- dim : CARDINAL;
- VAR iFehl : INTEGER);
-
- (*----------------------------------------------------------------*)
- (* Berechnet die L\"osung des komplexen Gleichngssystems Ax = c *)
+PROCEDURE CLoeseGlSy(VAR A : ARRAY OF ARRAY OF LONGCOMPLEX;
+ VAR X : ARRAY OF LONGCOMPLEX; (* L\"osungsvektor. *)
+ C : ARRAY OF LONGCOMPLEX;
+ VAR Det : LONGCOMPLEX; (* Determinte von A *)
+ dim : CARDINAL;
+ VAR iFehl : INTEGER);
+
+ (*----------------------------------------------------------------*)
+ (* Berechnet die Loesung des komplexen Gleichngssystems A x X = C *)
(* Wenn die Matrix singul\"ar oder sonstwie nicht l\"osbar *)
(* ist, wird dir globale Variable Fehler auf TRUE gesetzt. *)
(* *)