lsqr

Resolve iterativamente um sistema linear ou de mínimos quadrados.

Categoria: Mathematics > Sparse Matrices

Sintaxe

x = lsqr(A, b)

Resolve A*x = b, no sentido de mínimos quadrados quando A é retangular.

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

Define a tolerância e o limite de iterações.

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

Acrescenta um pré-condicionador e uma estimativa inicial.

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

Também retorna o indicador de convergência, informações do resíduo e vetores de histórico.

Descrição

O LSQR aplica a bidiagonalização de Lanczos às equações normais A'*A*x = A'*b sem nunca formar A'*A, o que elevaria ao quadrado o número de condição. Cada iteração custa um produto com A e um com A'.

É voltado para problemas de mínimos quadrados esparsos e grandes. Como o maxit padrão é apenas 20 para matrizes grandes, aumente-o quando o indicador for 1.

Argumentos de entrada

A
Matriz de coeficientes, não necessariamente quadrada, ou um handle de função.
b
Vetor coluna do lado direito.
tol
Tolerância; padrão 1e-6.
maxit
Máximo de iterações; padrão min(size(A,1), size(A,2), 20).

Argumentos de saída

x
A solução, um vetor coluna com size(A,2) elementos.
flag
0 se convergiu, 1 se maxit foi atingido, 2 para pré-condicionador mal condicionado, 3 se estagnou.
relres
Resíduo relativo norm(b - A*x)/norm(b).

Exemplo

Sistema quadrado

A = sparse(diag(4*ones(5,1)) + diag(ones(4,1),1) + diag(ones(4,1),-1));
b = (1:5)';
[x, flag, relres] = lsqr(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

Observações

Sistemas retangulares podem retornar uma solução de tamanho errado nesta versão; use matrizes quadradas, ou A\b, para mínimos quadrados.

Veja também

pcg gmres mldivide lscov