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. Используя предварительный формирователь матрица может улучшить числовые свойства проблемы и КПД вычисления.

пример

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 и 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 object. The axes object 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 object. The axes object 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:

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 и 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

Матрицы перед формирователем в виде отдельных аргументов матриц или указателей на функцию. Можно задать матрицу перед формирователем M или его матричные факторы M = M1*M2 улучшить числовые аспекты линейной системы и облегчить для gmres сходиться быстро. Можно использовать неполные матричные функции факторизации ilu и ichol сгенерировать матрицы перед формирователем. Также можно использовать 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 тот с минимальной нормой невязки, вычисленной по всем итерациям.

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

Флаговое значение

Сходимость

0

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

1

Отказ — gmres выполненный с помощью итераций maxit итерации, но не сходились.

2

Отказ — матрица перед формирователем M или M = M1*M2 isIllConditioned.

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

[2] Саад, Иоюзф и Мартин Х. Шульц, “GMRES: обобщенный минимальный остаточный алгоритм для решения несимметричных линейных систем”, SIAM J. Научный Закон Comput., июль 1986, Издание 7, № 3, стр 856-869.

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

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