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,flag] = lsqr(A,b,tol,maxit,M1,M2,x0)
[x,flag,relres] = lsqr(A,b,tol,maxit,M1,M2,x0)
[x,flag,relres,iter] = lsqr(A,b,tol,maxit,M1,M2,x0)
[x,flag,relres,iter,resvec] = lsqr(A,b,tol,maxit,M1,M2,x0)
[x,flag,relres,iter,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., М. Берри, Т. Ф. Чан, и др., Шаблоны для Решения Линейных систем: Стандартные блоки для Итерационных методов, SIAM, Филадельфия, 1994.

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

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

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

Для просмотра документации необходимо авторизоваться на сайте