Метод 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 |
|
1 |
|
2 | Предварительный формирователь |
3 |
|
4 | Один из скаляров, вычисленных во время |
Каждый раз, когда 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')
, и надо надеяться улучшается в каждой итерации.
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
Этот пример заменяет матричный 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.