Задачи DAE
#
SciMLBase.DAEProblem
— Type
Определяет задачу ODE или задачу DAE. Страница документации: https://docs.sciml.ai/DiffEqDocs/stable/types/dae_types/
Математическая спецификация задачи ДАУ
Для определения задачи ДАУ достаточно задать функцию и начальное условие , которые определяют ОДУ:
Функцию f
следует указать как f(du,u,p,t)
(или на месте как f(resid,du,u,p,t)
). Обратите внимание, что тип значения u₀
не ограничен числами или векторами; значением u₀
также могут быть произвольные матрицы или тензоры высокой разрядности.
Тип задачи
Конструкторы
-
DAEProblem(f::DAEFunction,du0,u0,tspan,p=NullParameters();kwargs...)
-
DAEProblem{isinplace,specialize}(f,du0,u0,tspan,p=NullParameters();kwargs...)
: определяет ДАУ с указанными функциями.isinplace
дополнительно задает, является ли функция функцией на месте или нет. Это определяется автоматически, а не выводится.specialize
дополнительно определяет уровень специализации. Дополнительные сведения см. в документации в разделе об уровнях специализации. По умолчанию используетсяAutoSpecialize
.
Дополнительные сведения о параметрах на месте и параметрах специализации см. в документации по ODEFunction.
Параметры являются необязательными, и если они не заданы, будет использоваться одинарный элемент NullParameters()
, который при попытке индексирования несуществующих параметров будет выдавать понятные ошибки. Все дополнительные именованные аргументы передаются в решатели. Например, если в задаче задать обратный вызов (callback
), этот callback
будет добавляться при каждом вызове функции solve.
Сведения о задании якобианов и матриц масс см. на странице о DiffEqFunctions.
Поля
-
f
: функция в ОДУ. -
du0
: начальное условие для производной. -
u0
: начальное условие. -
tspan
: временной интервал для задачи. -
differential_vars
: логический массив, в котором объявляется, какие переменные являются дифференциальными (неалгебраическими) (т. е.du'
находится в уравнениях для этой переменной). Значение по умолчанию — nothing. Для некоторых решателей может потребоваться задать этот параметр, если необходимо определить начальное условие. -
p
: параметры для задачи. По умолчанию используетсяNullParameters
. -
kwargs
: именованные аргументы, передаваемые в решатели.
Примеры задач
Примеры задач можно найти на странице DiffEqProblemLibrary.jl.
Использовать пример задачи, например prob_dae_resrob
, можно так:
#] add DAEProblemLibrary
using DAEProblemLibrary
prob = DAEProblemLibrary.prob_dae_resrob
sol = solve(prob,IDA())
#
SciMLBase.DAEFunction
— Type
DAEFunction{iip,F,Ta,Tt,TJ,JVP,VJP,JP,SP,TW,TWt,TPJ,S,S2,S3,O,TCV} <: AbstractDAEFunction{iip,specialize}
Представление функции неявного ДАУ f
, определяемое следующим образом:
и все связанные функции, такие как якобиан f
, градиент относительно времени и др. Для всех случаев u0
— это начальное условие, p
— это параметры, а t
— это независимая переменная.
Конструктор
DAEFunction{iip,specialize}(f;
analytic = __has_analytic(f) ? f.analytic : 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,
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
. Эта функция должна быть задана как f!(out,du,u,p,t)
или out = f(du,u,p,t)
. Более подробные сведения об обработке на месте и не на месте см. в разделе об iip
.
Все остальные функции являются необязательными для улучшения или ускорения использования f
. К ним относятся следующие.
-
analytic(u0,p,t)
: используется для передачи функции аналитического решения для аналитического решения уравнения ОДУ. Обычно применяется только для тестирования и разработки решателей. -
jac(J,du,u,p,gamma,t)
илиJ=jac(du,u,p,gamma,t)
: возвращает якобиан неявного ДАУ, определяемый как . -
jvp(Jv,v,du,u,p,gamma,t)
илиJv=jvp(v,du,u,p,gamma,t)
: возвращает направленную производную -
vjp(Jv,v,du,u,p,gamma,t)
илиJv=vjp(v,du,u,p,gamma,t)
: возвращает сопряженную производную -
jac_prototype
: матрица-прототип, соответствующая типу, который соответствует якобиану. Например, если якобиан является трехдиагональным, в качестве прототипа может использоваться матрицаTridiagonal
соответствующего размера, и по возможности интеграторы будут специализировать эту структуру. В неструктурированных шаблонах разреженности для якобиана следует использоватьSparseMatrixCSC
с правильным шаблоном разреженности. По умолчанию используетсяnothing
, что означает плотный якобиан. -
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.
Поля
Поля типа DAEFunction напрямую соответствуют именам входных данных.
Примеры
Объявление явных якобианов для ДАУ
Для полностью неявных ОДУ (DAEProblem
) необходима несколько иная функция Якоби. Для ДАУ
Якобиан должен быть задан в виде gamma*dG/d(du) + dG/du
, где gamma
задается решателем. Это означает, что сигнатура имеет следующий вид:
f(J,du,u,p,gamma,t)
Например, для уравнения
function testjac(res,du,u,p,t)
res[1] = du[1] - 2.0 * u[1] + 1.2 * u[1]*u[2]
res[2] = du[2] -3 * u[2] - u[1]*u[2]
end
мы определим якобиан следующим образом.
function testjac(J,du,u,p,gamma,t)
J[1,1] = gamma - 2.0 + 1.2 * u[2]
J[1,2] = 1.2 * u[1]
J[2,1] = - 1 * u[2]
J[2,2] = gamma - 3 - u[1]
nothing
end
Символическое построение функций
См. описание функции modelingtoolkitize
из ModelingToolkit.jl для автоматического символического построения якобиана и других компонентов из численно-определенных функций.
Тип решения
#
SciMLBase.DAESolution
— Type
struct DAESolution{T, N, uType, duType, uType2, DType, tType, P, A, ID, S} <: SciMLBase.AbstractDAESolution{T, N, uType}
Представление решения дифференциально-алгебраического уравнения, определяемого задачей DAEProblem.
Интерфейс DESolution
Более подробную информацию о взаимодействии с типами DESolution
можно найти на странице о работе с решениями в документации по DifferentialEquations.jl.
Поля
-
u
: представление решения ДАУ. Задается в виде массива решений, гдеu[i]
соответствует решению в момент времениt[i]
. В большинстве случаев рекомендуется не обращаться кsol.u
напрямую, а использовать интерфейс массива, описанный на странице о работе с решениями в документации по DifferentialEquations.jl. -
du
: представление производных решения ДАУ. -
t
: временные точки, соответствующие сохраненным значениям решения ДАУ. -
prob
: исходная задача DAEProblem, которая была решена. -
alg
: тип алгоритма, используемого решателем. -
stats
: статистика по решателю, например количество необходимых вычислений функции, количество вычисленных якобианов и др. -
retcode
: код возврата от решателя. Используется для определения того, успешно ли решен решатель, завершился ли он досрочно из-за определенного пользователем обратного вызова или завершился ли он из-за ошибки. Дополнительные сведения см. в документации по кодам возврата.
Примеры задач
Примеры задач можно найти на странице DiffEqProblemLibrary.jl.
Использовать пример задачи, например prob_dae_resrob
, можно так:
using DiffEqProblemLibrary.DAEProblemLibrary, Sundials
prob = DAEProblemLibrary.prob_dae_resrob
sol = solve(prob, IDA())
#
DAEProblemLibrary.prob_dae_resrob
— Constant
Биохимические реакции Робертсона в форме DAE.
где , , . Подробные сведения см. в документе: Hairer Norsett Wanner Solving Ordinary Differential Equations I - Nonstiff Problems Page 129 Usually solved on ]