|
|
|
|
||
|
DEFINITION MODULE EigVecs; (******************************************************************* Module EigVecs (Version 1.0) Copyright (c) 1992-2006 by Dimitrios Gyalistras and ETH Zurich. Purpose Calculate eigenvalues and eigenvectors of a real symmetric matrix. Remarks Algorithms taken from W.H. Press et.al., Numerical Recipes, Cambridge 1988, ISBN 0521 30811 9, p 335ff. and pp748-750. Programming o Design Dimitrios Gyalistras 03/04/1992 o Implementation Dimitrios Gyalistras 03/04/1992 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 Jacobi( mat : LMatrix; (* in *) eigVals : LVector; (* out *) eigVecs : LMatrix; (* out *) VAR numRot : INTEGER; VAR resCode : INTEGER; VAR errTxt : ARRAY OF CHAR ); (* Calculates all eigenvectors and eigenvalues of the real and symmetric N x N -matrix contained in mat, eigVals returns in its first N elements the eigen- values of mat. eigVecs is a N x N -matrix returning the normalized eigenvectors of mat (sum of squares of vector elements = 1). numRot returns the number of jacobi rotations which were required. IMPORTANT IMPLEMENTATION RESTRICTIONS: 1) A non-symmetrical matrix mat is quietly accepted without generating an error message. However, all returned results are WRONG!!!!! 2) After calling this procedure, all elements of mat above the diagonal will have been overwritten with 0! *) PROCEDURE EigSort( eigVals : LVector; (* in/out *) eigVecs : LMatrix; (* in/out *) VAR resCode : INTEGER; VAR errTxt : ARRAY OF CHAR ); (* Given N eigenvalues in vector eigVals and the N x N -matrix eigVecs containing the corresponding eigenvectors (as obtained both from procedure Jacobi), this routine sorts the eigenvalues in descending order. The columns of the eigVecs-matrix are rearranged correspondingly. The method used is straight insertion. *) END EigVecs.
|
||
|
|
|