symmlq
Resolve um sistema linear simétrico pelo método LQ simétrico.
Categoria: Mathematics > Sparse Matrices
Sintaxe
x = symmlq(A, b)
Resolve A*x = b com a tolerância e o limite de iterações padrão.
x = symmlq(A, b, tol, maxit)
Define a tolerância do resíduo relativo e o número máximo de iterações.
x = symmlq(A, b, tol, maxit, M1, M2, x0)
Acrescenta um pré-condicionador M = M1*M2 e uma estimativa inicial x0.
[x, flag, relres, iter, resvec] = symmlq(___)
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
symmlq é voltado para A simétrica, definida ou indefinida. Usa o processo de Lanczos, então a memória fica constante, e resolve um sistema tridiagonal relacionado por fatoração LQ. É companheiro do minres, que minimiza o resíduo. Um pré-condicionador deve ser simétrico definido positivo.
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 simétrico
A = sparse(diag(4*ones(5,1)) + diag(ones(4,1),1) + diag(ones(4,1),-1));
b = (1:5)';
[x, flag, relres, iter] = symmlq(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