DiffEqOperators
Конструкторы
Заключение массива в оболочку: DiffEqArrayOperator
DiffEqArrayOperator
предназначен для определения оператора непосредственно из массива. Оператор имеет следующий вид:
для некоторого скаляра α
и времени плюс, возможно, зависимость от состояния A
. Конструктор имеет следующий вид.
DiffEqArrayOperator(A::AbstractMatrix{T}, update_func = DEFAULT_UPDATE_FUNC)
A
является массивом операторов. update_func(A,u,p,t)
— это функция, вызываемая с помощью update_coefficients!(A,u,p,t)
. Если оставить значение по умолчанию, функция update_func
будет тривиальной, что означает, что A
— константа.
AffineDiffEqOperator
Для As = (A1,A2,...,An)
и Bs = (B1,B2,...,Bm)
, где каждый из Ai
и Bi
является оператором AbstractDiffEqOperator
, используется следующий конструктор:
AffineDiffEqOperator{T}(As, Bs, u_cache = nothing)
строит оператор L = (A1 + A2 + ... An)*u + B1 + B2 + ... + Bm
. Функция u_cache
предназначена для обозначения типа внутреннего кэша для невыделяемого вычисления L(du,u,p,t)
. Если не задано, функция L(du,u,p,t)
недоступна. Заметим, что в решениях, использующих эту структуру, вызов данной функции не требуется. Она используется только в качестве резервного варианта в решателях ODE, которые не были разработаны для этой структуры.
Формальные свойства DiffEqOperators
Это формальные свойства, которым должен удовлетворять оператор AbstractDiffEqOperator
для работы в решателях.
Описание интерфейса AbstractDiffEqOperator
-
Вызов и умножение функции:
L(du,u,p,t)
для выполнения на месте иdu = L(u,p,t)
для выполнения не на месте, что означаетL*u
иmul!
. -
Если оператор не является константой, обновите его с помощью
(u,p,t)
. Изменяемая форма, т. е.update_coefficients!(A,u,p,t)
, изменяющая внутренние коэффициенты, и форма не на местеB = update_coefficients(A,u,p,t)
. -
Признак
isconstant(A)
, определяющий, является ли оператор константой или нет.
Описание интерфейса AbstractDiffEqLinearOperator
-
AbstractDiffEqLinearOperator <: AbstractDiffEqOperator
-
Может поглощать при умножении на скаляр. Во всех алгоритмах постоянно появляются вещи типа
dt*L
, поэтому линейный оператор должен быть способен поглощать такие константы. -
Признак
isconstant(A)
, определяющий, является ли оператор константой или нет. -
Необязательно: признаки
diagonal
,symmetric
и т. д. из LinearMaps.jl. -
Необязательно:
exp(A)
. Требуется для простой экспоненциальной интеграции. -
Необязательно:
expv(A,u,t) = exp(t*A)*u
иexpv!(v,A::DiffEqOperator,u,t)
. Требуются для простой экспоненциальной интеграции. -
Необязательно: разложения.
ldiv!
,factorize
и др. Требуются только для алгоритмов, использующих разложение оператора (Кранк — Николсон), и только в случае применения линейного решателя по умолчанию.