LU - decomposition
PROBLEM
We wish to write a square N by N matrix A. as product of two matrices L. (lower triangular - has elements only on the diagonal and below) and U. (upper triangular - has elements only on the diagonal and above).
ALGORITHM
Crout's algorithm is the decomposition in place. We suppose L.J.J=1 for J=1,...,N; the other elements of L. will in A. below the diagonal. Elements of U. will in A. on the diagonal and above. The following algorithm doesn't actually decompose the matrix A. into LU form; it rather decompose a rowwise permutation of input matrix. This permutation is recorded in the Indx. output vector. The LU decomposition in LUDCMP requires about (1/3)*N**3 executions of the inner loops (each with one multiply and one add).
IMPLEMENTATION
Unit: internal function
Global variables: input N by N matrix A., Indx. is an N element vector
Parameter: a positive integer N
Returns: +1 or -1 depending on whether the number of row interchanges was even or odd (for calculation of a determinant)
Result: Indx. records the row permutation; a rowwise permutation of A. is decomposed
Note:
W. H. Press et al. say: "If the pivot element is zero the matrix is singular. For some applications on singular matrices, it is desirable to substitute Tiny for zero." They recommend the value Tiny=1E-20.
LUDCMP: procedure expose A. Indx.
parse arg N
D = 1; Tiny = 1E-20
do I = 1 to N
Max = 0
do J = 1 to N
W = ABS(A.I.J)
if W > Max then Max = W
end
if Max = 0 then
call ERROR "LUDCMP: Error - singular matrix"
Vv.I = 1 / Max
end
do J = 1 to N
do I = 1 to J - 1
Sum = A.I.J
do K = 1 to I - 1
Sum = Sum - A.I.K * A.K.J
end
A.I.J = Sum
end
Max = 0
do I = J to N
Sum = A.I.J
do K = 1 to J - 1
Sum = Sum - A.I.K * A.K.J
end
A.I.J = Sum
W = Vv.I * ABS(Sum)
if W >= Max then do; Max = W; Imax = I; end
end
if J <> Imax then do
do K = 1 to N
W = A.Imax.K; A.Imax.K = A.J.K; A.J.K = W
end
D = -D; Vv.Imax = Vv.J
end
Indx.J = Imax
if A.J.J = 0 then A.J.J = Tiny
if J <> N then do
W = 1 / A.J.J
do I = J + 1 to N
A.I.J = A.I.J * W
end
end
end
return D
ERROR: say ARG(1); exit
|
CONNECTIONS
Literature
Press W.H., Teukolsky S.A., Vetterling W.T., Flannery B.P. Numerical Recipes in C : the art of scientific computing
- 2nd ed. University Press, Cambridge, 1992