Документация Engee

Начало работы

Интерфейс

Практически все решатели имеют общие объявления функций:

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.ConvergenceHistoryType

Хранит общую и подробную информацию об итерационном методе.

Поля

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: цвет разделителя строк в перезапускаемых методах.