This example shows how to use an incomplete Cholesky factorization as a preconditioner to improve convergence.

Create a symmetric positive definite matrix, `A`

.

Create an incomplete Cholesky factorization as a preconditioner for `pcg`

. Use a constant vector as the right hand side. As a baseline, execute `pcg`

without a preconditioner.

Note that `fl0 = 1`

indicating that `pcg`

did not drive the relative residual to the requested tolerance in the maximum allowed iterations. Try the no-fill incomplete Cholesky factorization as a preconditioner.

`fl1 = 0`

, indicating that `pcg`

converged to the requested tolerance and did so in 59 iterations (the value of `it1`

). Since this matrix is a discretized Laplacian, however, using modified incomplete Cholesky can create a better preconditioner. A modified incomplete Cholesky factorization constructs an approximate factorization that preserves the action of the operator on the constant vector. That is, `norm(A*e-L*(L'*e))`

will be approximately zero for `e = ones(size(A,2),1)`

even though `norm(A-L*L','fro')/norm(A,'fro')`

is not close to zero. It is not necessary to specify type for this syntax since `nofill`

is the default, but it is good practice.

`pcg`

converges (`fl2 = 0`

) but in only 38 iterations. Plotting all three convergence histories shows the convergence.

The plot shows that the modified incomplete Cholesky preconditioner creates a much faster convergence.

You can also try incomplete Cholesky factorizations with threshold dropping. The following plot shows convergence of `pcg`

with preconditioners constructed with various drop tolerances.

L3 = ichol(A, struct('type','ict','droptol',1e-1));
[x3,fl3,rr3,it3,rv3] = pcg(A,b,tol,maxit,L3,L3');
L4 = ichol(A, struct('type','ict','droptol',1e-2));
[x4,fl4,rr4,it4,rv4] = pcg(A,b,tol,maxit,L4,L4');
L5 = ichol(A, struct('type','ict','droptol',1e-3));
[x5,fl5,rr5,it5,rv5] = pcg(A,b,tol,maxit,L5,L5');
figure
semilogy(0:maxit,rv0./norm(b),'b-','linewidth',2);
hold on
semilogy(0:it3,rv3./norm(b),'b-.','linewidth',2);
semilogy(0:it4,rv4./norm(b),'b--','linewidth',2);
semilogy(0:it5,rv5./norm(b),'b:','linewidth',2);
legend('No Preconditioner','ICT(1e-1)','ICT(1e-2)', ...
'ICT(1e-3)','Location','SouthEast');

Note the incomplete Cholesky preconditioner constructed with drop tolerance `1e-2`

is denoted as `ICT(1e-2)`

.

As with the zero-fill incomplete Cholesky, the threshold dropping factorization can benefit from modification (i.e. `opts.michol = 'on'`

) since the matrix arises from an elliptic partial differential equation. As with `MIC(0)`

, the modified threshold based dropping incomplete Cholesky will preserve the action of the preconditioner on constant vectors, that is `norm(A*e-L*(L'*e))`

will be approximately zero.