exponenta event banner

symmlq

Система решения линейных уравнений - симметричный метод LQ

Описание

пример

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

пример

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

пример

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

пример

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

пример

x = symmlq(A,b,tol,maxit,M1,M2) определяет коэффициенты матрицы предварительного условия M такой, что M = M1*M2.

пример

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

пример

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

пример

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

пример

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

пример

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

пример

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

Примеры

свернуть все

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

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

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

Решить Ax = b с помощьюsymmlq. Выходной дисплей включает в себя значение относительной остаточной ошибки b-Ax ‖ b ‖.

x = symmlq(A,b);
symmlq 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.045.

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

Повторное решение системы с использованием допуска 1e-4 и 250 итераций.

x = symmlq(A,b,1e-4,250);
symmlq converged at iteration 199 to a solution with relative residual 1.5e-14.

Анализ влияния использования матрицы предварительного кондиционирования с помощью symmlq для решения линейной системы.

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

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

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

b = sum(A,2);

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

tol = 1e-12;
maxit = 100;

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

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

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

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

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

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

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

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

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

Для облегчения сходимости можно указать матрицу предварительного условия. С тех пор A симметричен, используется ichol для создания устройства предварительного кондиционирования М = L LT. Укажите 'ict' использование неполной факторизации Холеского с понижением порога и указание значения диагонального сдвига 1e-6 во избежание непозволительных поворотов. Решение предварительно кондиционированной системы путем указания L и L' в качестве входных данных для symmlq.

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

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

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

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

Проверить влияние подачи symmlq с первоначальным предположением решения.

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

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

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

maxit = 200;
x1 = symmlq(A,b,[],maxit);
symmlq converged at iteration 34 to a solution with relative residual 9.5e-07.
x0 = 0.99*e;
x2 = symmlq(A,b,[],maxit,[],[],x0);
symmlq converged at iteration 6 to a solution with relative residual 8.7e-07.

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

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

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

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

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

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

Решение линейной системы путем предоставления symmlq с дескриптором функции, который вычисляет 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=[1010⋯⋯⋯001910001810⋮⋮0171001610⋮⋮0151001410⋮⋮013⋱000⋱⋱100⋯⋯⋯0110] [x1x2x3x4x5⋮⋮x21]=[10x1+x2x1+9x2+x3x2+8x3+x4⋮x19+9x20+x21x20+10x21].

Результирующий вектор может быть записан как сумма трех векторов:

Ax=[0+10x1+x2x1+9x2+x3x2+8x3+x4⋮x19+9x20+x21x20+10x21+0]=[0x1⋮x20]+[10x19x2⋮10x21]+[x2⋮x210].

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

b = ones(21,1);
tol = 1e-12;  
maxit = 50;
x1 = symmlq(@afun,b,tol,maxit)
symmlq converged at iteration 10 to a solution with relative residual 4.5e-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
Поддержка комплексного номера: Да

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

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

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

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

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

Определение M как дескриптор функции

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

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

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

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

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

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

свернуть все

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

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

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

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

Сходимость

0

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

1

Отказ - symmlq повторенный maxit итерации, но не сходились.

2

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

3

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

4

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

5

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

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

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

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

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

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

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

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

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

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

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

Подробнее

свернуть все

Симметричный метод LQ

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

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

Совет

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

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

Ссылки

[1] Барретт, Р., М. Берри, Т. Ф. Чан и др., Шаблоны для решения линейных систем: строительные блоки для итеративных методов, SIAM, Филадельфия, 1994.

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

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

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