lsqr

Метод LSQR

Синтаксис

x = lsqr (A, b)
lsqr (A, b, tol)
lsqr (A, b, tol, maxit)
lsqr (A, b, tol, maxit, M)
lsqr (A, b, tol, maxit, M1, M2)
lsqr (A, b, tol, maxit, M1, M2, x0)
[x, флаг] = lsqr (A, b, tol, maxit, M1, M2, x0)
[x, флаг, relres] = lsqr (A, b, tol, maxit, M1, M2, x0)
[x, флаг, relres, проход] = lsqr (A, b, tol, maxit, M1, M2, x0)
[x, флаг, relres, проход, resvec] = lsqr (A, b, tol, maxit, M1, M2, x0)
[x, флаг, relres, проход, resvec, lsvec] = lsqr (A, b, tol, maxit, M1, M2, x0)

Описание

x = lsqr(A,b) пытается решить систему линейных уравнений A*x=b для x, если A сопоставим, в противном случае это пытается решить решение методом наименьших квадратов x, который минимизирует norm(b-A*x). m-by-n матрица коэффициентов, A не должен быть квадратным, но это должно быть большим и разреженным. Вектор - столбец b должен иметь длину m. Можно задать A как указатель на функцию, afun, такой, что afun(x,'notransp') возвращает A*x, и afun(x,'transp') возвращает A'*x.

Параметризация Функций объясняет, как предоставить дополнительные параметры функциональному afun, а также функцию перед формирователем mfun, описанный ниже, при необходимости.

Если lsqr сходится, сообщение к тому эффекту отображено. Если lsqr не удается сходиться после максимального количества итераций или остановов по любой причине, предупреждающее сообщение распечатано, отобразив относительный остаточный norm(b-A*x)/norm(b) и номер итерации в который метод, остановленный или не пройдено.

lsqr(A,b,tol) задает допуск метода. Если tol является [], то lsqr использует значение по умолчанию, 1e-6.

lsqr(A,b,tol,maxit) задает максимальное количество итераций.

lsqr(A,b,tol,maxit,M) и lsqr(A,b,tol,maxit,M1,M2) используют n-by-n предварительный формирователь M или M = M1*M2 и эффективно решают систему A*inv(M)*y = b для y, где y = M*x. Если M является [] затем, lsqr не применяет предварительного формирователя. M может быть функциональный mfun, таким образом, что mfun(x,'notransp') возвращает M\x, и mfun(x,'transp') возвращает M'\x.

lsqr(A,b,tol,maxit,M1,M2,x0) задает n-by-1 исходное предположение. Если x0 является [], то lsqr использует значение по умолчанию, весь нулевой вектор.

[x,flag] = lsqr(A,b,tol,maxit,M1,M2,x0) также возвращает флаг сходимости.

Флаг

Сходимость

0

lsqr сходился к желаемому допуску tol в итерациях maxit .

1

lsqr выполнил итерации времен maxit, но не сходился.

2

Предварительный формирователь M был плохо обусловлен.

3

lsqr застоялся. (Два последовательных выполняют итерации, было то же самое.)

4

Один из скаляров, вычисленных во время lsqr, стал слишком небольшим или слишком большим, чтобы продолжить вычислять.

Каждый раз, когда flag не является 0, решение, возвращенный x то, что с минимальной невязкой нормы, вычисленной по всем итерациям. Никакие сообщения не отображены, если вы задаете flag вывод.

[x,flag,relres] = lsqr(A,b,tol,maxit,M1,M2,x0) также возвращает оценку относительного остаточного norm(b-A*x)/norm(b). Если flag является 0, relres <= tol.

[x,flag,relres,iter] = lsqr(A,b,tol,maxit,M1,M2,x0) также возвращает номер итерации, в котором x был вычислен, где 0 <= iter <= maxit.

[x,flag,relres,iter,resvec] = lsqr(A,b,tol,maxit,M1,M2,x0) также возвращает вектор остаточных оценок нормы в каждой итерации, включая norm(b-A*x0).

[x,flag,relres,iter,resvec,lsvec] = lsqr(A,b,tol,maxit,M1,M2,x0) также возвращает вектор оценок масштабированной невязки нормальных уравнений в каждой итерации: norm((A*inv(M))'*(B-A*X))/norm(A*inv(M),'fro'). Обратите внимание на то, что оценка изменений norm(A*inv(M),'fro'), и надо надеяться улучшается в каждой итерации.

Примеры

Пример 1

n = 100; 
on = ones(n,1); 
A = spdiags([-2*on 4*on -on],-1:1,n,n);
b = sum(A,2); 
tol = 1e-8; 
maxit = 15;
M1 = spdiags([on/(-2) on],-1:0,n,n); 
M2 = spdiags([4*on -on],0:1,n,n);

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

отображения следующее сообщение:

lsqr converged at iteration 11 to a solution with relative 
residual 3.5e-009

Пример 2

Этот пример заменяет матричный A в Примере 1 с указателем на функцию матричного векторного произведения afun. Пример содержится в функциональном run_lsqr это

  • Вызовы lsqr с указателем на функцию @afun в качестве его первого аргумента.

  • Содержит afun как вложенную функцию, так, чтобы все переменные в run_lsqr были доступны afun.

Следующее показывает код для run_lsqr:

function x1 = run_lsqr
n = 100; 
on = ones(n,1); 
A = spdiags([-2*on 4*on -on],-1:1,n,n);
b = sum(A,2); 
tol = 1e-8; 
maxit = 15;
M1 = spdiags([on/(-2) on],-1:0,n,n); 
M2 = spdiags([4*on -on],0:1,n,n);
x1 = lsqr(@afun,b,tol,maxit,M1,M2);

    function y = afun(x,transp_flag)
       if strcmp(transp_flag,'transp')      % y = A'*x
          y = 4 * x;
          y(1:n-1) = y(1:n-1) - 2 * x(2:n);
          y(2:n) = y(2:n) - x(1:n-1);
       elseif strcmp(transp_flag,'notransp') % y = A*x
          y = 4 * x;
          y(2:n) = y(2:n) - 2 * x(1:n-1);
          y(1:n-1) = y(1:n-1) - x(2:n);
       end
    end
end

Когда вы входите

x1=run_lsqr;

MATLAB отображает сообщение

lsqr converged at iteration 11 to a solution with relative 
residual 3.5e-009

Ссылки

[1] Барретт, Ягода R., M., Т. F. Чан, и др., Шаблоны для Решения Линейных систем: Стандартные блоки для Итеративных Методов, SIAM, Филадельфия, 1994.

[2] Пэйдж, C. C. и М. A. Сондерс, "LSQR: Алгоритм для Разреженных Линейных уравнений И Разреженных Наименьших квадратов", Математика Сделки ACM. Мягкий., Vol.8, 1982, стр 43-71.

Расширенные возможности

Представлено до R2006a

Была ли эта тема полезной?