Proofs: Incomplete LU factorization
These are the human proofs of Incomplete LU factorization, at full length.
Cost of ILU and of applying it full
This proof shows: time.worst, space.extra, flops.solve.
Let bound the number of entries of any working row (for ILU(0), the number of nonzeros in a row of , since no fill is created).
Factorization. Row : building and its heap costs . At most columns are popped, each pop . Each processed multiplier costs one division (L3) and one pass over the stored row , which has at most entries (it was a working row), with work per entry including the dictionary lookup in L5 and L6. So row costs and the whole factorization . L7 costs per row.
Storage. The kept rows of and hold entries plus levels for , and the working row : extra space.
Applying . The forward sweep does one multiplication and one subtraction per stored entry of : flops. The backward sweep does the same for the off-diagonal entries of and one division per row: . Total flops.
ILU satisfies the pattern equations and terminates full
This proof shows: correctness, termination.
Exact arithmetic. Notation of the page. Let be the set of positions kept by the algorithm (entries of the working row with final level at most ; for , the pattern of ). Write , for the stored strict lower entries and for the stored upper entries; positions not in hold .
Lemma 1 (order of updates). When row uses in L3, the entry has received every update with that the algorithm will ever make.
Proof. An update to comes from a multiplier column with (L4 runs over ). The heap pops columns in increasing order and every column is pushed before it can be popped, and a column created by L6 from satisfies , so it is pushed while is being processed, before is popped. Hence all that are ever processed are processed before . The level of also changes only in those updates, so the test in L2 uses the final level.
Lemma 2 (row identity). After row is finished, for every position present in the working row,
where is the set of processed multiplier columns of row and when it is not stored. For this is the value of just before the division in L3, after which .
Proof. starts as row of (absent entries read as ). Each processed subtracts from for every with stored; for not yet present, L6 creates when . When , a position absent from row of is never kept, so its value does not matter. Terms with contribute nothing. By Lemma 1 every in has been applied before is read in L3 (for ) or at the end (for ).
Theorem 1 (pattern equations). If no ZERO-PIVOT is returned, then for every .
Proof. . Only with stored contribute, that is or kept with level ; a processed column that is later dropped cannot exist, since L2 processes only with final level (Lemma 1) and those are kept in L7. Case : , so by Lemma 2, (with ; implies ). Case : , so .
Corollary (exact LU). If contains every position that becomes nonzero in Gaussian elimination without pivoting (for example when , since levels along any elimination path are at most , or when is tridiagonal), then nothing is dropped, on all positions where can be nonzero, and on the remaining positions both sides are ; so , the unique LU factorization without pivoting.
Theorem 2 (termination). Row pushes each column at most once at the start or at its creation in L6, so the heap delivers at most columns; each processed column performs at most updates. Hence each row finishes after finitely many steps, and after rows the code returns , , or ZERO-PIVOT as soon as a pivot is met in L3 or L7.