# Test again Octave's pcg() function.
for n = [ 5, 10, 25, 50, 100 ]
- A = random_positive_definite_matrix(n, 100);
+ ## Since we are preconditioning, a larger condition number
+ ## (<= 100000) is acceptable.
+ A = random_positive_definite_matrix(n, 100, 100000);
+ b = unifrnd(-100, 100, n, 1);
+ g = @(x) A*x - b;
- # Use the cholesky factorization as a preconditioner.
- Ct = perturb(chol(A));
- C = Ct';
- M = Ct*C;
+ ## Use a perturbed cholesky factorization (so, almost the Cholesky
+ ## factorization of A) as a preconditioner. Using the actual Cholesky
+ ## factorization would make the solution too easy.
+ R = perturb(chol(A));
+ M = R' * R;
- # Assumed by Octave's implementation when you don't supply a
- # preconditioner.
+ # The origin is assumed by Octave's implementation when you don't supply a
+ # starting point.
x0 = zeros(n, 1);
- b = unifrnd(-100, 100, n, 1);
- g = @(x) A*x - b;
## pcg() stops when the /relative/ norm falls below tolerance. To
## eliminate the relativity, we divide the tolerance by the
## quantity that pcg() will divide by.
[o_x, o_flag, o_relres, o_iter] = pcg(A, b, tolerance/norm(g(x0)), ...
- max_iterations, C, C');
+ max_iterations, M, []);
[x, k] = preconditioned_conjugate_gradient_method(A,
M,
b,