Задачи ODE с разделением
#
SciMLBase.SplitODEProblem
— Type
Определяет задачу ODE с разделяющимися переменными. Страница документации: https://docs.sciml.ai/DiffEqDocs/stable/types/splitodetypes/
Математическое определение задачи ODE с разделяющимися переменными
Для определения задачи SplitODEProblem
достаточно задать две функции — и — и начальное условие , которые определяют ODE:
Функцию f
следует указать как f(u,p,t)
(или на месте как f(du,u,p,t)
), а условие u₀
должно представлять собой массив AbstractArray (или число), геометрия которого соответствует требуемой геометрии u
. Обратите внимание, что тип значения u₀
не ограничен числами или векторами; значением u₀
также могут быть произвольные матрицы или тензоры высокой разрядности.
Многие уравнения с разделяющимися переменными являются по крайней мере частично линейными. Уравнение имеет следующий вид:
Узнать, как определяется линейная функция A
, можно в документации по AbstractSciMLOperator.
Конструкторы
SplitODEProblem(f::SplitFunction,u0,tspan,p=NullParameters();kwargs...)
SplitODEProblem{isinplace}(f1,f2,u0,tspan,p=NullParameters();kwargs...)
Параметр isinplace
можно опустить. В этом случае он определяется на основе сигнатуры функции f2
. Обратите внимание, что обе функции f1
и f2
должны поддерживать выполнение на месте, если isinplace
имеет значение true
, или выполнение не на месте, если isinplace
имеет значение false
. Сочетать эти два варианта нельзя.
Параметры являются необязательными, и если они не заданы, будет использоваться одинарный элемент NullParameters()
, который при попытке индексирования несуществующих параметров будет выдавать понятные ошибки. Все дополнительные именованные аргументы передаются в решатели. Например, если в задаче задать обратный вызов (callback
), этот callback
будет добавляться при каждом вызове функции solve.
По своей сути SplitODEProblem
— это обычная задача ODEProblem
, функция f
которой представляет собой SplitFunction
. Поэтому к SplitODEProblem
применимы те же решатели, что и к ODEProblem
. Сведения о решателях, предназначенных специально для задач с разделяющимися переменными, см. в разделе Решатели ODE с разделяющимися переменными.
Сведения о задании якобианов и матриц масс см. на странице о DiffEqFunctions.
Поля
-
f1
,f2
: функции в ODE. -
u0
: начальное условие. -
tspan
: временной интервал для задачи. -
p
: параметры для задачи. По умолчанию используетсяNullParameters
. -
kwargs
: именованные аргументы, передаваемые в решатели.
#
SciMLBase.SplitFunction
— Type
SplitFunction{iip,F1,F2,TMM,C,Ta,Tt,TJ,JVP,VJP,JP,SP,TW,TWt,TPJ,S,S2,S3,O,TCV} <: AbstractODEFunction{iip,specialize}
Представление функции ODE с разделяющимися переменными f
, определяемое следующим образом:
и все связанные функции, такие как якобиан f
, градиент относительно времени и др. Для всех случаев u0
— это начальное условие, p
— это параметры, а t
— это независимая переменная.
Как правило, для интеграторов ODE часть f_1
должна считаться «жесткой частью модели» с более широким разделением по временной шкале, в то время как часть f_2
должна считаться «нежесткой». Эта интерпретация применяется непосредственно в таких интеграторах, как IMEX (неявно-явные интеграторы) и экспоненциальные интеграторы.
Конструктор
SplitFunction{iip,specialize}(f1,f2;
mass_matrix = __has_mass_matrix(f) ? f.mass_matrix : I,
analytic = __has_analytic(f) ? f.analytic : nothing,
tgrad= __has_tgrad(f) ? f.tgrad : nothing,
jac = __has_jac(f) ? f.jac : nothing,
jvp = __has_jvp(f) ? f.jvp : nothing,
vjp = __has_vjp(f) ? f.vjp : nothing,
jac_prototype = __has_jac_prototype(f) ? f.jac_prototype : nothing,
sparsity = __has_sparsity(f) ? f.sparsity : jac_prototype,
paramjac = __has_paramjac(f) ? f.paramjac : nothing,
syms = __has_syms(f) ? f.syms : nothing,
indepsym= __has_indepsym(f) ? f.indepsym : nothing,
paramsyms = __has_paramsyms(f) ? f.paramsyms : nothing,
colorvec = __has_colorvec(f) ? f.colorvec : nothing,
sys = __has_sys(f) ? f.sys : nothing)
Обратите внимание, что требуются только сами функции f_i
. Эти функции должны быть заданы как f_i!(du,u,p,t)
или du = f_i(u,p,t)
. Более подробные сведения об обработке на месте и не на месте см. в разделе об iip
.
Все остальные функции являются необязательными для улучшения или ускорения использования f
. К ним относятся следующие.
-
mass_matrix
: матрица массM
, представленная в функции ODE. С ее помощью можно определить, что уравнение является дифференциально-алгебраическим уравнением (ДАУ), еслиM
сингулярна. Обратите внимание, что в этом случае требуются специальные решатели. Подробнее см. на странице о решателях ДАУ: https://docs.sciml.ai/DiffEqDocs/stable/solvers/dae_solve/. Должен быть AbstractArray или AbstractSciMLOperator. -
analytic(u0,p,t)
: используется для передачи функции аналитического решения для аналитического решения уравнения ODE. Обычно применяется только для тестирования и разработки решателей. -
tgrad(dT,u,p,t)
или dT=tgrad(u,p,t): возвращает -
jac(J,u,p,t)
илиJ=jac(u,p,t)
: возвращает -
jvp(Jv,v,u,p,t)
илиJv=jvp(v,u,p,t)
: возвращает направленную производную -
vjp(Jv,v,u,p,t)
илиJv=vjp(v,u,p,t)
: возвращает сопряженную производную -
jac_prototype
: матрица-прототип, соответствующая типу, который соответствует якобиану. Например, если якобиан является трехдиагональным, в качестве прототипа может использоваться матрицаTridiagonal
соответствующего размера, и по возможности интеграторы будут специализировать эту структуру. В неструктурированных шаблонах разреженности для якобиана следует использоватьSparseMatrixCSC
с правильным шаблоном разреженности. По умолчанию используетсяnothing
, что означает плотный якобиан. -
paramjac(pJ,u,p,t)
: возвращает якобиан параметра . -
syms
: имена символов для элементов уравнения. По размеру они должны соответствоватьu0
. Например, еслиu0 = [0.0,1.0]
иsyms = [:x, :y]
, к значениям будет применено каноническое именование, что позволит использоватьsol[:x]
в решении и автоматически присваивать имена значениям на графиках. -
indepsym
: каноническое именование для независимой переменной. Значение по умолчанию — nothing, которое внутренним образом используетt
в качестве представления в любых графиках. -
paramsyms
: имена символов для параметров уравнения. По размеру они должны соответствоватьp
. Например, еслиp = [0.0, 1.0]
иparamsyms = [:a, :b]
, к значениям будет применено каноническое именование, что позволит использоватьsol[:a]
в решении. -
colorvec
: цветовой вектор в соответствии с определением SparseDiffTools.jl для шаблона разреженности матрицы-прототипаjac_prototype
. Это позволяет ускорить построение якобиана при использовании конечных разностей и автоматического дифференцирования на основе шаблона разреженности. Значение по умолчанию —nothing
, что означает, что цветовой вектор будет внутренним образом вычисляться по требованию, когда это необходимо. Стоимость этой операции существенно зависит от шаблона разреженности.
Примечание об определении производной
Производные, такие как якобиан, определяются только для части f1
ODE с разделяющимися переменными. Это позволяет интерпретировать часть f1
как неявную с сохранением части f2
явной.
iip: на месте и не на месте
Дополнительные сведения об этом аргументе см. в документации по ODEFunction.
specialize: управление компиляцией и специализацией
Дополнительные сведения об этом аргументе см. в документации по ODEFunction.
Поля
Поля типа SplitFunction напрямую соответствуют именам входных данных.
Символическое построение функций
См. описание функции modelingtoolkitize
из ModelingToolkit.jl для автоматического символического построения якобиана и других компонентов из численно-определенных функций. Сведения о генерировании SplitFunction на основе этого символьного механизма см. в разделе ModelingToolkit.SplitODEProblem
.
Тип решения
В результате решения SplitODEProblem
возвращается объект ODESolution
. Дополнительные сведения см. в docstring ODESolution
на странице определения задачи ODE.