Интерфейс задач
Встроенные и внеместные формы определения функции
У каждого определения задачи есть формы «на месте» и «не на месте», которые в контексте 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
поля меняются на новые.