Задачи ODE с разделением

# SciMLBase.SplitODEProblemType

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

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.