22.3 Итеративные методы, применяемые к разреженным матрицам ¶
Операторы левого деления \ и правого деления /, обсуждавшиеся в предыдущем разделе, используют прямые решатели для решения линейного уравнения вида x = A \ b или x = b / A. Octave также включает ряд функций для решения разреженных линейных уравнений с помощью итеративных методов.
-
:
x =pcg(A, b, tol, maxit, m1, m2, x0, …)¶ -
:
x =pcg(A, b, tol, maxit, M, [], x0, …)¶ -
:
[x, flag, relres, iter, resvec, eigest] =pcg(A, b, …)¶ -
Решает систему линейных уравнений
A * x = bс помощью итерационного метода предварительно обусловленного сопряжённого градиента.Входные аргументы:
-
A — матрица линейной системы, она должна быть квадратной. A может быть передана в виде матрицы, дескриптора функции или встроенной функции
Afcnтаким образом, чтобыAfcn(x) = A * x. Дополнительные параметры дляAfcnмогут передаваться после x0.A должна быть эрмитовой и положительно определённой (ЭПО). Если
pcgобнаружит, что A не является положительно определённой, выводится предупреждение, а выходной параметр flag устанавливается. - b — вектор правой части.
-
tol — требуемая относительная погрешность остатка,
b - A * x. Итерация останавливается, еслиnorm (b - A * x)≤tol * norm (b). Если tol опущена или пуста, используется значение 1e-6. - maxit — максимальное количество разрешённых итераций; если maxit опущена или пуста, используется значение 20.
-
m — матрица предварительного обуславливания ЭПО. Для любого разложения
m = p1 * p2такого, чтоinv (p1) * A * inv (p2)является ЭПО, метод сопряжённых градиентов формально применяется к линейной системеinv (p1) * A * inv (p2) * y = inv (p1) * b, сx = inv (p2) * y(предобуславливание по разбиению). На практике на каждой итерации метода сопряжённых градиентов решается линейная система с матрицей m с помощьюmldivide. Если доступно конкретное разложениеm = m1 * m2(например, неполное холеское разложение a), то две матрицы m1 и m2 могут быть переданы, и относительные линейные системы решаются с помощью оператораmldivide. Обратите внимание, что правильный выбор предварительного обуславливания может значительно улучшить общую производительность метода. Вместо матриц m1 и m2, пользователь может передать две функции, возвращающие результаты применения обратной матрицы m1 и m2 к вектору. Если m1 опущена или пуста[], предварительное обуславливание не применяется. Если факторизация m недоступна, m2 может быть опущена или оставлена [], а входная переменная m1 может быть использована для передачи предварительного обуславливания m. - x0 — начальное приближение. Если x0 опущена или пуста, функция по умолчанию устанавливает x0 в нулевой вектор.
Аргументы, следующие за x0, обрабатываются как параметры и передаются соответствующим образом в любые функции (A или m1 или m2), которые были предоставлены
pcg. Смотрите примеры ниже для получения дополнительной информации.Выходные аргументы:
-
x — вычисленное приближение к решению
A * x = b. Если алгоритм не сошёлся, x — итерация с минимальным остатком. -
flag — отчёт о сходимости:
- 0: Алгоритм сошёлся в пределах заданной толерантности.
- 1: Алгоритм не сошёлся и достиг максимального числа итераций.
- 2: Матрица предварительного обуславливания является вырожденной.
- 3: Алгоритм застыл, т.е. абсолютное значение разницы между текущей итерацией x и предыдущей меньше
eps * norm (x,2). - 4: Алгоритм обнаруживает, что входная (предобусловленная) матрица не является ЭПО.
- relres — отношение конечного остатка к начальному значению, измеренному в евклидовой норме.
-
iter — указывает итерацию x, на которой оно было вычислено. Поскольку выходной параметр x соответствует решению с минимальным остатком, общее количество итераций, выполненных методом, задаётся
length(resvec) - 1. -
resvec — описывает историю сходимости метода.
resvec (i, 1)— евклидова норма остатка, иresvec (i, 2)— норма предобусловленного остатка, после (i-1)-й итерации,i = 1, 2, …, iter+1. Норма предобусловленного остатка определяется какr' * (m \ r)гдеr = b - A * x, см. также описание m. Если eigest не требуется, возвращается толькоresvec (:, 1). -
eigest возвращает оценку наименьшего
eigest(1)и наибольшегоeigest(2)собственных значений предобусловленной матрицыP = m \ A. В частности, если предварительное обуславливание не используется, возвращаются оценки экстремальных собственных значений A.eigest(1)— переоценка, аeigest(2)— недооценка, так чтоeigest(2) / eigest(1)— нижняя граница дляcond (P, 2), которая тем не менее в пределе теоретически должна быть равна фактическому значению числа обусловленности.
Рассмотрим тривиальную задачу с тридиагональной матрицей
n = 10; A = toeplitz (sparse ([1, 1], [1, 2], [2, 1], 1, n)); b = A * ones (n, 1); M1 = ichol (A); # in this tridiagonal case it corresponds to chol (A)' M2 = M1'; M = M1 * M2; Afcn = @(x) A * x; Mfcn = @(x) M \ x; M1fcn = @(x) M1 \ x; M2fcn = @(x) M2 \ x;
ПРИМЕР 1: Самое простое использование
pcgx = pcg (A, b)
ПРИМЕР 2:
pcgс функцией, которая вычисляетA * xx = pcg (Afcn, b)
ПРИМЕР 3:
pcgс матрицей предварительного обуславливания Mx = pcg (A, b, 1e-06, 100, M)
ПРИМЕР 4:
pcgс функцией в качестве предварительного обуславливанияx = pcg (Afcn, b, 1e-6, 100, Mfcn)
ПРИМЕР 5:
pcgс матрицами предварительного обуславливания M1 и M2x = pcg (A, b, 1e-6, 100, M1, M2)
ПРИМЕР 6:
pcgс функциями в качестве предварительных обуславливанийx = pcg (Afcn, b, 1e-6, 100, M1fcn, M2fcn)
ПРИМЕР 7:
pcgс функцией, требующей аргументаfunction y = Ap (A, x, p) # compute A^p * x y = x; for i = 1:p y = A * y; endfor endfunction Apfcn = @(x, p) Ap (A, x, p); x = pcg (Apfcn, b, [], [], [], [], [], 2);ПРИМЕР 8: явный пример, чтобы показать, что
pcgиспользует предварительное обуславливание по разбиениюM1 = ichol (A + 0.1 * eye (n)); # factorization of A perturbed M2 = M1'; M = M1 * M2; ## reference solution computed by pcg after two iterations [x_ref, fl] = pcg (A, b, [], 2, M) ## split preconditioning [y, fl] = pcg ((M1 \ A) / M2, M1 \ b, [], 2) x = M2 \ y # compare x and x_ref
Ссылки:
- C.T. Kelley, Итерационные методы для линейных и нелинейных уравнений, SIAM, 1995. (основной алгоритм PCG)
- Y. Saad, Итерационные методы для разреженных линейных систем, PWS 1996. (оценка числа обусловленности из PCG) Переработанная версия этой книги доступна онлайн по адресу https://www-users.cs.umn.edu/~saad/books.html
-
A — матрица линейной системы, она должна быть квадратной. A может быть передана в виде матрицы, дескриптора функции или встроенной функции
-
:
x =pcr(A, b, tol, maxit, m, x0, …)¶ -
:
[x, flag, relres, iter, resvec] =pcr(…)¶ -
Решите систему линейных уравнений
A * x = bс помощью итерационного метода Предварительно обусловленных сопряжённых градиентов.Входные аргументы:
-
A может быть квадратной (желательно разреженной) матрицей или дескриптором функции, встроенной функцией или строкой, содержащей имя функции, которая вычисляет
A * x. В принципе, A должна быть симметричной и невырожденной; еслиpcrобнаружит, что A численно вырождена, будет выведено сообщение об ошибке, и выходной параметр flag будет установлен. - b — вектор правой части.
-
tol — требуемая относительная погрешность остатка,
b - A * x. Итерация прекращается, еслиnorm (b - A * x) <= tol * norm (b - A * x0). Если tol пустая или опущена, функция устанавливает значение по умолчаниюtol = 1e-6. -
maxit — максимальное допустимое количество итераций; если
[]задано для maxit, илиpcrимеет меньше аргументов, используется значение по умолчанию, равное 20. -
m — матрица (левого) предварительного условия, так что итерация (теоретически) эквивалентна решению с помощью
pcrP * x = m \ b, приP = m \ A. Обратите внимание, что правильный выбор предварительного условия может значительно улучшить общую производительность метода. Вместо матрицы m пользователь может передать функцию, которая возвращает результат применения обратной m к вектору (обычно это предпочтительный способ использования предварительного условия). Если[]задано для m, или m опущено, предварительное условие не применяется. - x0 — начальное приближение. Если x0 пустая или опущена, функция устанавливает x0 по умолчанию в нулевой вектор.
Аргументы, следующие за x0, рассматриваются как параметры и передаются соответствующим образом в любую из функций (A или m), которые переданы в
pcr. См. примеры ниже для получения дополнительной информации.Выходные аргументы:
-
x — вычисленное приближение решения
A * x = b. -
flag сообщает о сходимости.
flag = 0означает, что решение сошлось, и критерий точности, заданный tol, удовлетворён.flag = 1означает, что было достигнуто ограничение maxit по количеству итераций.flag = 3сообщает оpcrразрыве, см. [1] для получения подробностей. - relres — отношение конечного остатка к его начальному значению, измеренному в евклидовой норме.
- iter — фактическое количество выполненных итераций.
-
resvec описывает историю сходимости метода, так что
resvec (i)содержит евклидовы нормы остатка после (i-1)-й итерации,i = 1,2, …, iter+1.
Рассмотрим тривиальную задачу с диагональной матрицей (мы используем разреженность A)
n = 10; A = sparse (diag (1:n)); b = rand (N, 1);
ПРИМЕР 1: Самое простое использование
pcrx = pcr (A, b)
ПРИМЕР 2:
pcrс функцией, вычисляющейA * x.function y = apply_a (x) y = [1:10]' .* x; endfunction x = pcr ("apply_a", b)ПРИМЕР 3: Итерация с предварительным условием, с полными диагностическими данными. Предварительное условие (довольно странное, потому что даже исходная матрица A тривиальна) определяется как функция
function y = apply_m (x) k = floor (length (x) - 2); y = x; y(1:k) = x(1:k) ./ [1:k]'; endfunction [x, flag, relres, iter, resvec] = ... pcr (A, b, [], [], "apply_m") semilogy ([1:iter+1], resvec);ПРИМЕР 4: Наконец, предварительное условие, зависящее от параметра k.
function y = apply_m (x, varargin) k = varargin{1}; y = x; y(1:k) = x(1:k) ./ [1:k]'; endfunction [x, flag, relres, iter, resvec] = ... pcr (A, b, [], [], "apply_m"', [], 3)Ссылка:
В. Гакбуш, Итеративное решение больших разреженных систем уравнений, раздел 9.5.4; Springer, 1994
-
A может быть квадратной (желательно разреженной) матрицей или дескриптором функции, встроенной функцией или строкой, содержащей имя функции, которая вычисляет
Скорость сходимости итерационного решателя к решению может быть ускорена с использованием матрицы предварительного условия M. В этом случае вместо этого решается линейное уравнение M^-1 * x = M^-1 *
A \ b. Типичные матрицы предварительного условия являются частичными факторизациями исходной матрицы.
-
:
L =ichol(A)¶ -
:
L =ichol(A, opts)¶ -
Вычислить неполную факторизацию Холецкого разреженной квадратной матрицы A.
По умолчанию
icholиспользует только нижний треугольник A и создаёт нижнетреугольную факторизацию L такую, чтоL*L'приближает A.Факторизация, полученная этой функцией, может быть полезна в качестве предварительного условия для системы линейных уравнений, решаемых итерационными методами, такими как PCG (Предварительно обусловленные сопряжённые градиенты).
Факторизация может быть изменена путём передачи параметров в структуру opts. Название параметра является полем структуры, а значение — значением поля. Названия и спецификаторы чувствительны к регистру.
- type
-
Тип факторизации.
-
"nofill"(по умолчанию) -
Неполная факторизация Холецкого без заполнения (IC(0)).
"ict"Неполная факторизация Холецкого с отбрасыванием по порогу (ICT).
-
- diagcomp
-
Неотрицательный скаляр alpha для неполной факторизации Холецкого от
A + alpha * diag (diag (A))вместо A. Это может быть полезно, когда A не является положительно определённой. Значение по умолчанию — 0. - droptol
-
Неотрицательный скаляр, определяющий порог отбрасывания при факторизации, если используется ICT. Значение по умолчанию — 0, что приводит к полной факторизации Холецкого.
Недиагональные элементы L устанавливаются в 0, если
abs (L(i,j)) >= droptol * norm (A(j:end, j), 1). - michol
-
Модифицированная неполная факторизация Холецкого:
-
"off"(по умолчанию) -
Суммы строк и столбцов не обязательно сохраняются.
"on"Диагональ L модифицируется так, чтобы суммы строк (и столбцов) сохранялись даже тогда, когда элементы отбрасываются во время факторизации. Сохраняемое соотношение:
A * e = L * L' * e, где e — вектор единиц.
-
- shape
-
-
"lower"(по умолчанию) -
Используйте только нижний треугольник A и верните нижнетреугольную факторизацию L такую, что
L*L'приближает A. "upper"Используйте только верхний треугольник A и верните верхнетреугольную факторизацию U такую, что
U'*Uприближает A.
-
ПРИМЕРЫ
Следующая задача демонстрирует, как разложить примерную симметричную положительно определённую матрицу с полной факторизацией Холецкого и с неполной.
A = [ 0.37, -0.05, -0.05, -0.07; -0.05, 0.116, 0.0, -0.05; -0.05, 0.0, 0.116, -0.05; -0.07, -0.05, -0.05, 0.202]; A = sparse (A); nnz (tril (A)) ans = 9 L = chol (A, "lower"); nnz (L) ans = 10 norm (A - L * L', "fro") / norm (A, "fro") ans = 1.1993e-16 opts.type = "nofill"; L = ichol (A, opts); nnz (L) ans = 9 norm (A - L * L', "fro") / norm (A, "fro") ans = 0.019736Ещё один пример для разложения — матрица конечных разностей, используемая для решения задачи краевых значений на единичном квадрате.
nx = 400; ny = 200; hx = 1 / (nx + 1); hy = 1 / (ny + 1); Dxx = spdiags ([ones(nx, 1), -2*ones(nx, 1), ones(nx, 1)], [-1 0 1 ], nx, nx) / (hx ^ 2); Dyy = spdiags ([ones(ny, 1), -2*ones(ny, 1), ones(ny, 1)], [-1 0 1 ], ny, ny) / (hy ^ 2); A = -kron (Dxx, speye (ny)) - kron (speye (nx), Dyy); nnz (tril (A)) ans = 239400 opts.type = "nofill"; L = ichol (A, opts); nnz (tril (A)) ans = 239400 norm (A - L * L', "fro") / norm (A, "fro") ans = 0.062327Ссылки на реализованные алгоритмы:
[1] Ю. Саад. "Техники предварительного условия". Итерационные методы для разреженных систем линейных уравнений, PWS Publishing Company, 1996.
[2] М. Джонс, П. Плассман: Улучшенная неполная факторизация Холецкого, 1992.
-
:
LUA =ilu(A)¶ -
:
LUA =ilu(A, opts)¶ -
:
[L, U] =ilu(…)¶ -
:
[L, U, P] =ilu(…)¶ -
Вычисляет неполное LU-разложение разреженной квадратной матрицы A.
iluвозвращает единичную нижнюю треугольную матрицу L, верхнюю треугольную матрицу U и необязательно матрицу перестановок P, такие чтоL*UприближаетP*A.Факторы, полученные с помощью этой функции, могут быть полезны в качестве предобусловителей для системы линейных уравнений, решаемых итерационными методами, такими как BICG (Бисопряженные градиенты) или GMRES (Обобщённый метод наименьших остатков).
Разложение можно изменить, передав параметры в структуре opts. Имя параметра — поле структуры, а значение — значение поля. Имена и спецификаторы чувствительны к регистру.
type-
Тип разложения.
-
"nofill"(по умолчанию) -
ILU-разложение без заполнения (ILU(0)).
Дополнительные поддерживаемые параметры:
milu. "crout"-
Версия Crout ILU-разложения (ILUC).
Дополнительные поддерживаемые параметры:
milu,droptol. "ilutp"-
ILU-разложение с порогом и выбором опор.
Дополнительные поддерживаемые параметры:
milu,droptol,udiag,thresh.
-
droptol-
Неотрицательный скаляр, определяющий порог отбрасывания для разложения. Значение по умолчанию — 0, что даёт полное LU-разложение.
Недиагональные элементы U устанавливаются в 0, если
abs (U(i,j)) >= droptol * norm (A(:,j)).Недиагональные элементы L устанавливаются в 0, если
abs (L(i,j)) >= droptol * norm (A(:,j))/U(j,j). milu-
Модифицированное неполное LU-разложение:
"row"-
Модифицированное неполное LU-разложение по строкам. Разложение сохраняет суммы по строкам:
A * e = L * U * e, где e — вектор единиц. "col"-
Модифицированное неполное LU-разложение по столбцам. Разложение сохраняет суммы по столбцам:
e' * A = e' * L * U. -
"off"(по умолчанию) Суммы по строкам и столбцам не обязательно сохраняются.
udiag-
Если true, любые нули на диагонали верхней треугольной матрицы заменяются локальным порогом отбрасывания
droptol * norm (A(:,j))/U(j,j). По умолчанию false. threshПороговое значение для выбора опор при разложении. Может изменяться от 0 (выбор по диагонали) до 1 (по умолчанию), где выбирается элемент максимальной величины в столбце в качестве опоры.
Если
iluвызывается с одним выходным параметром, возвращаемая матрица —L + U - speye (size (A)), где L — единичная нижняя треугольная матрица, а U — верхняя треугольная матрица.С двумя выходными параметрами
iluвозвращает единичную нижнюю треугольную матрицу L и верхнюю треугольную матрицу U. Для opts.type =="ilutp", один из факторов переставляется в зависимости от значения opts.milu. Когда opts.milu =="row", U — верхняя треугольная матрица, переставленная по столбцам. В противном случае, L — единичная нижняя треугольная матрица, переставленная по строкам.Если есть три выходных параметра и opts.milu !=
"row", возвращается P так, что L и U являются неполными факторами отP*A. Когда opts.milu =="row", P возвращается так, что L и U являются неполными факторами отA*P.ПРИМЕРЫ
A = gallery ("neumann", 1600) + speye (1600); opts.type = "nofill"; nnz (A) ans = 7840 nnz (lu (A)) ans = 126478 nnz (ilu (A, opts)) ans = 7840Это показывает, что A имеет 7840 ненулевых элементов, полное LU-разложение — 126478 ненулевых, а неполное LU-разложение с 0 уровнем заполнения — 7840 ненулевых, то же количество, что и у A. Взято из: https://www.mathworks.com/help/matlab/ref/ilu.html
A = gallery ("wathen", 10, 10); b = sum (A, 2); tol = 1e-8; maxit = 50; opts.type = "crout"; opts.droptol = 1e-4; [L, U] = ilu (A, opts); x = bicg (A, b, tol, maxit, L, U); norm (A * x - b, inf)Этот пример использует ILU в качестве предобусловителя для случайной матрицы FEM, у которой большая число обусловленности. Без L и U BICG не сойдётся.
© 1996–2023 The Octave Project Developers
Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.
Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions.
https://docs.octave.org/v9.2.0/Iterative-Techniques.html