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 valorsize(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.
flag0se convergiu,1semaxitfoi atingido,2para pré-condicionador mal condicionado,3se estagnou.relres- Resíduo relativo final.
iter- Vetor de dois elementos
[externa interna]que localiza a iteração em quexfoi 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)
flag = 0, iter = [1 5]
0.1679 0.3282 0.5192 0.5949 1.1013
flag = 0, relres < 1e-10: 1