Документация Engee

Задачи DAE

Определяет задачу 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())
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 для автоматического символического построения якобиана и других компонентов из численно-определенных функций.

Тип решения

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())

Биохимические реакции Робертсона в форме DAE.

где , , . Подробные сведения см. в документе: Hairer Norsett Wanner Solving Ordinary Differential Equations I - Nonstiff Problems Page 129 Usually solved on ]