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.
flag0se convergiu em atémaxititerações,1se acabaram as iterações,2se o pré-condicionador era mal condicionado,3se 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
xfoi 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)
flag = 0, iterations = 5
0.1679 0.3282 0.5192 0.5949 1.1013
preconditioned flag = 0, same answer: 1