Метод 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 |
|
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., М. Берри, Т. Ф. Чан, и др., Шаблоны для Решения Линейных систем: Стандартные блоки для Итерационных методов, SIAM, Филадельфия, 1994.
[2] Пэйдж, C. C. и М. А. Сондерс, "LSQR: Алгоритм для Разреженных Линейных уравнений И Разреженных Наименьших квадратов", Математика Сделки ACM. Мягкий., Vol.8, 1982, стр 43-71.