Задачи с динамическими ODE, гамильтоновыми ODE и ODE второго порядка

# SciMLBase.DynamicalODEProblemType

Определяет задачу 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.SecondOrderODEProblemType

Определяет задачу динамического ОДУ 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.DynamicalODEFunctionType

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

Конструкторы

HamiltonianProblem{T}(H, p0, q0, tspan, param = nothing; kwargs...)

Поля

  • H: гамильтониан H(p,q,params), возвращающий скаляр.

  • p0: начальные моменты сил.

  • q0: начальные положения.

  • tspan: временной интервал задачи.

  • param: значение по умолчанию — nothing. param передается в params H.