Стационарные методы
Стационарные методы обычно используются в качестве сглаживателей в многосеточных методах, где применяется очень малое количество итераций, чтобы исключить высокочастотные компоненты в ошибке. Реализации стационарных методов преследуют именно эту цель, а значит, не имеют другого критерия остановки, кроме максимального количества итераций.
В 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
, если диагональ имеет нуль. Эта проверка выполняется один раз и заранее.
Все стационарные методы можно использовать как итераторы. |