Симметричный метод LQ
x = symmlq(A,b)
symmlq(A,b,tol)
symmlq(A,b,tol,maxit)
symmlq(A,b,tol,maxit,M)
symmlq(A,b,tol,maxit,M1,M2)
symmlq(A,b,tol,maxit,M1,M2,x0)
[x,flag] = symmlq(A,b,...)
[x,flag,relres] = symmlq(A,b,...)
[x,flag,relres,iter] = symmlq(A,b,...)
[x,flag,relres,iter,resvec] = symmlq(A,b,...)
[x,flag,relres,iter,resvec,resveccg]
= symmlq(A,b,...)
x = symmlq(A,b) попытки решить систему линейных уравнений A*x=b для x. n-by-n матрица коэффициентов A должен быть симметричным, но не должен быть положителен определенный. Это должно также быть большим и разреженным. Вектор-столбец b должен иметь длину n. Можно задать A как указатель на функцию, afun, такой, что afun(x) возвращает A*x.
Параметризация Функций объясняет, как предоставить дополнительные параметры функциональному afun, а также функцию перед формирователем mfun, описанный ниже, при необходимости.
Если symmlq сходится, сообщение к тому эффекту отображено. Если symmlq не удается сходиться после максимального количества итераций или остановов по любой причине, предупреждающее сообщение распечатано, отобразив относительный остаточный norm(b-A*x)/norm(b) и номер итерации в который метод, остановленный или не пройдено.
symmlq(A,b,tol) задает допуск метода. Если tol является [], то symmlq использует значение по умолчанию, 1e-6.
symmlq(A,b,tol,maxit) задает максимальное количество итераций. Если maxit является [], то symmlq использует значение по умолчанию, min(n,20).
symmlq(A,b,tol,maxit,M) и symmlq(A,b,tol,maxit,M1,M2) используйте симметричный положительный определенный предварительный формирователь M или M = M1*M2 и эффективно решите систему inv(sqrt(M))*A*inv(sqrt(M))*y = inv(sqrt(M))*b для y и затем return x = in(sqrt(M))*y. Если M является [] затем, symmlq не применяет предварительного формирователя. M может быть указателем на функцию mfun, таким образом, что mfun(x) возвращает M\x.
symmlq(A,b,tol,maxit,M1,M2,x0) задает исходное предположение. Если x0 является [], то symmlq использует значение по умолчанию, все-нулевой вектор.
[x,flag] = symmlq(A,b,...) также возвращает флаг сходимости.
Флаг | Сходимость |
|---|---|
| 0 |
|
| 1 |
|
| 2 | Предварительный формирователь |
| 3 |
|
| 4 | Один из скаляров, вычисленных во время |
| 5 | Предварительный формирователь |
Каждый раз, когда flag не является 0, решение, возвращенный x то, что с минимальной невязкой нормы, вычисленной по всем итерациям. Никакие сообщения не отображены, если flag вывод задан.
[x,flag,relres] = symmlq(A,b,...) также возвращает относительный остаточный norm(b-A*x)/norm(b). Если flag является 0, relres <= tol.
[x,flag,relres,iter] = symmlq(A,b,...) также возвращает номер итерации, в котором x был вычислен, где 0 <= iter <= maxit.
[x,flag,relres,iter,resvec] = symmlq(A,b,...) также возвращает вектор оценок норм невязки symmlq в каждой итерации, включая norm(b-A*x0).
[x,flag,relres,iter,resvec,resveccg]
= symmlq(A,b,...) также возвращает вектор оценок норм невязки методов сопряженных градиентов в каждой итерации.
n = 100; on = ones(n,1); A = spdiags([-2*on 4*on -2*on],-1:1,n,n); b = sum(A,2); tol = 1e-10; maxit = 50; M1 = spdiags(4*on,0,n,n); x = symmlq(A,b,tol,maxit,M1); symmlq converged at iteration 49 to a solution with relative residual 4.3e-015
Этот пример заменяет матричный A в Примере 1 с указателем на функцию матричного векторного произведения afun. Пример содержится в функциональном run_symmlq что:
Вызовы symmlq с указателем на функцию @afun в качестве его первого аргумента.
Содержит afun как вложенную функцию, так, чтобы все переменные в run_symmlq были доступны afun.
Следующее показывает код для run_symmlq:
function x1 = run_symmlq
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 = symmlq(@afun,b,tol,maxit,M1);
function y = afun(x)
y = 4 * x;
y(2:n) = y(2:n) - 2 * x(1:n-1);
y(1:n-1) = y(1:n-1) - 2 * x(2:n);
end
endКогда вы входите
x1=run_symmlq;
MATLAB отображает сообщение
symmlq converged at iteration 49 to a solution with relative residual 4.3e-015
Используйте симметричную неопределенную матрицу, которая перестала работать с pcg.
A = diag([20:-1:1,-1:-1:-20]); b = sum(A,2); % The true solution is the vector of all ones. x = pcg(A,b); % Errors out at the first iteration. pcg stopped at iteration 1 without converging to the desired tolerance 1e-006 because a scalar quantity became too small or too large to continue computing. The iterate returned (number 0) has relative residual 1
Однако symmlq может обработать неопределенный матричный A.
x = symmlq(A,b,1e-6,40); symmlq converged at iteration 39 to a solution with relative residual 1.3e-007
[1] Барретт, R., М. Берри, Т. Ф. Чан, и др., Шаблоны для Решения Линейных систем: Стандартные блоки для Итерационных методов, SIAM, Филадельфия, 1994.
[2] Пэйдж, C. C. и М. А. Сондерс, "Решение Разреженных Неопределенных Систем Линейных уравнений". SIAM J. Numer. Анальный., Vol.12, 1975, стр 617-629.