home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol131 / decompos.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1984-04-29  |  2.1 KB  |  63 lines

  1.  
  2. FUNCTION DECOMPOSE ( VAR MATRIX        : REAL_MATRIX;
  3.              VAR PVT_VECTOR    : INT_VECTOR;
  4.              N            : INTEGER    ) : BOOLEAN;
  5.  
  6. { BASED ON SUBROUTINE DECOMP BY CLEVE B. MOLER,DEPT. OF MATHEMATICS,
  7.   THE UNIVERSITY OF MICHIGAN,ANN ARBOR,MI 48104.
  8.  
  9.   REFERENCES : 1 : ALGORITHM 423 OF COLLECTED ALG. OF CACM.
  10.            2 : MOLER,C.B. Matrix Computations with Fortran and paging.
  11.                    Comm.ACM 15 (Apr.1972),268-270.
  12.                3 : FORSYTHE,G.E.;MALCOLM,M.A.;and MOLER,C.B. Computer 
  13.            Methods for Mathematical Computations.
  14.             Prentice-Hall,Inc. Englewood Cliffs,N.J.
  15.                     1977
  16.  
  17.   TRANSLATED TO PASCAL/Z BY G.M.ACLAND,UNIV. OF PENNSYLVANIA.               }
  18.  
  19. VAR    INDEX1,INDEX2,INDEX3,PIVOT,FIRST    : INTEGER;
  20.     BIGGEST,TEMP                : REAL;
  21.  
  22. BEGIN
  23.  DECOMPOSE := SUCCESSFUL;
  24.  FOR INDEX1 := 1 TO (N-1) DO BEGIN
  25.   BIGGEST := 0.0;
  26.   FOR INDEX2 := INDEX1 TO N DO BEGIN
  27.    IF (ABS(MATRIX[INDEX2,INDEX1]) > BIGGEST) THEN BEGIN
  28.     PIVOT   := INDEX2;
  29.     BIGGEST := ABS(MATRIX[INDEX2,INDEX1]);
  30.     END; { OF : IF (ABS(MATRIX[.... }
  31.    END; { OF : INDEX2 LOOP }
  32.    IF BIGGEST = 0.0 THEN DECOMPOSE := NOT SUCCESSFUL
  33.     ELSE BEGIN
  34.     PVT_VECTOR[INDEX1]  := PIVOT;
  35.     TEMP        := MATRIX[PIVOT,INDEX1];
  36.     IF PIVOT <> INDEX1 THEN BEGIN
  37.      MATRIX[PIVOT,INDEX1]  := MATRIX[INDEX1,INDEX1];
  38.      MATRIX[INDEX1,INDEX1] := TEMP;
  39.      TEMP           := 1.0/TEMP;
  40.      END; { OF : IF PIVOT <> ...   }
  41.     FIRST := INDEX1 + 1;
  42.     FOR INDEX2 := FIRST TO N DO BEGIN
  43.      MATRIX[INDEX2,INDEX1] := -1.0 * MATRIX[INDEX2,INDEX1] * TEMP;
  44.      END; { OF INDEX2 LOOP }
  45.     FOR INDEX2 := FIRST TO N DO BEGIN
  46.      TEMP := MATRIX[PIVOT,INDEX2];
  47.      IF (PIVOT <> INDEX1) THEN BEGIN
  48.       MATRIX[PIVOT,INDEX2]  := MATRIX[INDEX1,INDEX2];
  49.       MATRIX[INDEX1,INDEX2] := TEMP;
  50.       END; { OF : IF PIVOT... }
  51.      IF (TEMP <> 0) THEN BEGIN
  52.       FOR INDEX3 := FIRST TO N DO BEGIN
  53.        MATRIX[INDEX3,INDEX2] := MATRIX[INDEX3,INDEX2] + 
  54.                 (MATRIX[INDEX3,INDEX1] * TEMP);
  55.        END; { OF : FOR INDEX3 LOOP }
  56.       END; { OF : IF TEMP <> 0 ... }
  57.      END; { OF : INDEX2 LOOP }
  58.     END; { OF : IF BIGGEST..ELSE.. }
  59.    IF MATRIX[N,N] = 0 THEN DECOMPOSE := NOT SUCCESSFUL;
  60.   END; { OF : INDEX1 LOOP }
  61. END; { OF : FUNCTION DECOMPOSE }
  62.  
  63.