bicg

Resolve um sistema linear quadrado pelo método dos gradientes biconjugados.

Categoria: Mathematics > Sparse Matrices

Sintaxe

x = bicg(A, b)

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

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

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

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

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

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

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

bicg resolve A*x = b para uma matriz quadrada, não necessariamente simétrica. Constrói duas sequências de direções de busca, uma usando A e outra usando sua transposta, o que mantém o custo por passo baixo. Cada iteração precisa de um produto com A e outro com A'.

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

A = sparse(diag(4*ones(5,1)) + diag(ones(4,1),1) + diag(ones(4,1),-1));
b = (1:5)';
[x, flag, relres, iter] = bicg(A, b, 1e-10, 100);
fprintf('flag = %d, relres < 1e-10: %d\n', flag, relres < 1e-10)
disp(x')
Saída
flag = 0, relres < 1e-10: 1
    0.1679    0.3282    0.5192    0.5949    1.1013

Veja também

bicgstab cgs gmres pcg qmr