Обобщенный метод минимальных невязок (с перезапусками)
x = gmres(A,b)
gmres(A,b,restart)
gmres(A,b,restart,tol)
gmres(A,b,restart,tol,maxit)
gmres(A,b,restart,tol,maxit,M)
gmres(A,b,restart,tol,maxit,M1,M2)
gmres(A,b,restart,tol,maxit,M1,M2,x0)
[x,flag] = gmres(A,b,...)
[x,flag,relres] = gmres(A,b,...)
[x,flag,relres,iter] = gmres(A,b,...)
[x,flag,relres,iter,resvec] = gmres(A,b,...)
x = gmres(A,b)
попытки решить систему линейных уравнений A*x = b
для x
затем
- n
матрица коэффициентов A
должно быть квадратным и должен быть большим и разреженным. Вектор-столбец b
должен иметь длину n
A
может быть указатель на функцию, afun
, таким образом, что afun(x)
возвращает A*x
. Для этого синтаксиса, gmres
не перезапускает; максимальным количеством итераций является min(n,10)
.
Параметризация Функций объясняет, как предоставить дополнительные параметры функциональному afun
, а также предварительный формирователь функционирует mfun
описанный ниже, при необходимости.
Если gmres
сходится, сообщение к тому эффекту отображено. Если gmres
сбои, чтобы сходиться после максимального количества итераций или остановов по любой причине, предупреждающее сообщение распечатано, отобразив относительный остаточный norm(b-A*x)/norm(b)
и номер итерации, в который метод, остановленный или отказавший.
gmres(A,b,restart)
перезапускает метод каждый restart
внутренние итерации. Максимальным количеством внешних итераций является min(n/restart,10)
. Максимальным количеством общих итераций является restart*min(n/restart,10)
. Если restart
n
или []
, затем gmres
не перезапускает и максимальным количеством общих итераций является min(n,10)
.
gmres(A,b,restart,tol)
задает допуск метода. Если tol
[]
, затем gmres
использует значение по умолчанию, 1e-6
.
gmres(A,b,restart,tol,maxit)
задает максимальное количество внешних итераций, т.е. общее количество итераций не превышает restart*maxit
. Если maxit
[]
затем gmres
использует значение по умолчанию, min(n/restart,10)
. Если restart
n
или []
, затем максимальным количеством общих итераций является maxit
(вместо restart*maxit
).
gmres(A,b,restart,tol,maxit,M)
и gmres(A,b,restart,tol,maxit,M1,M2)
используйте предварительный формирователь M
или M = M1*M2
и эффективно решите систему inv(M)*A*x = inv(M)*b
для x
. Если M
[]
затем gmres
не применяет предварительного формирователя. M
может быть указатель на функцию mfun
таким образом, что mfun(x)
возвращает M\x
.
gmres(A,b,restart,tol,maxit,M1,M2,x0)
задает первое исходное предположение. Если x0
[]
, затем gmres
использует значение по умолчанию, все-нулевой вектор.
[x,flag] = gmres(A,b,...)
также возвращает флаг сходимости:
|
|
|
|
| Предварительный формирователь |
|
|
Каждый раз, когда flag
не 0
, решение x
возвращенный то, что с минимальной невязкой нормы, вычисленной по всем итерациям. Никакие сообщения не отображены если flag
выход задан.
[x,flag,relres] = gmres(A,b,...)
также возвращает относительный остаточный norm(b-A*x)/norm(b)
. Если flag
0
, relres <= tol
. Третий выход, relres
, относительная невязка предобусловленной системы.
[x,flag,relres,iter] = gmres(A,b,...)
также возвращает и внешние и внутренние числа итерации в который x
был вычислен, где 0 <= iter(1) <= maxit
и 0 <= iter(2) <= restart
.
[x,flag,relres,iter,resvec] = gmres(A,b,...)
также возвращает вектор норм невязки в каждой внутренней итерации. Это нормы невязки для предобусловленной системы.
A = gallery('wilk',21); b = sum(A,2); tol = 1e-12; maxit = 15; M1 = diag([10:-1:1 1 1:10]); x = gmres(A,b,10,tol,maxit,M1);
отображения следующее сообщение:
gmres(10) converged at outer iteration 2 (inner iteration 9) to a solution with relative residual 3.3e-013
Этот пример заменяет матричный A
в предыдущем примере с указателем на матричное векторное произведение функционируют afun
, и предварительный формирователь M1
с указателем на backsolve функционируют mfun
. Пример содержится в функциональном run_gmres
это
Вызовы gmres
с указателем на функцию @afun
в качестве его первого аргумента.
Содержит afun
и mfun
как вложенные функции, так, чтобы все переменные в run_gmres
доступны для afun
и mfun
.
Следующее показывает код для run_gmres
:
function x1 = run_gmres n = 21; b = afun(ones(n,1)); tol = 1e-12; maxit = 15; x1 = gmres(@afun,b,10,tol,maxit,@mfun); function y = afun(x) y = [0; x(1:n-1)] + ... [((n-1)/2:-1:0)'; (1:(n-1)/2)'].*x + ... [x(2:n); 0]; end function y = mfun(r) y = r ./ [((n-1)/2:-1:1)'; 1; (1:(n-1)/2)']; end end
Когда вы входите
x1 = run_gmres;
MATLAB отображает сообщение
gmres(10) converged at outer iteration 2 (inner iteration 10) to a solution with relative residual 1.1e-013.
Этот пример демонстрирует использование предварительного формирователя, не перезапуская gmres
.
Загрузите west0479
, действительное 479 479 несимметричная разреженная матрица.
load west0479;
A = west0479;
Установите допуск и максимальное количество итераций.
tol = 1e-12; maxit = 20;
Задайте b
так, чтобы истинное решение было вектором из всех единиц.
b = full(sum(A,2)); [x0,fl0,rr0,it0,rv0] = gmres(A,b,[],tol,maxit);
fl0
1 потому что gmres
не сходится к требуемому допуску 1e-12
в требуемых 20 итерациях. Лучшее приближенное решение, что gmres
возвраты являются последним (как обозначено it0(2) = 20
). MATLAB хранит остаточную историю в rv0
.
Постройте поведение gmres
.
semilogy(0:maxit,rv0/norm(b),'-o'); xlabel('Iteration number'); ylabel('Relative residual');
График показывает, что решение медленно сходится. Предварительный формирователь может улучшить результат.
Используйте ilu
сформировать предварительный формирователь, начиная с A
несимметрично.
[L,U] = ilu(A,struct('type','ilutp','droptol',1e-5));
Error using ilu There is a pivot equal to zero. Consider decreasing the drop tolerance or consider using the 'udiag' option.
Обратите внимание, что MATLAB не может создать неполный LU, когда это привело бы к сингулярному фактору, который бесполезен как предварительный формирователь.
Как обозначено сообщением об ошибке, попробуйте еще раз с уменьшаемым допуском отбрасывания.
[L,U] = ilu(A,struct('type','ilutp','droptol',1e-6)); [x1,fl1,rr1,it1,rv1] = gmres(A,b,[],tol,maxit,L,U);
fl1
0 потому что gmres
управляет относительной невязкой к 9.5436e-14
(значение rr1
). Относительная невязка меньше предписанного допуска 1e-12
в шестой итерации (значение it1(2)
) когда предобусловленный неполной LU-факторизацией с допуском отбрасывания 1e-6
. Выход, rv1(1)
, norm(M\b)
, где M = L*U
. Выход, rv1(7)
, norm(U\(L\(b-A*x1)))
.
Следуйте за прогрессом gmres
путем графического вывода относительных остаточных значений в каждой итерации, начинающей с первоначальной оценки (выполняют итерации номера 0).
semilogy(0:it1(2),rv1/norm(b),'-o'); xlabel('Iteration number'); ylabel('Relative residual');
Этот пример демонстрирует использование предварительного формирователя с перезапущенным gmres
.
Загрузите west0479
, действительное 479 479 несимметричная разреженная матрица.
load west0479;
A = west0479;
Задайте b
так, чтобы истинное решение было вектором из всех единиц.
b = full(sum(A,2));
Создайте неполный предварительный формирователь LU как в предыдущем примере.
[L,U] = ilu(A,struct('type','ilutp','droptol',1e-6));
Преимущество к использованию перезапущенного gmres
должен ограничить объем памяти, требуемый выполнить метод. Без перезапуска, gmres
требует maxit
векторы устройства хранения данных, чтобы сохранить основание подпространства Крылова. Кроме того, gmres
должен ортогонализировать против всех предыдущих векторов на каждом шаге. Перезапуск ограничивает количество используемой рабочей области и объем работы, сделанный на внешнюю итерацию. Обратите внимание на то, что даже при том, что предобусловленный gmres
сходившийся в шести итерациях выше, алгоритм допускал целых двадцать базисных векторов и поэтому, выделил все то место впереди.
Выполните gmres(3)
, gmres(4)
, и gmres(5)
tol = 1e-12; maxit = 20; re3 = 3; [x3,fl3,rr3,it3,rv3] = gmres(A,b,re3,tol,maxit,L,U); re4 = 4; [x4,fl4,rr4,it4,rv4] = gmres(A,b,re4,tol,maxit,L,U); re5 = 5; [x5,fl5,rr5,it5,rv5] = gmres(A,b,re5,tol,maxit,L,U);
fl3
, fl4
, и fl5
весь 0, потому что в каждом случае перезапустил gmres
управляет относительной невязкой к меньше, чем предписанный допуск 1e-12
.
Следующие графики показывают, что истории сходимости каждого перезапустили gmres
метод. gmres(3)
сходится во внешней итерации 5, внутренняя итерация 3 (it3 = [5, 3]
) который совпал бы с внешней итерацией 6, внутренняя итерация 0, следовательно маркировка 6 на итоговой отметке деления.
figure semilogy(1:1/3:6,rv3/norm(b),'-o'); h1 = gca; h1.XTick = [1:1/3:6]; h1.XTickLabel = ['1';' ';' ';'2';' ';' ';'3';' ';' ';'4';' ';' ';'5';' ';' ';'6';]; title('gmres(3)') xlabel('Iteration number'); ylabel('Relative residual');
figure semilogy(1:1/4:3,rv4/norm(b),'-o'); h2 = gca; h2.XTick = [1:1/4:3]; h2.XTickLabel = ['1';' ';' ';' ';'2';' ';' ';' ';'3']; title('gmres(4)') xlabel('Iteration number'); ylabel('Relative residual');
figure semilogy(1:1/5:2.8,rv5/norm(b),'-o'); h3 = gca; h3.XTick = [1:1/5:2.8]; h3.XTickLabel = ['1';' ';' ';' ';' ';'2';' ';' ';' ';' ']; title('gmres(5)') xlabel('Iteration number'); ylabel('Relative residual');
Барретт, R., М. Берри, Т. Ф. Чан, и др., Шаблоны для Решения Линейных систем: Базовые блоки для Итерационных методов, SIAM, Филадельфия, 1994.
Саад, Юсеф и Мартин Х. Шульц, “GMRES: обобщенный минимальный остаточный алгоритм для решения несимметричных линейных систем”, SIAM J. Научный Закон Comput., июль 1986, Издание 7, № 3, стр 856-869.
bicg
| bicgstab
| cgs
| equilibrate
| ilu
| lsqr
| minres
| mldivide
| pcg
| qmr
| symmlq