Algorithm Search⌘K

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 cc bound the number of entries of any working row ww (for ILU(0), the number of nonzeros in a row of AA, since no fill is created).

Factorization. Row ii: building ww and its heap costs O(c)O(c). At most cc columns are popped, each pop O(log⁡c)O(\log c). Each processed multiplier kk costs one division (L3) and one pass over the stored row UkU_k, which has at most cc entries (it was a working row), with O(1)O(1) work per entry including the dictionary lookup in L5 and L6. So row ii costs O(clog⁡c+c⋅c)=O(c2)O(c \log c + c \cdot c) = O(c^2) and the whole factorization O(nc2)O(n c^2). L7 costs O(c)O(c) per row.

Storage. The kept rows of LL and UU hold ff entries plus levels for UU, and the working row O(c)≤O(f)O(c) \le O(f): Θ(f)\Theta(f) extra space.

Applying M−1M^{-1}. The forward sweep does one multiplication and one subtraction per stored entry of LL: 2nnz⁡(L)2 \operatorname{nnz}(L) flops. The backward sweep does the same for the off-diagonal entries of UU and one division per row: 2(nnz⁡(U)−n)+n2(\operatorname{nnz}(U) - n) + n. Total 2(nnz⁡(L)+nnz⁡(U))−n=2f−n2(\operatorname{nnz}(L) + \operatorname{nnz}(U)) - n = 2 f - n flops. ■\blacksquare

ILU satisfies the pattern equations and terminates full

This proof shows: correctness, termination.

Exact arithmetic. Notation of the page. Let KK be the set of positions (i,j)(i, j) kept by the algorithm (entries of the working row with final level at most pp; for p=0p = 0, the pattern of AA). Write lii=1l_{ii} = 1, likl_{ik} for the stored strict lower entries and ukju_{kj} for the stored upper entries; positions not in KK hold 00.

Lemma 1 (order of updates). When row ii uses kk in L3, the entry wkw_k has received every update wk←wk−lik′uk′kw_k \leftarrow w_k - l_{ik'} u_{k'k} with k′<kk' < k that the algorithm will ever make.

Proof. An update to wkw_k comes from a multiplier column k′k' with k>k′k > k' (L4 runs over j>k′j > k'). The heap pops columns in increasing order and every column is pushed before it can be popped, and a column kk created by L6 from k′k' satisfies k>k′k > k', so it is pushed while k′k' is being processed, before kk is popped. Hence all k′<kk' < k that are ever processed are processed before kk. The level of wkw_k also changes only in those updates, so the test levik≤p\mathrm{lev}_{ik} \le p in L2 uses the final level. □\square

Lemma 2 (row identity). After row ii is finished, for every position jj present in the working row,

wj=aij−∑k∈Si, k<jlikukj,w_j = a_{ij} - \sum_{k \in S_i, \ k < j} l_{ik} u_{kj},

where SiS_i is the set of processed multiplier columns of row ii and ukj=0u_{kj} = 0 when it is not stored. For j<ij < i this is the value of wjw_j just before the division in L3, after which lij=wj/ujjl_{ij} = w_j / u_{jj}.

Proof. ww starts as row ii of AA (absent entries read as 00). Each processed kk subtracts likukjl_{ik} u_{kj} from wjw_j for every j>kj > k with ukj≠0u_{kj} \ne 0 stored; for jj not yet present, L6 creates wj=−likukj=0−likukjw_j = -l_{ik} u_{kj} = 0 - l_{ik} u_{kj} when p>0p > 0. When p=0p = 0, a position jj absent from row ii of AA is never kept, so its value does not matter. Terms with ukj=0u_{kj} = 0 contribute nothing. By Lemma 1 every k<jk < j in SiS_i has been applied before wjw_j is read in L3 (for j<ij < i) or at the end (for j≥ij \ge i). □\square

Theorem 1 (pattern equations). If no ZERO-PIVOT is returned, then (LU)ij=aij(L U)_{ij} = a_{ij} for every (i,j)∈K(i, j) \in K.

Proof. (LU)ij=∑k≤min⁡(i,j)likukj(L U)_{ij} = \sum_{k \le \min(i, j)} l_{ik} u_{kj}. Only kk with lik≠0l_{ik} \ne 0 stored contribute, that is k=ik = i or k∈Sik \in S_i kept with level ≤p\le p; a processed column kk that is later dropped cannot exist, since L2 processes only kk with final level ≤p\le p (Lemma 1) and those are kept in L7. Case j≥ij \ge i: uij=wju_{ij} = w_j, so by Lemma 2, aij=uij+∑k∈Si,k<ilikukj=∑k≤ilikukja_{ij} = u_{ij} + \sum_{k \in S_i, k < i} l_{ik} u_{kj} = \sum_{k \le i} l_{ik} u_{kj} (with lii=1l_{ii} = 1; k∈Sik \in S_i implies k<i≤jk < i \le j). Case j<ij < i: lijujj=wj=aij−∑k∈Si,k<jlikukjl_{ij} u_{jj} = w_j = a_{ij} - \sum_{k \in S_i, k < j} l_{ik} u_{kj}, so aij=∑k≤jlikukja_{ij} = \sum_{k \le j} l_{ik} u_{kj}. □\square

Corollary (exact LU). If KK contains every position that becomes nonzero in Gaussian elimination without pivoting (for example when p≥n−1p \ge n - 1, since levels along any elimination path are at most n−2n - 2, or when AA is tridiagonal), then nothing is dropped, (LU)ij=aij(L U)_{ij} = a_{ij} on all positions where LUL U can be nonzero, and on the remaining positions both sides are 00; so LU=AL U = A, the unique LU factorization without pivoting.

Theorem 2 (termination). Row ii pushes each column at most once at the start or at its creation in L6, so the heap delivers at most nn columns; each processed column performs at most nn updates. Hence each row finishes after finitely many steps, and after nn rows the code returns LL, UU, or ZERO-PIVOT as soon as a pivot ukk=0u_{kk} = 0 is met in L3 or L7. ■\blacksquare

Back to Incomplete LU factorization