gmres

Resolve um sistema linear quadrado pelo método do resíduo mínimo generalizado.

Categoria: Mathematics > Sparse Matrices

Sintaxe

x = gmres(A, b)

Resolve A*x = b com as configurações padrão.

x = gmres(A, b, restart, tol, maxit)

Reinicia a cada restart passos internos; [] executa sem reinícios.

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

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

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

Também retorna o indicador, o resíduo relativo final, as contagens de iteração [externa interna] e o histórico de resíduos.

Descrição

No passo k, o GMRES escolhe, no subespaço de Krylov gerado por b, A*b, ..., A^(k-1)*b, o vetor que minimiza o resíduo. Funciona com qualquer matriz quadrada, simétrica ou não, e seu resíduo nunca aumenta. O preço é a memória: guarda todos os k vetores da base, e o trabalho por passo cresce com k.

Reiniciar após restart passos limita esse custo, mas pode retardar a convergência ou até estagná-la. Use [] para problemas pequenos e um valor de reinício para os grandes.

Argumentos de entrada

A
Matriz de coeficientes quadrada, ou handle de função que retorna A*x.
b
Vetor coluna do lado direito.
restart
Iterações internas antes de reiniciar. [] ou um valor size(A,1) significa sem reinício.
tol
Tolerância do resíduo relativo; padrão 1e-6.
maxit
Número máximo de iterações externas.
M1, M2
Fatores do pré-condicionador.
x0
Estimativa inicial; padrão zeros.

Argumentos de saída

x
A solução calculada.
flag
0 se convergiu, 1 se maxit foi atingido, 2 para pré-condicionador mal condicionado, 3 se estagnou.
relres
Resíduo relativo final.
iter
Vetor de dois elementos [externa interna] que localiza a iteração em que x foi obtido.
resvec
Normas do resíduo em cada iteração interna.

Exemplo

Sem e com reinício

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

Veja também

bicgstab pcg lsqr qmr ilu