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и др. Требуются только для алгоритмов, использующих разложение оператора (Кранк — Николсон), и только в случае применения линейного решателя по умолчанию.