Стационарные методы
Стационарные методы обычно используются в качестве сглаживателей в многосеточных методах, где применяется очень малое количество итераций, чтобы исключить высокочастотные компоненты в ошибке. Реализации стационарных методов преследуют именно эту цель, а значит, не имеют другого критерия остановки, кроме максимального количества итераций.
|
В Julia матрицы хранятся по столбцам. Чтобы избежать пропусков кэша, реализации стационарных методов проходят по матрицам по столбцам. В этом отличие от классических реализаций. Кроме того, методы SOR и SSOR не могут быть вычислены на месте. Для них требуется временный вектор. |
Когда дело касается `SparseMatrixCSC`, мы предварительно вычисляем во всех стационарных методах целочисленный массив индексов диагонали, чтобы избежать дорогостоящего поиска в каждой итерации.
Якоби
#
IterativeSolvers.jacobi! — Function
jacobi!(x, A::AbstractMatrix, b; maxiter=10) -> x
Выполняет ровно maxiter итераций Якоби.
Выделяет один временный вектор и проходит A по столбцам.
Выдает исключение LinearAlgebra.SingularException, если диагональ имеет нуль. Эта проверка выполняется один раз и заранее.
jacobi!(x, A::SparseMatrixCSC, b; maxiter=10) -> x
Выполняет ровно maxiter итераций Якоби.
Выделяет временный вектор и предварительно вычисляет диагональные индексы.
Выдает исключение LinearAlgebra.SingularException, если диагональ имеет нуль. Эта проверка выполняется один раз и заранее.
Гаусс-Зейдль
#
IterativeSolvers.gauss_seidel — Function
gauss_seidel(A, b) -> x
То же, что и gauss_seidel!, но выделяет вектор решений x, инициализированный нулями.
#
IterativeSolvers.gauss_seidel! — Function
gauss_seidel!(x, A::AbstractMatrix, b; maxiter=10) -> x
Выполняет ровно maxiter итераций Гаусса-Зейделя.
Работает полностью на месте и проходит A по столбцам.
Выдает исключение LinearAlgebra.SingularException, если диагональ имеет нуль. Эта проверка выполняется один раз и заранее.
gauss_seidel!(x, A::SparseMatrixCSC, b; maxiter=10) -> x
Выполняет ровно maxiter итераций Гаусса-Зейделя.
Работает полностью на месте, но предварительно вычисляет диагональные индексы.
Выдает исключение LinearAlgebra.SingularException, если диагональ имеет нуль. Эта проверка выполняется один раз и заранее.
Последовательная верхняя релаксация (SOR)
#
IterativeSolvers.sor! — Function
sor!(x, A::AbstractMatrix, b, ω::Real; maxiter=10) -> x
Выполняет ровно maxiter итераций SOR с параметром релаксации ω.
Выделяет один временный вектор и проходит A по столбцам.
Выдает исключение LinearAlgebra.SingularException, если диагональ имеет нуль. Эта проверка выполняется один раз и заранее.
sor!(x, A::SparseMatrixCSC, b, ω::Real; maxiter=10)
Выполняет ровно maxiter итераций SOR с параметром релаксации ω.
Выделяет временный вектор и предварительно вычисляет диагональные индексы.
Выдает исключение LinearAlgebra.SingularException, если диагональ имеет нуль. Эта проверка выполняется один раз и заранее.
Симметричная последовательная верхняя релаксация (SSOR)
#
IterativeSolvers.ssor! — Function
ssor!(x, A::AbstractMatrix, b, ω::Real; maxiter=10) -> x
Выполняет ровно maxiter итераций SSOR с параметром релаксации ω. Каждая итерация по сути является прямой и обратной прогонкой SOR.
Выделяет один временный вектор и проходит A по столбцам.
Выдает исключение LinearAlgebra.SingularException, если диагональ имеет нуль. Эта проверка выполняется один раз и заранее.
ssor!(x, A::SparseMatrixCSC, b, ω::Real; maxiter=10)
Выполняет ровно maxiter итераций SSOR с параметром релаксации ω. Каждая итерация по сути является прямой и обратной прогонкой SOR.
Выделяет временный вектор и предварительно вычисляет диагональные индексы.
Выдает исключение LinearAlgebra.SingularException, если диагональ имеет нуль. Эта проверка выполняется один раз и заранее.
|
Все стационарные методы можно использовать как итераторы. |