pcg

Resolve um sistema linear simétrico definido positivo pelo gradiente conjugado pré-condicionado.

Categoria: Mathematics > Sparse Matrices

Sintaxe

x = pcg(A, b)

Resolve A*x = b com a tolerância e o limite de iterações padrão.

x = pcg(A, b, tol, maxit)

Define a tolerância do resíduo relativo e o número máximo de iterações.

x = pcg(A, b, tol, maxit, M1, M2, x0)

Acrescenta um pré-condicionador M = M1*M2 e uma estimativa inicial x0.

[x, flag, relres, iter, resvec] = pcg(___)

Também retorna o indicador de convergência, o resíduo relativo final, o número de iterações e o histórico de resíduos.

Descrição

pcg é o método padrão quando A é simétrica e definida positiva. Precisa de um produto com A por iteração, guarda apenas alguns vetores e, em aritmética exata, encontra a resposta em no máximo size(A,1) passos. Na prática, o pré-condicionador decide a rapidez.

Se A não é simétrica definida positiva, o método pode falhar ou dar resposta errada; use gmres ou bicgstab.

Quando chamado com menos de duas saídas, imprime uma linha dizendo se convergiu. Com a saída flag, fica em silêncio, então verifique flag por conta própria. Um bom pré-condicionador, como uma fatoração incompleta (ilu, ichol), pode reduzir bastante o número de iterações.

Argumentos de entrada

A
Matriz de coeficientes quadrada (em geral esparsa), ou handle de função que retorna A*x.
b
Vetor coluna do lado direito, com size(A,1) elementos.
tol
Tolerância do resíduo relativo; o padrão é 1e-6.
maxit
Número máximo de iterações.
M1, M2
Fatores do pré-condicionador, como matrizes ou handles de função; o solver trabalha com M1*M2.
x0
Estimativa inicial. O padrão é um vetor de zeros.

Argumentos de saída

x
A solução calculada, um vetor coluna.
flag
0 se convergiu em até maxit iterações, 1 se acabaram as iterações, 2 se o pré-condicionador era mal condicionado, 3 se estagnou, e outros valores para uma falha numérica.
relres
Resíduo relativo norm(b - A*x)/norm(b) na iteração retornada.
iter
Iteração em que x foi calculado.
resvec
Histórico das normas dos resíduos.

Exemplo

Sistema tridiagonal, simples e pré-condicionado

A = sparse(diag(4*ones(5,1)) + diag(ones(4,1),1) + diag(ones(4,1),-1));
b = (1:5)';
[x, flag, relres, iter] = pcg(A, b, 1e-10, 100);
fprintf('flag = %d, iterations = %d\n', flag, iter)
disp(x')
L = ichol(A);
[x2, flag2] = pcg(A, b, 1e-10, 100, L, L');
fprintf('preconditioned flag = %d, same answer: %d\n', flag2, norm(x - x2) < 1e-8)
Saída
flag = 0, iterations = 5
    0.1679    0.3282    0.5192    0.5949    1.1013
preconditioned flag = 0, same answer: 1

Veja também

ichol gmres minres bicgstab symmlq