bicgstabl
Resolve um sistema linear quadrado pelo método BiCGStab(l).
Categoria: Mathematics > Sparse Matrices
Sintaxe
x = bicgstabl(A, b)
Resolve A*x = b com a tolerância e o limite de iterações padrão.
x = bicgstabl(A, b, tol, maxit)
Define a tolerância do resíduo relativo e o número máximo de iterações.
x = bicgstabl(A, b, tol, maxit, M1, M2, x0)
Acrescenta um pré-condicionador M = M1*M2 e uma estimativa inicial x0.
[x, flag, relres, iter, resvec] = bicgstabl(___)
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
bicgstabl generaliza o bicgstab suavizando o resíduo com um polinômio de grau l a cada passo. Um l maior ajuda em matrizes com autovalores fortemente complexos, nas quais o bicgstab tende a estagnar, ao custo de mais trabalho por iteração.
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
A = sparse(diag(4*ones(5,1)) + diag(ones(4,1),1) + diag(ones(4,1),-1));
b = (1:5)';
[x, flag, relres, iter] = bicgstabl(A, b, 1e-10, 100);
fprintf('flag = %d, relres < 1e-10: %d\n', flag, relres < 1e-10)
disp(x')
flag = 0, relres < 1e-10: 1
0.1679 0.3282 0.5192 0.5949 1.1013