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

Интерфейс задач

На этой странице описывается общий интерфейс задач. К любому определению функции применяются определенные правила, которые представлены в этом документе.

Встроенные и внеместные формы определения функции

У каждого определения задачи есть формы «на месте» и «не на месте», которые в контексте DiffEq обычно называют IIP (isinplace, на месте) и OOP (out of place, не на месте). Форма на месте — это изменяющая форма. Например, для ОДУ f!(du,u,p,t) — это форма на месте, которая в результате выполнения изменяет du. Возвращаемые данные попросту игнорируются. В свою очередь, форма OOP будет иметь вид du=f(u,p,t) — здесь используется возвращаемое значение.

Для каждого вида задачи изменяемым аргументом является первый аргумент. Система SciMLBase автоматически определяет функциональную форму и добавляет к функции спецификатор типа isinplace, который содержит информацию о том, является ли функция, определенная для данной задачи DEProblem, выполняемой на месте. Однако каждый конструктор позволяет вручную указать, выполняется ли функция на месте. Например, это можно сделать на уровне задачи следующим образом:

ODEProblem{true}(f, u0, tspan, p)

Здесь объявляется isinplace=true. Это также можно сделать на уровне DEFunction. Например:

ODEFunction{true}(f, jac = myjac)

Спецификации типа

В DifferentialEquations.jl для решения используются типы, указанные в задаче. Если для задачи требуется начальное значение u0, тип переменной состояния u будет соответствовать типу u0. Аналогичным образом, если в задаче есть время, тип переменной t производится от типов tspan. Параметры p могут быть любого типа, причем тип соответствует определенному в задаче.

Внутренние матрицы, такие как матрицы Якоби и броуновские кэши, также должны соответствовать типу, указанному пользователем. Таким образом, jac_prototype и rand_prototype могут иметь любой тип матрицы Julia, совместимый с выполняемыми операциями.

Ввод функциональных и сжатых задач

Обратите внимание, что начальное условие можно записать как функцию от параметров и начального времени:

u0(p, t0)

и разрешить перед передачей в решатель. Начальное условие также может быть распределением из Distributions.jl. В таком случае при каждом вызове init или solve производится выборка начального условия.

Помимо этого, tspan поддерживает следующие формы. Форма с одним значением t эквивалентна (zero(t),t). Допускается функциональная форма:

tspan(p)

Она возвращает кортеж.

Примеры

using DifferentialEquations
prob = ODEProblem((u, p, t) -> u, (p, t0) -> p[1], (p) -> (0.0, p[2]), (2.0, 1.0))
ODEProblem with uType Main.var"#2#5" and tType Unknown. In-place: false
timespan: #3 (generic function with 1 method)
u0: #2 (generic function with 1 method)
using Distributions
prob = ODEProblem((u, p, t) -> u, (p, t) -> Normal(p, 1), (0.0, 1.0), 1.0)
ODEProblem with uType Main.var"#8#10" and tType Float64. In-place: false
timespan: (0.0, 1.0)
u0: #8 (generic function with 1 method)

Низкоуровневые init и solve

В общем случае перед передачей в решатель задач, с которыми связаны известные проблемы, выдаются предупреждения с целью уведомления пользователя. В случае с адаптивным решателем проверяются следующие случаи:

  • предупреждение о целочисленных значениях времени;

  • дуальные числа должны соответствовать начальным условиям и временным интервалам;

  • значения Measurements.jl должны соответствовать начальным условиям и временным интервалам.

Если есть исключение из этих правил, сообщите о проблеме. Чтобы обойти проверки высокоуровневого интерфейса решения, можно вызвать init или solve.

Изменение типов задач

Связанные с задачами типы в DifferentialEquations.jl являются неизменяемыми. Это позволяет, например, распараллеливать решатели для эффективной обработки задач.

Однако вам может потребоваться изменить уже созданную задачу, например, чтобы увеличить временной интервал моделирования. Это можно сделать с помощью функции remake:

prob1 = ODEProblem((u, p, t) -> u / 2, 1.0, (0.0, 1.0))
prob2 = remake(prob1; tspan = (0.0, 2.0))
ODEProblem with uType Float64 and tType Float64. In-place: false
timespan: (0.0, 2.0)
u0: 1.0

Общий синтаксис remake выглядит так:

modified_problem = remake(original_problem;
                          field_1 = value_1,
                          field_2 = value_2,
                          ...)

Здесь имя field_N и значение value_N поля меняются на новые.