gmres

Решающая система линейных уравнений - обобщенный метод минимальных невязок

Описание

пример

x = gmres(A,b) пытается решить систему линейных уравнений A*x = b для x использование обобщенного метода минимальных невязок. Когда попытка успешна, gmres отображение сообщения для подтверждения сходимости. Если gmres не сходится после максимального количества итераций или остановок по какой-либо причине, оно отображает диагностическое сообщение, которое включает относительную невязку norm(b-A*x)/norm(b) и номер итерации, на котором остановился метод. Для этого синтаксиса, gmres не перезапускается; максимальное количество итераций min(size(A,1),10).

пример

x = gmres(A,b,restart) перезапускает метод каждый restart внутренние итерации. Максимальное количество внешних итераций outer = min(size(A,1)/restart,10). Максимальное количество итераций restart*outer, с gmres выполняет restart внутренние итерации для каждой внешней итерации. Если restart является size(A,1) или [], затем gmres не перезапускается и максимальное количество итераций min(size(A,1),10).

пример

x = gmres(A,b,restart,tol) задает допуск для метода. Допуск по умолчанию 1e-6.

пример

x = gmres(A,b,restart,tol,maxit) задает максимальное количество внешних итераций, так что общее количество итераций не превышает restart*maxit. Если maxit является [] затем gmres использует значение по умолчанию, min(size(A,1)/restart,10). Если restart является size(A,1) или [], затем максимальное количество итераций maxit (вместо restart*maxit). gmres отображает диагностическое сообщение, если оно не сходится в пределах максимального количества итераций.

пример

x = gmres(A,b,restart,tol,maxit,M) задает матрицу предварительной подготовки M и вычисляет x путем эффективного решения системы M1Ax=M1b. Использование матрицы preconditioner может улучшить числовые свойства задачи и эффективность вычисления.

пример

x = gmres(A,b,restart,tol,maxit,M1,M2) задает факторы матрицы предкондиционера M таким образом M = M1*M2.

пример

x = gmres(A,b,restart,tol,maxit,M1,M2,x0) задает начальное предположение для вектора решения x. По умолчанию это нулевой вектор.

пример

[x,flag] = gmres(___) возвращает флаг, который определяет, успешно ли сходился алгоритм. Когда flag = 0конвергенция прошла успешно. Можно использовать этот синтаксис выхода с любой из предыдущих комбинаций входных аргументов. Когда вы задаете flag выход, gmres не отображает никаких диагностических сообщений.

пример

[x,flag,relres] = gmres(___) также возвращает относительную невязку norm(M\(b-A*x))/norm(M\b), который включает матрицу предварительной подготовки M. Если flag является 0, затем relres <= tol.

пример

[x,flag,relres,iter] = gmres(___) также возвращает внутренние и внешние числа итерации, при которых x был вычислен как вектор [outer inner]. Число внешних итераций находится в области значений 0 <= iter(1) <= maxit и внутреннее число итерации находится в области значений 0 <= iter(2) <= restart.

пример

[x,flag,relres,iter,resvec] = gmres(___) также возвращает вектор норм невязки при каждой внутренней итерации, включая первую невязку norm(M\(b-A*x0)). Таковы нормы невязки для предварительно обусловленной системы.

Примеры

свернуть все

Решите квадратную линейную систему, используя gmres с настройками по умолчанию, а затем настроить допуск и количество итераций, используемых в процессе решения.

Создайте случайную разреженную матрицу A с плотностью 50% и ненулями на основной диагонали. Также создайте случайный вектор b для правой стороны Ax=b.

rng default
A = sprandn(400,400,0.5) + 12*speye(400);
b = rand(400,1);

Решить Ax=b использование gmres. Выход отображения включает в себя значение относительной остаточной ошибки b-Axb.

x = gmres(A,b);
gmres stopped at iteration 10 without converging to the desired tolerance 1e-06
because the maximum number of iterations was reached.
The iterate returned (number 10) has relative residual 0.35.

По умолчанию gmres использует 10 итераций и допуск 1e-6и алгоритм не может сходиться в этих 10 итерациях для этой матрицы. Поскольку невязка все еще велика, это хороший показатель того, что необходимо больше итераций (или матрица предкондиционера). Можно также использовать больший допуск, чтобы упростить сходимость алгоритма.

Снова решить систему с помощью допуска 1e-4 и 100 итераций.

tol = 1e-4;
maxit = 100;
x = gmres(A,b,[],tol,maxit);
gmres stopped at iteration 100 without converging to the desired tolerance 0.0001
because the maximum number of iterations was reached.
The iterate returned (number 100) has relative residual 0.0045.

Даже с более свободным допуском и большим количеством итераций остаточная ошибка недостаточно улучшается для сходимости. Когда итерационный алгоритм застопорится таким образом, это хорошее указание на то, что необходима матрица предкондиционера. Однако gmres также имеет вход, который управляет количеством внутренних итераций. Путем определения значения для внутренних итераций, gmres делает больше работы на каждую внешнюю итерацию.

Снова решить систему с помощью restart значение 100 и a maxit значение 20. Вместо того, чтобы делать 100 итераций один раз, gmres выполняет 100 итераций между перезапусками и повторяет это 20 раз.

restart = 100;
maxit = 20;
x = gmres(A,b,restart,tol,maxit);
gmres(100) converged at outer iteration 2 (inner iteration 75) to a solution with relative residual 9.3e-05.

В этом случае задается большое значение перезапуска для gmres позволяет ему сходиться к решению в пределах допустимого количества итераций. Однако большие значения перезапуска могут потреблять много памяти при A также является большим.

Исследуйте эффект использования матрицы предкондиционера с не перезапущенными gmres для решения линейной системы.

Загрузка west0479, действительная 479 на 479 несимметричная разреженная матрица.

load west0479
A = west0479;

Определите b чтобы истинное решение Ax=b является вектором всех таковых.

b = sum(A,2);

Установите допуск и максимальное количество итераций.

tol = 1e-12;
maxit = 20;

Использование gmres найти решение с требуемым допуском и количеством итераций. Укажите пять выходы, чтобы вернуть информацию о процессе решения:

  • x является вычисляемым решением для A*x = b.

  • fl0 является флагом, указывающим, сходился ли алгоритм.

  • rr0 - относительная невязка вычисляемого ответа x.

  • it0 является двухэлементным вектором [outer inner] указывает внутреннее и внешнее номера итерации при x был вычислен.

  • rv0 является вектором остаточной истории для b-Ax.

[x,fl0,rr0,it0,rv0] = gmres(A,b,[],tol,maxit);
fl0
fl0 = 1
rr0
rr0 = 0.7603
it0
it0 = 1×2

     1    20

fl0 равен 1, потому что gmres не сходится к запрошенному допуску 1e-12 в пределах запрошенных 20 итераций. Лучшее приблизительное решение, которое gmres возвраты - последний (как обозначено it0(2) = 20). MATLAB хранит историю остатков в rv0.

Для помощи с медленной сходимостью можно задать матрицу предкондиционера. Начиная с A несимметричен, используйте ilu чтобы сгенерировать предварительный кондиционер M=LU. Задайте допуск удаления, чтобы игнорировать недиагональные значения со значениями меньше 1e-6. Решение предварительно обусловленной системы M-1Ax=M-1b путем определения L и U в качестве входов в gmres. Обратите внимание, что когда вы задаете предварительное условие, gmres вычисляет норму невязки предварительно обусловленной системы для выходов rr1 и rv1.

[L,U] = ilu(A,struct('type','ilutp','droptol',1e-6));
[x1,fl1,rr1,it1,rv1] = gmres(A,b,[],tol,maxit,L,U);
fl1
fl1 = 0
rr1
rr1 = 7.2303e-14
it1
it1 = 1×2

     1     6

Использование ilu предварительное кондиционер создает относительную невязку меньше, чем предписанный допуск 1e-12 на шестой итерации. Первый остаточный rv1(1) является norm(U\(L\b)), где M = L*U. Последняя невязка rv1(end) является norm(U\(L\(b-A*x1))).

Можно следить за прогрессом gmres путем построения графика относительных невязок при каждой итерации. Постройте график истории остатков каждого решения с линией для заданного допуска.

semilogy(0:length(rv0)-1,rv0/norm(b),'-o')
hold on
semilogy(0:length(rv1)-1,rv1/norm(U\(L\b)),'-o')
yline(tol,'r--');
legend('No preconditioner','ILU preconditioner','Tolerance','Location','East')
xlabel('Iteration number')
ylabel('Relative residual')

Figure contains an axes. The axes contains 3 objects of type line, constantline. These objects represent No preconditioner, ILU preconditioner, Tolerance.

Использование предкондиционера с перезапущенными gmres.

Загрузка west0479, действительная 479 на 479 несимметричная разреженная матрица.

load west0479
A = west0479;

Определите b чтобы истинное решение Ax=b является вектором всех таковых.

b = sum(A,2);

Создайте неполный предварительный кондиционер LU с допуском на падение 1e-6.

[L,U] = ilu(A,struct('type','ilutp','droptol',1e-6));

Преимущество использования перезапущенных gmres ограничивает объем памяти, требуемый для выполнения метода. Без перезапуска, gmres требует maxit векторы памяти для хранения базиса подпространства Крылова. Кроме того, gmres должна быть ортогональна всем предыдущим векторам на каждом шаге. Перезапуск ограничивает количество используемой рабочей области и объем работы, проделанной за внешнюю итерацию.

Выполните gmres(3), gmres(4), и gmres(5) использование неполных факторов LU в качестве предварительных кондиционеров. Используйте допуск 1e-12 и максимум 20 внешних итераций.

tol = 1e-12;
maxit = 20;
[x3,fl3,rr3,it3,rv3] = gmres(A,b,3,tol,maxit,L,U);
[x4,fl4,rr4,it4,rv4] = gmres(A,b,4,tol,maxit,L,U);
[x5,fl5,rr5,it5,rv5] = gmres(A,b,5,tol,maxit,L,U);
fl3
fl3 = 0
fl4
fl4 = 0
fl5
fl5 = 0

fl3, fl4, и fl5 все 0, потому что в каждом случае перезапускаются gmres приводит относительную невязку к меньшему, чем предписанный допуск 1e-12.

Следующий график показывает историю сходимости каждого перезапущенного gmres способ. gmres(3) сходится во внешней итерации 5, внутренней итерации 3 (it3 = [5, 3]), которая будет такой же, как внешняя итерация 6, внутренняя итерация 0, следовательно, маркировка 6 на конечной отметке деления.

semilogy(1:1/3:6,rv3/norm(U\(L\b)),'-o');
h1 = gca;
h1.XTick = (1:6);
title('gmres(N) for N = 3, 4, 5')
xlabel('Outer iteration number');
ylabel('Relative residual');
hold on
semilogy(1:1/4:3,rv4/norm(U\(L\b)),'-o');
semilogy(1:1/5:2.8,rv5/norm(U\(L\b)),'-o');
yline(tol,'r--');
hold off
legend('gmres(3)','gmres(4)','gmres(5)','Tolerance')
grid on

Figure contains an axes. The axes with title gmres(N) for N = 3, 4, 5 contains 4 objects of type line, constantline. These objects represent gmres(3), gmres(4), gmres(5), Tolerance.

В целом, чем больше количество внутренних итераций, тем больше работы gmres делает по внешней итерации и тем быстрее она может сходиться.

Исследуйте эффект подачи gmres с начальным угадыванием решения.

Создайте трехугольную разреженную матрицу. Используйте сумму каждой строки в качестве вектора для правой оси графика Ax=b так, чтобы ожидаемое решение для x является вектором таковых.

n = 900;
e = ones(n,1);
A = spdiags([e 2*e e],-1:1,n,n);
b = sum(A,2);

Использование gmres решить Ax=b дважды: один раз с начальным предположением по умолчанию и один раз с хорошим начальным предположением решения. Используйте 200 итераций и допуск по умолчанию для обоих решений. Задайте начальное предположение во втором решении как вектор со всеми элементами, равными 0.99.

maxit = 200;
x1 = gmres(A,b,[],[],maxit);
gmres converged at iteration 27 to a solution with relative residual 9.5e-07.
x0 = 0.99*e;
x2 = gmres(A,b,[],[],maxit,[],[],x0);
gmres converged at iteration 7 to a solution with relative residual 6.7e-07.

В этом случае подача начального предположения включает gmres чтобы сходиться быстрее.

Возврат промежуточных результатов

Вы также можете использовать начальное предположение, чтобы получить промежуточные результаты по вызову gmres в цикле for-. Каждый вызов решателя выполняет несколько итераций и сохраняет вычисленное решение. Затем вы используете это решение в качестве начального вектора для следующего пакета итераций.

Для примера этот код выполняет 100 итераций четыре раза и сохраняет вектор решения после каждого прохода в цикле for-loop:

x0 = zeros(size(A,2),1);
tol = 1e-8;
maxit = 100;
for k = 1:4
    [x,flag,relres] = gmres(A,b,[],tol,maxit,[],[],x0);
    X(:,k) = x;
    R(k) = relres;
    x0 = x;
end

X(:,k) вектор решения вычисляется при итерации k системы for-loop и R(k) - относительная невязка этого решения.

Решить линейную систему путем предоставления gmres с указателем на функцию, который вычисляет A*x вместо матрицы коэффициентов A.

Одна из тестовых матриц Уилкинсона, сгенерированных gallery является тридиагональной матрицей 21 на 21. Предварительный просмотр матрицы.

A = gallery('wilk',21)
A = 21×21

    10     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
     1     9     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
     0     1     8     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     1     7     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     1     6     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     1     5     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     1     4     1     0     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     1     3     1     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     1     2     1     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     1     1     1     0     0     0     0     0     0     0     0     0     0
      ⋮

Матрица Уилкинсона имеет специальную структуру, поэтому можно представлять операцию A*x с указателем на функцию. Когда A умножает вектор, большинство элементов получившегося вектора являются нулями. Ненулевые элементы в результате соответствуют ненулевым триидиагональным элементам A. Кроме того, только главная диагональ имеет не ненули, которые не равны 1.

Выражение Ax становится:

Ax=[1010001910001810017100161001510014100130001000110][x1x2x3x4x5x21]=[10x1+x2x1+9x2+x3x2+8x3+x4x19+9x20+x21x20+10x21].

Получившийся вектор может быть записан как сумма трех векторов:

Ax=[0+10x1+x2x1+9x2+x3x2+8x3+x4x19+9x20+x21x20+10x21+0]=[0x1x20]+[10x19x210x21]+[x2x210].

В MATLAB ® запишите функцию, которая создает эти векторы и добавляет их вместе, таким образом придавая значение A*x:

function y = afun(x)
y = [0; x(1:20)] + ...
    [(10:-1:0)'; (1:10)'].*x + ...
    [x(2:21); 0];
end

(Эта функция сохранена как локальная функция в конце примера.)

Теперь решите линейную систему Ax=b путем предоставления gmres с указателем на функцию, который вычисляет A*x. Используйте допуск 1e-12, 15 внешних итераций и 10 внутренних итераций перед перезапуском.

b = ones(21,1);
tol = 1e-12;  
maxit = 15;
restart = 10;
x1 = gmres(@afun,b,restart,tol,maxit)
gmres(10) converged at outer iteration 5 (inner iteration 10) to a solution with relative residual 5.3e-13.
x1 = 21×1

    0.0910
    0.0899
    0.0999
    0.1109
    0.1241
    0.1443
    0.1544
    0.2383
    0.1309
    0.5000
      ⋮

Проверяйте это afun(x1) создает вектор таковых.

afun(x1)
ans = 21×1

    1.0000
    1.0000
    1.0000
    1.0000
    1.0000
    1.0000
    1.0000
    1.0000
    1.0000
    1.0000
      ⋮

Локальные функции

function y = afun(x)
y = [0; x(1:20)] + ...
    [(10:-1:0)'; (1:10)'].*x + ...
    [x(2:21); 0];
end

Входные параметры

свернуть все

Матрица коэффициентов, заданная как квадратная матрица или указатель на функцию. Эта матрица является матрицей коэффициентов в линейной системе A*x = b. Обычно A является большой разреженной матрицей или указателем на функцию, который возвращает продукту больших разреженной матрицы и вектора-столбца.

Определение A как указатель на функцию

Можно опционально задать матрицу коэффициентов как указатель на функцию вместо матрицы. Указатель на функцию возвращает матрично-векторные продукты вместо формирования всей матрицы коэффициентов, что делает вычисление более эффективным.

Чтобы использовать указатель на функцию, используйте сигнатуру функции function y = afun(x). Параметризация функций объясняет, как предоставить дополнительные параметры функции afun, при необходимости. Вызов функции afun(x) должен вернуть значение A*x.

Типы данных: double | function_handle
Поддержка комплексного числа: Да

Правая сторона линейного уравнения, заданная как вектор-столбец. Длина b должно быть равно size(A,1).

Типы данных: double
Поддержка комплексного числа: Да

Количество внутренних итераций перед перезапуском, заданное в виде скалярного целого числа. Используйте этот вход вместе с maxit вход для управления максимальным количеством итераций, restart*maxit. Если restart является [] или size(A,1), затем gmres не перезапускается и общее количество итераций maxit.

Большой restart значение обычно приводит к лучшему поведению сходимости, но также имеет более высокие требования к времени и памяти.

Типы данных: double

Допуск метода, заданный как положительная скалярная величина. Используйте этот вход для точности компромисса и времени выполнения в вычислении. gmres должен соответствовать допуску в пределах количества разрешенных итераций, которые должны быть успешными. Меньшее значение tol означает, что ответ должен быть более точным, чтобы вычисление было успешным.

Типы данных: double

Максимальное количество внешних итераций, заданное как положительное скалярное целое число. Увеличьте значение maxit чтобы разрешить больше итераций для gmres для достижения допуска tol. Как правило, чем меньше значение tolчем больше итераций требуется для успешного завершения вычисления.

Если на restart также задан вход, затем общее количество итераций restart*maxit. В противном случае общее количество итераций maxit.

Значение по умолчанию maxit зависит от того, restart задается:

  • Если restart не задан, или задан как [] или size(A,1), затем значение по умолчанию maxit является min(size(A,1),10).

  • Если restart задается как значение в области значений 1 <= restart < size(A,1), затем значение по умолчанию maxit является min(ceil(size(A,1)/restart),10).

Типы данных: double

Матрицы Preconditioner, заданные как отдельные аргументы матриц или указателей на функцию. Можно задать матрицу предварительной подготовки M или его матричные множители M = M1*M2 улучшить числовые аспекты линейной системы и облегчить ее gmres быстро сходиться. Можно использовать неполные функции матричного факторизации ilu и ichol чтобы сгенерировать матрицы preconditioner. Вы также можете использовать equilibrate перед факторизацией, чтобы улучшить число обусловленности матрицы коэффициентов. Для получения дополнительной информации о предварительных кондиционерах см. «Итерационные методы для линейных систем».

gmres рассматривает неопределенные предварительные кондиционеры как единичные матрицы.

Определение M как указатель на функцию

Вы можете опционально задать любой из M, M1, или M2 как указатели на функцию вместо матриц. Указатель на функцию выполняет матрично-векторные операции вместо того, чтобы сформировать целую матрицу предкондиционера, что делает вычисление более эффективным.

Чтобы использовать указатель на функцию, используйте сигнатуру функции function y = mfun(x). Параметризация функций объясняет, как предоставить дополнительные параметры функции mfun, при необходимости. Вызов функции mfun(x) должен вернуть значение M\x или M2\(M1\x).

Типы данных: double | function_handle
Поддержка комплексного числа: Да

Начальное предположение, заданное как вектор-столбец с длиной, равной size(A,2). Если вы можете предоставить gmres с более разумным исходным предположением x0 чем нулевой вектор по умолчанию, то он может сэкономить время расчета и помочь алгоритму сходиться быстрее.

Типы данных: double
Поддержка комплексного числа: Да

Выходные аргументы

свернуть все

Решение линейной системы, возвращаемое как вектор-столбец. Этот выход дает приблизительное решение линейной системы A*x = b. Если вычисление успешно (flag = 0), затем relres меньше или равно tol.

Всякий раз, когда расчет не успешен (flag ~= 0), решение x возвращено gmres - это тот, с минимальной нормой невязки, вычисленной по всем итерациям.

Флаг сходимости, возвращенный как одно из скалярных значений в этой таблице. Флаг сходимости указывает, было ли вычисление успешным, и различает несколько различных форм отказа.

Значение флага

Сходимость

0

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

1

Отказ - gmres итерация maxit итерации, но не сходились.

2

Отказ - матрица предварительной подготовки M или M = M1*M2 является плохо обусловленной.

3

Отказ - gmres застоя после двух последовательных итераций были одинаковыми.

4

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

Относительная остаточная ошибка, возвращенная как скаляр. Относительная остаточная ошибка relres = norm(M\(b-A*x))/norm(M\b) является показателем точности ответа. Обратите внимание, что gmres включает матрицу предварительной подготовки M в относительном остаточном вычислении, в то время как большинство других итерационных решателей не делают. Если вычисление сходится к допуску tol в пределах maxit итераций, затем relres <= tol.

Типы данных: double

Внешнее и внутреннее числа итерации, возвращенные как двухэлементный вектор [outer inner]. Этот выход указывает внутреннее и внешнее числа итерации, при которых вычисленный ответ для x рассчитывали:

  • Если restart не задан, или задан как [] или size(A,1), затем outer = 1 и все итерации рассматриваются как внутренние итерации.

  • Если restart задается как значение в области значений 1 <= restart < size(A,1), тогда число внешней итерации находится в области значений 0 <= outer <= maxit и внутреннее число итерации находится в области значений 0 <= inner <= restart.

Типы данных: double

Остаточная ошибка, возвращенная как вектор. Остаточная ошибка norm(M\(b-A*x)) показывает, насколько близок алгоритм к сходимости для заданного значения x. Обратите внимание, что gmres включает матрицу предварительной подготовки M в относительном остаточном вычислении, в то время как большинство других итерационных решателей не имеют. Количество элементов в resvec равно общему количеству итераций (если restart используется, это самое большее restart*maxit). Можно изучить содержимое resvec чтобы помочь решить, изменять ли значения restart, tol, или maxit.

Типы данных: double

Подробнее о

свернуть все

Обобщенный метод минимальных невязок

Обобщенный алгоритм минимального остаточного (GMRES) был разработан, чтобы расширить алгоритм минимального остаточного (MINRES) до несимметричных матриц.

Как и методы сопряженных градиентов (CG), алгоритм GMRES вычисляет ортогональные последовательности, но GMRES нужно хранить все предыдущие векторы в последовательностях. Это хранилище предыдущих векторов может потреблять много памяти, если оставить без проверки. «Перезапущенная» версия алгоритма управляет хранением этих последовательностей, периодически очищая промежуточные последовательности и используя результаты как начальное значение в другой итерации.

Выбор подходящего значения «перезапуска» имеет важное значение для хорошей эффективности, но выбор такого значения в основном является вопросом опыта. Если количество итераций перед перезапуском слишком мало, алгоритм может очень медленно сходиться или не сходиться полностью. Но если значение перезапуска слишком велико, то алгоритм имеет повышенные требования к памяти и может сделать ненужную работу [1].

Внутренние и внешние итерации

Внутренние итерации являются итерациями, которые gmres завершается перед перезапуском. Можно задать количество внутренних итераций с restart аргумент.

Каждый раз gmres перезапускается, число внешних итераций увеличивается. Можно задать максимальное количество внешних итераций с maxit аргумент. Количество внешних итераций по умолчанию min(size(A,1)/restart,10).

Для примера, если вы не задаете restart, затем максимальное количество итераций определяется значением maxit, и gmres не перезапускается:

If the restart argument is not specified and the value of maxit is 4, then gmres performs a total of 4 iterations.

Однако, когда вы задаете restart, gmres функция выполняет несколько внутренних итераций (заданных restart) для каждой внешней итерации (задается как maxit). В этом случае максимальное количество общих итераций restart*maxit:

If the restart argument is specified as 4, and the maxit argument is specified as 2, then gmres performs 4 inner iterations for each outer iteration for a total of 8 iterations.

Совет

  • Сходимость большинства итерационных методов зависит от числа обусловленности матрицы коэффициентов, cond(A). Вы можете использовать equilibrate улучшить число обусловленности Aи самостоятельно это облегчает сходимость большинства итерационных решателей. Однако использование equilibrate также приводит к более качественным матрицам предкондиционера, когда вы впоследствии факторизируете уравновешенную матрицу B = R*P*A*C.

  • Можно использовать матричные функции переупорядочивания, такие как dissect и symrcm чтобы переместить строки и столбцы матрицы коэффициентов и минимизировать количество ненулевых, когда матрица коэффициентов факторизирована, чтобы сгенерировать предварительное условие. Это может уменьшить память и время, необходимое для последующего решения предварительно обусловленной линейной системы.

Ссылки

[1] Barrett, R., M. Berry, T. F. Chan, et al., Templates for the Solution of Линейные Системы: Базовые блоки for Итерационные Методы, SIAM, Philadelphia, 1994.

[2] Saad, Yousef and Martin H. Schultz, «GMRES: Обобщенный минимальный остаточный алгоритм для решения несимметричных линейных систем», SIAM J. Sci.Comput., июль 1986, Vol. 7, No 3, pp. 856-869.

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

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