minres

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

Описание

пример

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

пример

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

пример

x = minres(A,b,tol,maxit) задает максимальное количество итераций для использования. minres отображает диагностическое сообщение, если оно не сходится в maxit итераций.

пример

x = minres(A,b,tol,maxit,M) задает симметричную положительно определенную матрицу прекондиционера M и вычисляет x путем эффективного решения системы H1AHTy=H1b для y, где y=HTx и H=M1/2=(M1M2)1/2. Алгоритм не образует H явно. Использование матрицы preconditioner может улучшить числовые свойства задачи и эффективность вычисления.

пример

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

пример

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

пример

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

пример

[x,flag,relres] = minres(___) также возвращает остаточную ошибку в вычисляемом решении. Если flag является 0, затем relres <= tol.

пример

[x,flag,relres,iter] = minres(___) также возвращает число итерации iter при котором x был вычислен.

пример

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

пример

[x,flag,relres,iter,resvec,resveccg] = minres(___) также возвращает вектор сопряженных градиентов норм невязки при каждой итерации.

Примеры

свернуть все

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

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

n = 400; 
on = ones(n,1); 
A = spdiags([-2*on 4*on -2*on],-1:1,n,n);
b = sum(A,2);

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

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

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

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

x = minres(A,b,1e-4,250);
minres converged at iteration 200 to a solution with relative residual 7e-13.

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

Создайте симметричную положительно определенную, разнесенную матрицу коэффициентов.

A = delsq(numgrid('S',102));

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

b = sum(A,2);

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

tol = 1e-12;
maxit = 100;

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

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

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

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

  • it0 - число итерации, когда x был вычислен.

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

  • rvcg0 является вектором сопряженной градиентной остаточной истории для ATAx-ATb.

[x,fl0,rr0,it0,rv0,rvcg0] = minres(A,b,tol,maxit);
fl0
fl0 = 1
rr0
rr0 = 0.0013
it0
it0 = 100

fl0 равен 1, потому что minres не сходится к запрошенному допуску 1e-12 в пределах запрошенных 100 итераций.

Для помощи с сходимостью можно задать матрицу предкондиционера. Начиная с A симметрично, используйте ichol чтобы сгенерировать предварительный кондиционер M=LLT. Задайте 'ict' опция, чтобы использовать неполные Факторизации Холесского с порогом отбрасыванием и задать значение диагонального сдвига 1e-6 чтобы избежать непозитивного поворота. Решить предварительно обусловленную систему путем определения L и L' в качестве входов в minres.

setup = struct('type','ict','diagcomp',1e-6,'droptol',1e-14);
L = ichol(A,setup);
[x1,fl1,rr1,it1,rv1,rvcg1] = minres(A,b,tol,maxit,L,L');
fl1
fl1 = 0
rr1
rr1 = 2.6691e-15
it1
it1 = 4

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

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

semilogy(0:length(rv0)-1,rv0/norm(b),'-o')
hold on
semilogy(0:length(rv1)-1,rv1/norm(b),'-o')
yline(tol,'r--');
legend('No preconditioner','ICHOL 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, ICHOL preconditioner, Tolerance.

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

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

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

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

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

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

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

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

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

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

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

Решить линейную систему путем предоставления minres с указателем на функцию, который вычисляет 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 путем предоставления minres с указателем на функцию, который вычисляет A*x. Используйте допуск 1e-12 и 50 итераций.

b = ones(21,1);
tol = 1e-12;  
maxit = 50;
x1 = minres(@afun,b,tol,maxit)
minres converged at iteration 11 to a solution with relative residual 4.1e-16.
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 является большой разреженной матрицей или указателем на функцию, который возвращает продукту больших разреженной матрицы и вектора-столбца. Вы можете использовать issymmetric чтобы подтвердить, что A симметрично.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

свернуть все

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

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

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

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

Сходимость

0

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

1

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

2

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

3

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

4

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

5

Отказ - матрица предварительной подготовки M не симметрично положительно определено.

Относительная остаточная ошибка, возвращенная как скаляр. Относительная остаточная ошибка является показателем того, насколько точен возвращенный ответ x является. minres отслеживает относительные остаточные и сопряженные градиенты, остаточные при каждой итерации в процессе решения, и алгоритм сходится, когда любой из них достигает заданного допуска tol. The relres выход содержит значение сходящейся невязки, относительных невязок или сопряженных градиентов невязки:

  • Относительная остаточная ошибка равна norm(b-A*x)/norm(b) и обычно является невязкой, который соответствует допуску tol когда minres сходится. The resvec выход отслеживает историю этого невязки по всем итерациям.

  • Сопряженная градиентная остаточная ошибка равна norm(A'*A*x - A'*b). Эта остаточная причина minres сходиться реже, чем относительная невязка. The resveccg выход отслеживает историю этого невязки по всем итерациям.

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

Число итерации, возвращенное как скаляр. Этот выход указывает номер итерации, при котором вычисленный ответ для x была рассчитана.

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

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

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

Сопряженные градиенты норм невязки, возвращенные как вектор. Количество элементов в resveccg равно количеству итераций.

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

Подробнее о

свернуть все

Метод минимальных невязок

Методы MINRES и SYMMLQ являются вариантами метода Ланцоса, который лежит в основе сопряженного метода градиентов PCG. Как и PCG, матрица коэффициентов все еще должна быть симметричной, но MINRES и SYMMLQ позволяют ей быть неопределенной (не все собственные значения должны быть положительными). Это достигается путем предотвращения неявной LU-факторизации, обычно присутствующей в методе Ланцоса, которая склонна к поломкам, когда с неопределенными матрицами встречается нулевой центр.

MINRES минимизирует невязку в 2-норме, в то время как SYMMLQ решает проектируемую систему с помощью факторизации LQ и сохраняет невязку ортогональными всеми предыдущими таковыми. Метод GMRES был разработан для обобщения MINRES до несимметричных проблем [1].

Совет

  • Сходимость большинства итерационных методов зависит от числа обусловленности матрицы коэффициентов, 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] Пейдж, С. С. и М. А. Сондерс, «Решение разреженных неопределенных систем линейных уравнений». SIAM J. Numer. Анал., Vol.12, 1975, стр. 617-629.

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

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