|
|
|
|
||
|
DEFINITION MODULE LgMatInv; (******************************************************************* Module LgMatInv (Version 1.0) Copyright (c) 1995-2006 by Dimitrios Gyalistras and ETH Zurich. Purpose Compute the inverse of a double precision matrix and solve a linear equation system (large matrices, more than 4k x 4k elements). Remarks Algorithms taken from W.H. Press et.al., Numerical Recipes, Cambridge 1988, ISBN 0521 30811 9, p31-38 (LU Decomposition). This module is part of the package LgMatrices. Programming o Design Dimitrios Gyalistras 11/05/1995 o Implementation Dimitrios Gyalistras 11/05/1995 ETH Zurich Systems Ecology CHN E 35.1 Universitaetstrasse 16 8092 Zurich SWITZERLAND URLs: <mailto:RAMSES@env.ethz.ch> <http://www.sysecol.ethz.ch> <http://www.sysecol.ethz.ch/SimSoftware/RAMSES> Last revision of definition: 24/05/2002 AF *******************************************************************) IMPORT Errors; FROM LgMatrices IMPORT LMatrix, LVector; (******************************************************************) CONST (* result codes returned *) allOk = Errors.allOk; notDone = Errors.onlyAnInsert; (* Note: the dimensions of all LVector and LMatrix objects used below are determined automatically via procedures LgMatrices.NElems, LgMatrices.NRows and LgMatrices.NCols. *) PROCEDURE InvertMatrix( mat : LMatrix; inv : LMatrix; (* out *) VAR resCode : INTEGER; VAR errTxt : ARRAY OF CHAR ); (* Computes the inverse matrix "inv" of matrix "mat" based on the LU Decomposition of "mat". The procedure leaves "mat" untouched (unless the same variable is also passed as "inv"). The procedure tests (1) whether "mat" is singular, and (2) whether | mat[i,j]*inv[i,j] - one[i,j] | <= tol (for all i,j), where "one" is the identity matrix, and "tol" is the currently set absolute tolerance. Returns FALSE and a corresponding error message in "errTxt" if one of these conditions is not met. *) PROCEDURE SolveLinEqu( A : LMatrix; b : LVector; x : LVector; (* out *) VAR resCode : INTEGER; VAR errTxt : ARRAY OF CHAR ); (* Computes the solution "x" of the matrix equation "A x = b". The procedure leaves "A" and "b" untouched (unless the same variable is also passed as "x"). The procedure tests (1) whether "mat" is singular, and (2) whether | (A*x)[i] - b[i] | <= tol (for all i), where "tol" is the currently set absolute tolerance. Returns FALSE and a corresponding error message in "errTxt" if one of these conditions is not met. *) PROCEDURE GetMatInvertTolerance( VAR tol: LONGREAL ); PROCEDURE SetMatInvertTolerance( tol: LONGREAL ); (* Absolute tolerance for testing the inverse of a matrix or the solution of a linear system. Default value is 1.0E-12. *) END LgMatInv.
|
||
|
|
|