symmlq

Симметричный метод 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, флаг] = symmlq (A, b...)
[x, флаг, relres] = symmlq (A, b...)
[x, флаг, relres, проход] = symmlq (A, b...)
[x, флаг, relres, проход, resvec] = symmlq (A, b...)
[x, флаг, relres, проход, 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

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

1

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

2

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

3

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

4

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

5

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

Каждый раз, когда 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,...) также возвращает вектор оценок норм невязки методов сопряженных градиентов в каждой итерации.

Примеры

Пример 1

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

Пример 2

Этот пример заменяет матричный 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

Пример 3

Используйте симметричную неопределенную матрицу, которая перестала работать с 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., M., Т. F. Чан, и др., Шаблоны для Решения Линейных систем: Стандартные блоки для Итеративных Методов, SIAM, Филадельфия, 1994.

[2] Пэйдж, C. C. и М. A. Сондерс, "Решение Разреженных Неопределенных Систем Линейных уравнений". SIAM J. Numer. Анальный., Vol.12, 1975, стр 617-629.

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

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

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