Начало работы
Интерфейс
Практически все решатели имеют общие объявления функций:
solver(A, args...; kwargs...)
solver!(x, A, args...; kwargs...)
где A — это линейный оператор, а x — начальное предположение. Второе объявление также обновляет x на месте.
Явные матрицы и безматричный подход
Вместо построения явной матрицы A типа Matrix или SparseMatrixCSC можно передать общий линейный оператор, который выполняет матричные операции неявным образом. Это так называемый безматричный подход.
Для безматричных типов A должен быть определен следующий интерфейс:
-
A*vвычисляет произведение матрицы и вектора дляv::AbstractVector; -
mul!(y, A, v)вычисляет произведение матрицы и вектора дляv::AbstractVectorна месте; -
eltype(A)возвращает тип элемента, неявно присутствующий в эквивалентном матричном представленииA; -
size(A, d)возвращает номинальные измерения поd-й оси в эквивалентном матричном представленииA.
!!! tip "Matrix-free with LinearMaps.jl" Настоятельно рекомендуется использовать LinearMaps.jl для безматричных линейных операторов, так как в нем уже реализованы вышеописанные методы. Вам нужно только написать действие линейного отображения.
Дополнительные аргументы
Имена ключевых слов зависят от метода, однако некоторые из них всегда имеют одинаковое написание:
-
tol: (относительный) допуск остановки метода; -
verbose: вывод информации во время итераций; -
maxiter: максимальное количество допустимых итераций; -
PlиPr: левый и правый предобуславливатели. См. раздел Предобуславливание. -
log::Bool = false: вывод дополнительного элемента типаConvergenceHistory, содержащего историю сходимости.
Ключевое слово log
Большинство решателей содержат ключевое слово log. Оно используется, когда требуется получить больше информации. Для его применения поместите набор log в true.
x, ch = cg(Master, rand(10, 10), rand(10) log=true)
svd, L, ch = svdl(Master, rand(100, 100), log=true)
Теперь функция будет возвращать еще один параметр типа ConvergenceHistory.
ConvergenceHistory
Экземпляр ConvergenceHistory хранит информацию о решателе.
Количество итераций.
ch.iters
Состояние сходимости.
ch.isconverged
Допуски остановок. (Для доступа требуется ключ Symbol.)
ch[:tol]
Минимальное количество итераций на перезапуск (только в перезапускаемых методах).
nrests(ch)
Количество произведений матрицы на вектор и транспонированных произведений матрицы на вектор.
nprods(ch)
Данные сохраняются при каждой итерации, доступная информация может быть как вектором, так и матрицей. Эти данные могут быть самыми разными, чаще всего — невязками. (Для доступа требуется ключ Symbol.)
ch[:resnorm] #Вектор или матрица
ch[:resnorm, x] #Элемент вектора или матрицы
ch[:resnorm, x, y] #Элемент матрицы
#
IterativeSolvers.ConvergenceHistory — Type
Хранит общую и подробную информацию об итерационном методе.
Поля
mvps::Int: количество произведений матрицы на вектор.
mtvps::Int: количество транспонированных произведений матрицы и вектора.
iters::Int: итерации, выполняемые методом.
restart::T: перезапуск соответствующей информации.
-
T == Int: итерации за перезапуск. -
T == Nothing: методы без перезапусков.
isconverged::Bool: сходимость метода.
data::Dict{Symbol,Any}: Хранит всю информацию, сохраненную во время выполнения метода. Хранит допуски, невязки и другие сведения, например значения Ритца в svdl.
Конструкторы
ConvergenceHistory() ConvergenceHistory(restart)
Создает ConvergenceHistory с пустыми полями.
Аргументы
restart: количество итераций за перезапуск.
Графики
Поддерживает построение графиков с использованием пакета Plots.jl с помощью шаблона типа. Векторы строятся в виде рядов, а матрицы — в виде графиков рассеяния.
Реализации
Base: getindex, setindex!, push!
Построение графиков
ConvergeHistory предоставляет шаблон для использования с пакетом Plots.jl, что позволяет очень легко строить графики на различных бэкендах. Доступно два шаблона:
Один для всего ConvergenceHistory.
plot(ch)
Другой — для построения графика данных, привязанных к ключу.
_, ch = gmres(rand(10,10), rand(10), maxiter = 100, log=true)
plot(ch, :resnorm, sep = :blue)
Дополнительные ключевые слова для построения графиков
sep::Symbol = :white: цвет разделителя строк в перезапускаемых методах.