Задачи с динамическими ODE, гамильтоновыми ODE и ODE второго порядка
#
SciMLBase.DynamicalODEProblem
— Type
Определяет задачу ODE. Страница документации: https://docs.sciml.ai/DiffEqDocs/stable/types/dynamical_types/
Динамические обыкновенные дифференциальные уравнения, например возникающие при определении гамильтоновой системы, или ОДУ второго порядка, имеют особую структуру, которую можно использовать при решении дифференциального уравнения. На этой странице содержатся сведения об определении дифференциальных уравнений второго порядка для их эффективного численного решения.
Математическая спецификация задачи динамического ОДУ
Эти алгоритмы требуют разделенного ОДУ следующего вида:
Это разделенное ОДУ, разбитое на две группы, поэтому функции должны указываться как f1(dv,v,u,p,t)
и f2(du,v,u,p,t)
(как функции на месте), где f1
не зависит от v
(если не указано решателем), а f2
не зависит от u
и t
. Сюда относятся дискретизации, возникающие из SecondOrderODEProblem
, в которых скорость не используется в функции ускорения, и гамильтонианы, в которых потенциал является (или может быть) зависимым от времени, а кинетическая энергия зависит только от v
.
Обратите внимание, что некоторые методы предполагают, что интеграл f2
имеет квадратичную форму. Это означает, что f2=v'*M*v
, т. е. , что дает du = v
. Это то же самое, если сказать, что кинетическая энергия связана с . Методы, которые требуют это предположение, потеряют в точности, если его нарушить. В перечисленных ниже методах это требование отмечается как «Требует кинетическую энергию в квадрате».
Конструктор
DynamicalODEProblem(f::DynamicalODEFunction,v0,u0,tspan,p=NullParameters();kwargs...)
DynamicalODEProblem{isinplace}(f1,f2,v0,u0,tspan,p=NullParameters();kwargs...)
Определяет ОДУ с указанными функциями. isinplace
дополнительно задает, является ли функция функцией на месте или нет. Это определяется автоматически, а не выводится.
Параметры являются необязательными, и если они не заданы, будет использоваться одинарный элемент NullParameters()
, который при попытке индексирования несуществующих параметров будет выдавать понятные ошибки. Все дополнительные именованные аргументы передаются в решатели. Например, если в задаче задать обратный вызов (callback
), этот callback
будет добавляться при каждом вызове функции solve.
Поля
-
f1
иf2
: функции в ОДУ. -
v0
иu0
: начальные условия. -
tspan
: временной интервал для задачи. -
p
: параметры для задачи. По умолчанию используетсяNullParameters
. -
kwargs
: именованные аргументы, передаваемые в решатели.
#
SciMLBase.SecondOrderODEProblem
— Type
Определяет задачу динамического ОДУ 2-го порядка. Страница документации: https://docs.sciml.ai/DiffEqDocs/stable/types/dynamical_types/
Математическая спецификация задачи динамического ОДУ 2-го порядка
Для определения задачи ОДУ 2-го порядка достаточно задать функцию и начальное условие , которые определяют ОДУ:
Функцию f
следует указать как f(du,u,p,t)
(или на месте как f(ddu,du,u,p,t)
), а условие u₀
должно представлять собой массив AbstractArray (или число), геометрия которого соответствует требуемой геометрии u
. Обратите внимание, что тип значения u₀
не ограничен числами или векторами; значением u₀
также могут быть произвольные матрицы или тензоры высокой разрядности.
На основе этой формы динамическое ОДУ выглядит следующим образом:
Конструкторы
SecondOrderODEProblem{isinplace}(f,du0,u0,tspan,callback=CallbackSet())
Определяет ОДУ с указанными функциями.
Поля
-
f
: функция для второй производной. -
du0
: начальная производная. -
u0
: начальное условие. -
tspan
: временной интервал для задачи. -
callback
: обратный вызов, который будет применяться к каждому решателю, использующему данную задачу. Значение по умолчанию — nothing.
#
SciMLBase.DynamicalODEFunction
— Type
DynamicalODEFunction{iip,F1,F2,TMM,Ta,Tt,TJ,JVP,VJP,JP,SP,TW,TWt,TPJ,S,S2,S3,O,TCV} <: AbstractODEFunction{iip,specialize}
Представление функции ОДУ f
, определяемое следующим образом:
как разделенное ОДУ:
и все связанные функции, такие как якобиан f
, градиент относительно времени и др. Для всех случаев u0
— это начальное условие, p
— это параметры, а t
— это независимая переменная.
Конструктор
DynamicalODEFunction{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_i
, представленная в функции ОДУ. С ее помощью можно определить, что уравнение является дифференциально-алгебраическим уравнением (ДАУ), еслиM
сингулярна. Обратите внимание, что в этом случае требуются специальные решатели. Подробнее см. на странице о решателях ДАУ: https://docs.sciml.ai/DiffEqDocs/stable/solvers/dae*solve/. Должен быть AbstractArray или AbstractSciMLOperator. Должен быть задан в виде кортежа матриц масс, т. е.(M*1, M_2)
для матриц масс уравнений 1 и 2, соответственно. -
analytic(u0,p,t)
: используется для передачи функции аналитического решения для аналитического решения уравнения ОДУ. Обычно применяется только для тестирования и разработки решателей. -
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
, что означает, что цветовой вектор будет внутренним образом вычисляться по требованию, когда это необходимо. Стоимость этой операции существенно зависит от шаблона разреженности.
iip: на месте и не на месте
Дополнительные сведения об этом аргументе см. в документации по ODEFunction.
specialize: управление компиляцией и специализацией
Дополнительные сведения об этом аргументе см. в документации по ODEFunction.
Поля
Поля типа DynamicalODEFunction напрямую соответствуют именам входных данных.
Тип решения
В результате решения динамического ODE возвращается объект ODESolution
. Дополнительные сведения см. в docstring ODESolution
на странице определения задачи ODE.
Гамильтоновы задачи
Объекты HamiltonianProblem
предоставляются пакетом DiffEqPhysics.jl и обеспечивают простой способ определения уравнений движения на основе соответствующего гамильтониана. Чтобы определить HamiltonianProblem
, достаточно указать гамильтониан:
и соответствующие уравнения будут созданы посредством автоматического дифференцирования (ForwardDiff.jl).