18.5 Специализированные решатели
- : x = bicg (A, b)
- : x = bicg (A, b, tol)
- : x = bicg (A, b, tol, maxit)
- : x = bicg (A, b, tol, maxit, M)
- : x = bicg (A, b, tol, maxit, M1, M2)
- : x = bicg (A, b, tol, maxit, M, [], x0)
- : x = bicg (A, b, tol, maxit, M1, M2, x0)
- : x = bicg (A, b, tol, maxit, M, [], x0, …)
- : x = bicg (A, b, tol, maxit, M1, M2, x0, …)
- : [x, flag, relres, iter, resvec] = bicg (A, b, …)
-
Решить систему линейных уравнений
A * x = bс помощью итерационного метода бисопряжённых градиентов.Входные аргументы:
- A — матрица линейной системы, должна быть квадратной. A может быть передана как матрица, дескриптор функции или анонимная функция
Afunтаким образом, чтоAfun (x, "notransp") = A * xиAfun (x, "transp") = A' * x. Дополнительные параметры дляAfunмогут быть переданы после x0. - b — вектор правой части. Должен быть вектором-столбцом с тем же числом строк, что и у A.
- tol — требуемая относительная толерантность для погрешности остатка
b - A * x. Итерация останавливается, еслиnorm (b - A * x)≤tol * norm (b). Если tol опущена или пуста, используется толерантность 1e-6. - maxit — максимальное разрешённое количество итераций; если maxit опущена или пуста, используется значение 20.
- M1, M2 — прекондиционеры. Прекондиционер M задаётся как
M = M1 * M2. Оба M1 и M2 могут быть переданы как матрица или как дескриптор функции или анонимная функцияgтаким образом, чтоg (x, "notransp") = M1 \ xилиg (x, "notransp") = M2 \ xиg (x, "transp") = M1' \ xилиg (x, "transp") = M2' \ x. Если M1 опущена или пуста, прекондиционирование не применяется. Предварительно обусловленная система теоретически эквивалентна применению методаbicgк линейной системеinv (M1) * A * inv (M2) * y = inv (M1) * bиinv (M2') * A' * inv (M1') * z = inv (M2') * bи затем установкеx = inv (M2) * y. - x0 — начальное приближение. Если x0 опущена или пуста, функция по умолчанию устанавливает x0 в нулевой вектор.
Любые аргументы, следующие за x0, рассматриваются как параметры и передаются соответствующим образом в любую из функций (Afun или Mfun) или которые были переданы
bicg.Выходные параметры:
- x — вычисленное приближение решения
A * x = b. Если алгоритм не сошёлся, то x — итерация с минимальным остатком. - flag указывает статус завершения:
- 0: Алгоритм сошёлся в пределах заданной толерантности.
- 1: Алгоритм не сошёлся и достиг максимального числа итераций.
- 2: Матрица прекондиционера является сингулярной.
- 3: Алгоритм достиг застоя, т.е. абсолютная величина разницы между текущей итерацией x и предыдущей меньше, чем
eps * norm (x,2). - 4: Алгоритм не смог продолжить из-за того, что промежуточные значения стали слишком малыми или слишком большими для надёжного вычисления.
- relres — отношение конечного остатка к его начальному значению, измеряемому в евклидовой норме.
- iter — итерация, на которой вычислено x.
- resvec — вектор, содержащий остаток на каждой итерации. Общее количество выполненных итераций задаётся
length (resvec) - 1.
Рассмотрим тривиальную задачу с треугольной матрицей
n = 20; A = toeplitz (sparse ([1, 1], [1, 2], [2, 1] * n ^ 2, 1, n)) + ... toeplitz (sparse (1, 2, -1, 1, n) * n / 2, ... sparse (1, 2, 1, 1, n) * n / 2); b = A * ones (n, 1); restart = 5; [M1, M2] = ilu (A); # in this tridiag case, it corresponds to lu (A) M = M1 * M2; Afun = @(x, string) strcmp (string, "notransp") * (A * x) + ... strcmp (string, "transp") * (A' * x); Mfun = @(x, string) strcmp (string, "notransp") * (M \ x) + ... strcmp (string, "transp") * (M' \ x); M1fun = @(x, string) strcmp (string, "notransp") * (M1 \ x) + ... strcmp (string, "transp") * (M1' \ x); M2fun = @(x, string) strcmp (string, "notransp") * (M2 \ x) + ... strcmp (string, "transp") * (M2' \ x);ПРИМЕР 1: самое простое использование
bicgx = bicg (A, b)
ПРИМЕР 2:
bicgс функцией, вычисляющейA*xиA'*xx = bicg (Afun, b, [], n)
ПРИМЕР 3:
bicgс матрицей прекондиционера Mx = bicg (A, b, 1e-6, n, M)
ПРИМЕР 4:
bicgс функцией как прекондиционеромx = bicg (Afun, b, 1e-6, n, Mfun)
ПРИМЕР 5:
bicgс матрицами прекондиционеров M1 и M2x = bicg (A, b, 1e-6, n, M1, M2)
ПРИМЕР 6:
bicgс функциями как прекондиционерамиx = bicg (Afun, b, 1e-6, n, M1fun, M2fun)
ПРИМЕР 7:
bicgс функцией, требующей аргументаfunction y = Ap (A, x, string, z) ## compute A^z * x or (A^z)' * x y = x; if (strcmp (string, "notransp")) for i = 1:z y = A * y; endfor elseif (strcmp (string, "transp")) for i = 1:z y = A' * y; endfor endif endfunction Apfun = @(x, string, p) Ap (A, x, string, p); x = bicg (Apfun, b, [], [], [], [], [], 2);Ссылка:
Y. Saad, Итерационные методы для разреженных линейных систем, второе издание, 2003, SIAM.
- A — матрица линейной системы, должна быть квадратной. A может быть передана как матрица, дескриптор функции или анонимная функция
- : x = bicgstab (A, b, tol, maxit, M1, M2, x0, …)
- : x = bicgstab (A, b, tol, maxit, M, [], x0, …)
- : [x, flag, relres, iter, resvec] = bicgstab (A, b, …)
-
Решить
A x = bс помощью итерационного метода стабилизированного бисопряжённого градиента.Входные параметры:
- - A — матрица линейной системы, должна быть квадратной. A может быть передана как матрица, дескриптор функции или анонимная функция
Afunтаким образом, чтоAfun(x) = A * x. Дополнительные параметры дляAfunпередаются после x0. - - b — вектор правой части. Должен быть вектором-столбцом с тем же числом строк, что и у A.
- - tol — требуемая относительная толерантность для погрешности остатка,
b - A * x. Итерация останавливается, еслиnorm (b - A * x)≤tol * norm (b). Если tol опущена или пуста, используется толерантность 1e-6. - - maxit — максимальное количество внешних итераций, если не задано или равно [], используется значение по умолчанию
min (20, numel (b)). - - M1, M2 — прекондиционеры. Прекондиционер M задаётся как
M = M1 * M2. Оба M1 и M2 могут быть переданы как матрица или как дескриптор функции или анонимная функцияgтаким образом, чтоg(x) = M1 \ xилиg(x) = M2 \ x. Используется правое прекондиционирование, т.е. решаетсяA * inv (M) * y = bи затемx = inv (M) * y. - - x0 — начальное приближение, если не задано или равно [], используется значение по умолчанию
zeros (size (b)).
Аргументы, следующие за x0, обрабатываются как параметры и передаются должным образом в любую из функций (A или M), которые передаются
bicstab.Выходные параметры:
- - x — вычисленное приближение. Если метод не сошелся, то это итерация с минимальным остатком.
- - flag указывает статус завершения:
- - 0: итерация сошлась в пределах выбранной толерантности
- - 1: максимальное число итераций было достигнуто до сходимости
- - 2: матрица прекондиционера является сингулярной
- - 3: алгоритм достиг застоя
- - 4: алгоритм не может продолжить из-за деления на ноль
- - relres — относительный остаток, полученный как
(A*x-b) /.norm(b) - - iter — (возможно, половина) итерация, на которой вычислено x. Если это половина итерации, то это
iter + 0.5 - - resvec — вектор, содержащий остаток на каждой половине и полной итерации (есть также половины итераций, так как x вычисляется в два шага на каждой итерации). Выполнение
(length(resvec) - 1) / 2позволяет увидеть общее количество (полных) итераций.
Рассмотрим тривиальную задачу с треугольной матрицей
n = 20; A = toeplitz (sparse ([1, 1], [1, 2], [2, 1] * n ^ 2, 1, n)) + ... toeplitz (sparse (1, 2, -1, 1, n) * n / 2, ... sparse (1, 2, 1, 1, n) * n / 2); b = A * ones (n, 1); restart = 5; [M1, M2] = ilu (A); # in this tridiag case, it corresponds to lu (A) M = M1 * M2; Afun = @(x) A * x; Mfun = @(x) M \ x; M1fun = @(x) M1 \ x; M2fun = @(x) M2 \ x;ПРИМЕР 1: самое простое использование
bicgstabx = bicgstab (A, b, [], n)
ПРИМЕР 2:
bicgstabс функцией, вычисляющейA * xx = bicgstab (Afun, b, [], n)
ПРИМЕР 3:
bicgstabс матрицей прекондиционера Mx = bicgstab (A, b, [], 1e-06, n, M)
ПРИМЕР 4:
bicgstabс функцией как прекондиционеромx = bicgstab (Afun, b, 1e-6, n, Mfun)
ПРИМЕР 5:
bicgstabс матрицами прекондиционеров M1 и M2x = bicgstab (A, b, [], 1e-6, n, M1, M2)
ПРИМЕР 6:
bicgstabс функциями как прекондиционерамиx = bicgstab (Afun, b, 1e-6, n, M1fun, M2fun)
ПРИМЕР 7:
bicgstabс функцией, требующей аргументаfunction y = Ap (A, x, z) # compute A^z * x y = x; for i = 1:z y = A * y; endfor endfunction Apfun = @(x, string, p) Ap (A, x, string, p); x = bicgstab (Apfun, b, [], [], [], [], [], 2);ПРИМЕР 8: явный пример, показывающий, что
bicgstabиспользует правое прекондиционирование[M1, M2] = ilu (A + 0.1 * eye (n)); # factorization of A perturbed M = M1 * M2; ## reference solution computed by bicgstab after one iteration [x_ref, fl] = bicgstab (A, b, [], 1, M) ## right preconditioning [y, fl] = bicgstab (A / M, b, [], 1) x = M \ y # compare x and x_ref
Ссылка:
Y. Saad, Итерационные методы для разреженных линейных систем, второе издание, 2003, SIAM
- - A — матрица линейной системы, должна быть квадратной. A может быть передана как матрица, дескриптор функции или анонимная функция
- : x = cgs (A, b, tol, maxit, M1, M2, x0, …)
- : x = cgs (A, b, tol, maxit, M, [], x0, …)
- : [x, flag, relres, iter, resvec] = cgs (A, b, …)
-
Решить
A x = b, где A — квадратная матрица, с помощью метода сопряжённых градиентов (Conjugate Gradients Squared).В качестве входных аргументов используются:
- - A — матрица линейной системы, и она должна быть квадратной. A может быть передана как матрица, дескриптор функции или встроенная функция
Afunтаким образом, чтоAfun(x) = A * x. Дополнительные параметры дляAfunпередаются после x0. - - b — вектор правой части. Он должен быть вектором-столбцом с таким же количеством строк, что и у A.
- - tol — относительная толерантность; если не указано или задано как [], используется значение по умолчанию 1e-6.
- - maxit — максимальное количество внешних итераций; если не указано или задано как [], используется значение по умолчанию
min (20, numel (b)). - - M1, M2 — прекондиционеры. Матрица прекондиционера задаётся как
M = M1 * M2. Как M1, так и M2 могут быть переданы как матрица, дескриптор функции или встроенная функцияgтаким образом, чтоg(x) = M1 \ xилиg(x) = M2 \ x. Если M1 пуста или не передана, прекондиционеры не применяются. Используется правая прекондиция, т.е. сначала решаетсяA*inv(M)*y = bи затемx = inv(M)*y. - - x0 — начальное приближение; если не указано или задано как [], используется значение по умолчанию
zeros (size (b)).
Аргументы, следующие за x0, рассматриваются как параметры и передаются соответствующим образом в любые функции (A или P), которые переданы в
cgs.Выходные параметры:
- - x — вычисленное приближение. Если метод не сходится, это значение с минимальным остатком.
- - flag указывает статус выхода:
- - 0: итерация сошлась в пределах заданной толерантности
- - 1: максимальное количество итераций достигнуто до схождения
- - 2: матрица прекондиционера является сингулярной
- - 3: алгоритм достиг застоя
- - 4: алгоритм не может продолжить из-за деления на ноль
- - relres — относительный остаток, полученный как
(A*x-b) /.norm(b) - - iter — итерация, на которой вычислено x.
- - resvec — вектор, содержащий остаток на каждой итерации. Выполнение
length(resvec) - 1позволяет увидеть общее количество выполненных итераций.
Рассмотрим тривиальную задачу с треугольной матрицей
n = 20; A = toeplitz (sparse ([1, 1], [1, 2], [2, 1] * n ^ 2, 1, n)) + ... toeplitz (sparse (1, 2, -1, 1, n) * n / 2, ... sparse (1, 2, 1, 1, n) * n / 2); b = A * ones (n, 1); restart = 5; [M1, M2] = ilu (A); # in this tridiag case it corresponds to chol (A)' M = M1 * M2; Afun = @(x) A * x; Mfun = @(x) M \ x; M1fun = @(x) M1 \ x; M2fun = @(x) M2 \ x;ПРИМЕР 1: простейшее использование
cgsx = cgs (A, b, [], n)
ПРИМЕР 2:
cgsс функцией, вычисляющейA * xx = cgs (Afun, b, [], n)
ПРИМЕР 3:
cgsс матрицей-прекондиционером Mx = cgs (A, b, [], 1e-06, n, M)
ПРИМЕР 4:
cgsс функцией в качестве прекондиционераx = cgs (Afun, b, 1e-6, n, Mfun)
ПРИМЕР 5:
cgsс матрицами-прекондиционерами M1 и M2x = cgs (A, b, [], 1e-6, n, M1, M2)
ПРИМЕР 6:
cgsс функциями в качестве прекондиционеровx = cgs (Afun, b, 1e-6, n, M1fun, M2fun)
ПРИМЕР 7:
cgsс функцией, требующей аргументfunction y = Ap (A, x, z) # compute A^z * x y = x; for i = 1:z y = A * y; endfor endfunction Apfun = @(x, string, p) Ap (A, x, string, p); x = cgs (Apfun, b, [], [], [], [], [], 2);ПРИМЕР 8: явный пример, показывающий, что
cgsиспользует правый прекондиционер[M1, M2] = ilu (A + 0.3 * eye (n)); # factorization of A perturbed M = M1 * M2; ## reference solution computed by cgs after one iteration [x_ref, fl] = cgs (A, b, [], 1, M) ## right preconditioning [y, fl] = cgs (A / M, b, [], 1) x = M \ y # compare x and x_ref
Ссылки:
Y. Saad, Итеративные методы для разреженных линейных систем, 2-е издание, 2003, SIAM
- - A — матрица линейной системы, и она должна быть квадратной. A может быть передана как матрица, дескриптор функции или встроенная функция
- : x = gmres (A, b, restart, tol, maxit, M1, M2, x0, …)
- : x = gmres (A, b, restart, tol, maxit, M, [], x0, …)
- : [x, flag, relres, iter, resvec] = gmres (A, b, …)
-
Решить
A x = bс помощью итерационного метода GMRES с прекондиционером и перестартом, т.е. PGMRES(restart).Входные аргументы:
- - A — матрица линейной системы, должна быть квадратной. A может быть передана как матрица, дескриптор функции или встроенная функция
Afunтаким образом, чтоAfun(x) = A * x. Дополнительные параметры дляAfunпередаются после x0. - - b — вектор правой части. Он должен быть вектором-столбцом с тем же количеством строк, что и у A.
- - restart — количество итераций перед перестартом метода. Если пусто или N = numel(b), перестартов нет.
- - tol — требуемая относительная толерантность для ошибки прекондиционированного остатка,
inv (M) * (b - a * x). Итерация останавливается, еслиnorm (inv (M) * (b - a * x)) ≤ tol * norm (inv (M) * B). Если tol опущено или пусто, используется толерантность 1e-6. - - maxit — максимальное количество внешних итераций; если не задано или равно [], используется значение по умолчанию
min (10, N / restart). Обратите внимание, что если restart пусто, то maxit — максимальное число итераций. Если restart и maxit не пусты, то максимальное количество итераций равноrestart * maxit. Если оба restart и maxit пусты, то максимальное количество итераций равноmin (10, N). - - M1, M2 — прекондиционеры. Прекондиционер M задаётся как
M = M1 * M2. Как M1, так и M2 могут быть переданы как матрица, дескриптор функции или встроенная функцияgтаким образом, чтоg(x) = M1 \ xилиg(x) = M2 \ x. Если M1 равно [] или не задано, прекондиционер не применяется. Используется левая прекондиция, т.е. решаетсяinv(M) * A * x = inv(M) * bвместоA * x = b. - - x0 — начальное приближение; если не задано или равно [], используется значение по умолчанию
zeros (size (b)).
Аргументы, следующие за x0, обрабатываются как параметры и передаются соответствующим образом в любые функции (A или M или M1 или M2), которые передаются в
gmres.Выходные данные:
- - x — вычисленное приближение. Если метод не сходится, это значение с минимальным остатком.
- - flag указывает статус выхода:
- 0 : итерация сошлась в пределах заданной толерантности
- 1 : максимальное количество итераций превышено
- 2 : матрица прекондиционера сингулярна
- 3 : алгоритм достиг застоя (относительная разница между двумя
последовательными итерациями меньше eps)
- - relres — значение относительного прекондиционированного остатка приближения x.
- - iter — вектор, содержащий количество внешних итераций и внутренних итераций, выполненных для вычисления x. То есть:
- iter(1): количество внешних итераций, т.е. сколько раз метод перестартовал. (если restart пусто или N, то 1, если нет, то 1 ≤ iter(1) ≤ maxit).
- iter(2): количество итераций, выполненных до пересчета, т.е. метод перестартует, когда
iter(2) = restart. Если restart пусто или N, то 1 ≤ iter(2) ≤ maxit.
Более подробно, приближение x вычисляется на итерации
(iter(1) - 1) * restart + iter(2). Поскольку вывод x соответствует решению с минимальным прекондиционированным остатком, общее количество итераций, выполненных методом, задаётсяlength (resvec) - 1. - - resvec — вектор, содержащий прекондиционированный относительный остаток на каждой итерации, включая 0-ю итерацию
norm (A * x0 - b).
Рассмотрим тривиальную задачу с треугольной матрицей
n = 20; A = toeplitz (sparse ([1, 1], [1, 2], [2, 1] * n ^ 2, 1, n)) + ... toeplitz (sparse (1, 2, -1, 1, n) * n / 2, ... sparse (1, 2, 1, 1, n) * n / 2); b = A * ones (n, 1); restart = 5; [M1, M2] = ilu (A); # in this tridiag case, it corresponds to lu (A) M = M1 * M2; Afun = @(x) A * x; Mfun = @(x) M \ x; M1fun = @(x) M1 \ x; M2fun = @(x) M2 \ x;ПРИМЕР 1: простейшее использование
gmresx = gmres (A, b, [], [], n)
ПРИМЕР 2:
gmresс функцией, вычисляющейA * xx = gmres (Afun, b, [], [], n)
ПРИМЕР 3: использование
gmresс перестартомx = gmres (A, b, restart);
ПРИМЕР 4:
gmresс матрицей-прекондиционером M с перестартом и без негоx = gmres (A, b, [], 1e-06, n, M) x = gmres (A, b, restart, 1e-06, n, M)
ПРИМЕР 5:
gmresс функцией в качестве прекондиционераx = gmres (Afun, b, [], 1e-6, n, Mfun)
ПРИМЕР 6:
gmresс матрицами-прекондиционерами M1 и M2x = gmres (A, b, [], 1e-6, n, M1, M2)
ПРИМЕР 7:
gmresс функциями в качестве прекондиционеровx = gmres (Afun, b, 1e-6, n, M1fun, M2fun)
ПРИМЕР 8:
gmresс функцией, требующей аргументfunction y = Ap (A, x, p) # compute A^p * x y = x; for i = 1:p y = A * y; endfor endfunction Apfun = @(x, p) Ap (A, x, p); x = gmres (Apfun, b, [], [], [], [], [], [], 2);ПРИМЕР 9: явный пример, показывающий, что
gmresиспользует левый прекондиционер[M1, M2] = ilu (A + 0.1 * eye (n)); # factorization of A perturbed M = M1 * M2; ## reference solution computed by gmres after two iterations [x_ref, fl] = gmres (A, b, [], [], 1, M) ## left preconditioning [x, fl] = gmres (M \ A, M \ b, [], [], 1) x # compare x and x_ref
Ссылки:
Y. Saad, Итеративные методы для разреженных линейных систем, 2-е издание, 2003, SIAM
- - A — матрица линейной системы, должна быть квадратной. A может быть передана как матрица, дескриптор функции или встроенная функция
- : x = qmr (A, b, rtol, maxit, M1, M2, x0)
- : x = qmr (A, b, rtol, maxit, P)
- : [x, flag, relres, iter, resvec] = qmr (A, b, …)
-
Решить
A x = bс использованием итерационного метода квазиминимального остатка (без предвычисления).- - rtol — относительная погрешность; если не задано или равно [], используется значение по умолчанию 1e-6.
- - maxit — максимальное число внешних итераций; если не задано или равно [], используется значение по умолчанию
min (20, numel (b)). - - x0 — начальное приближение; если не задано или равно [], используется значение по умолчанию
zeros (size (b)).
A может быть передано как матрица или как функция-обработчик или встроенная функция
fтаким образом, чтоf(x, "notransp") = A*xиf(x, "transp") = A'*x.Предобуславливатель P задается как
P = M1 * M2. M1 и M2 могут быть переданы как матрица или как функция-обработчик или встроенная функцияgтаким образом, чтоg(x, "notransp") = M1 \ xилиg(x, "notransp") = M2 \ xиg(x, "transp") = M1' \ xилиg(x, "transp") = M2' \ x.Если вызывается с более чем одним выходным параметром
- - flag указывает на статус завершения:
- - 0: итерации сошлись в пределах заданной погрешности
- - 1: максимальное число итераций достигнуто до сходимости
- - 3: алгоритм достиг стагнации
(значение 2 не используется, но пропущено для совместимости).
- - relres — конечное значение относительного остатка.
- - iter — количество выполненных итераций.
- - resvec — вектор, содержащий нормы остатка на каждой итерации.
Ссылки:
- R. Freund и N. Nachtigal, QMR: метод квазиминимального остатка для неэрмитовых линейных систем, Numerische Mathematik, 1991, 60, стр. 315–339.
- R. Barrett, M. Berry, T. Chan, J. Demmel, J. Donato, J. Dongarra, V. Eijkhour, R. Pozo, C. Romine и H. van der Vorst, Шаблоны для решения линейных систем: строительные блоки для итерационных методов, SIAM, 2-е изд., 1994.
- : x = tfqmr (A, b, tol, maxit, M1, M2, x0, …)
- : x = tfqmr (A, b, tol, maxit, M, [], x0, …)
- : [x, flag, relres, iter, resvec] = tfqmr (A, b, …)
-
Решить
A x = bс использованием метода qmr с транспонированным деревом, основанного на cgs.Параметры ввода:
- - A — матрица линейной системы, должна быть квадратной. A может быть передана как матрица, функция-обработчик или встроенная функция
Afunтаким образом, чтоAfun(x) = A * x. Дополнительные параметры дляAfunпередаются после x0. - - b — вектор правой части. Должен быть столбцовым вектором с тем же числом строк, что и у A.
- - tol — относительная погрешность; если не задано или равно [], используется значение по умолчанию 1e-6.
- - maxit — максимальное число внешних итераций; если не задано или равно [], используется значение по умолчанию
min (20, numel (b)). Для совместимости, так как метод имеет различное поведение при нечётном или чётном числе итераций, учитывается каждая итерация вtfqmrвесь цикл чётности-нечётности. То есть, для выполнения одной полной итерации алгоритм выполняет две под-итерации: нечётную и чётную. - - M1, M2 — предобуславливатели. Предобуславливатель M задается как
M = M1 * M2. M1 и M2 могут быть переданы как матрица или как функция-обработчик или встроенная функцияgтаким образом, чтоg(x) = M1 \ xилиg(x) = M2 \ x. Используется метод правого предобуславливания, т.е. решаетсяA*inv(M)*y = bи затемx = inv(M)*y, а неA x = b. - - x0 — начальное приближение; если не задано или равно [], используется значение по умолчанию
zeros (size (b)).
Аргументы, следующие за x0, обрабатываются как параметры и передаются должным образом в любую из функций (A или M), которые переданы в
tfqmr.Выходные параметры:
- - x — вычисленное приближение. Если метод не сходится, это итерация с минимальным остатком.
- - flag указывает на статус завершения:
- - 0: итерации сошлись в пределах заданной погрешности
- - 1: максимальное число итераций достигнуто до сходимости
- - 2: матрица предобуславливания является вырожденной
- - 3: алгоритм достиг стагнации
- - 4: алгоритм не может продолжить из-за деления на ноль
- - relres — относительный остаток, полученный как
(A*x-b) /.norm (b) - - iter — итерация, на которой x был вычислен.
- - resvec — вектор, содержащий остаток на каждой итерации (включая
norm (b - A x0)). Выполняяlength (resvec) - 1можно увидеть общее количество выполненных итераций.
Рассмотрим тривиальную задачу с треугольной матрицей
n = 20; A = toeplitz (sparse ([1, 1], [1, 2], [2, 1] * n ^ 2, 1, n)) + ... toeplitz (sparse (1, 2, -1, 1, n) * n / 2, ... sparse (1, 2, 1, 1, n) * n / 2); b = A * ones (n, 1); restart = 5; [M1, M2] = ilu (A); # in this tridiag case it corresponds to chol (A)' M = M1 * M2; Afun = @(x) A * x; Mfun = @(x) M \ x; M1fun = @(x) M1 \ x; M2fun = @(x) M2 \ x;ПРИМЕР 1: простое использование
tfqmrx = tfqmr (A, b, [], n)
ПРИМЕР 2:
tfqmrс функцией, которая вычисляетA * xx = tfqmr (Afun, b, [], n)
ПРИМЕР 3:
tfqmrс матрицей предобуславливания Mx = tfqmr (A, b, [], 1e-06, n, M)
ПРИМЕР 4:
tfqmrс функцией в качестве предобуславливанияx = tfqmr (Afun, b, 1e-6, n, Mfun)
ПРИМЕР 5:
tfqmrс предобуславливателями M1 и M2x = tfqmr (A, b, [], 1e-6, n, M1, M2)
ПРИМЕР 6:
tfmqrс функциями в качестве предобуславливанияx = tfqmr (Afun, b, 1e-6, n, M1fun, M2fun)
ПРИМЕР 7:
tfqmrс функцией в качестве входного параметра, требующей аргументfunction y = Ap (A, x, z) # compute A^z * x y = x; for i = 1:z y = A * y; endfor endfunction Apfun = @(x, string, p) Ap (A, x, string, p); x = tfqmr (Apfun, b, [], [], [], [], [], 2);ПРИМЕР 8: явный пример, показывающий, что
tfqmrиспользует правое предобуславливание[M1, M2] = ilu (A + 0.3 * eye (n)); # factorization of A perturbed M = M1 * M2; ## reference solution computed by tfqmr after one iteration [x_ref, fl] = tfqmr (A, b, [], 1, M) ## right preconditioning [y, fl] = tfqmr (A / M, b, [], 1) x = M \ y # compare x and x_ref
Ссылки:
Y. Saad, Итерационные методы для разреженных линейных систем, 2-е издание, 2003, SIAM
- - A — матрица линейной системы, должна быть квадратной. A может быть передана как матрица, функция-обработчик или встроенная функция
© 1996–2022 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/v6.4.0/Specialized-Solvers.html