Есть ли способ преобразовать мою функцию в стандартную функцию ODE в DifferentialEquations.jl в Юлии? - PullRequest
0 голосов
/ 27 апреля 2019

Я хочу построить функцию ODE своей собственной функцией, и эта функция может быть передана в ODEProblem в DifferentialEquations.jl.

Вот упрощенный пример.
У меня есть две структуры VariableA и VariableB, и я использую их для генерации A, B.
Наконец, я хочу использовать A, B для генерации функции ODE.
У A есть главное дифференциальное уравнение, и я хочу динамически добавлять B в A.
Это означает, что в A. может быть 0, 1, 2 или более компонентов B.
Понятия не имею, с чего начать.
Могу ли я реализовать идею? Есть какие-нибудь предложения?

# --------------------------
mutable struct VariableA
    main_diffeq
    params_for_diffeq::Array # a in main_diffeq_A
    B_component
end

function main_diffeq_A(a)
    dx = -a * x
end
# --------------------------


# --------------------------
mutable struct VariableB
    main_diffeq
    params_for_diffeq::Array  # b in main_diffeq_B
end

function main_diffeq_B(b)
    dx = b * x
end
# --------------------------


# the elements for my differential equations
B = VariableB(main_diffeq_B, [1])
A = VariableA(main_diffeq_A, [1], (B,))

В этом случае у меня есть только один компонент B в A.
Но в других случаях могут быть разные номера компонента B.
Следующее - моя функция, и оно будет помещено в ODEProblem(MyDiffEq!(A), u, t, p)

function MyDiffEq!(A)
    # something...
end

Цель будет равна:

function MyDiffEq!(du, u, p, t)
    # A  -->  dA = -a * A + B
    du[1] = -u[1] * p[1] + u[2]

    # B
    du[2] = u[2] * p[2]
end

Заранее спасибо!

1 Ответ

0 голосов
/ 27 апреля 2019

Я думаю, что вы ищете библиотеку ModelingToolkit.jl , которая позволяет программно создавать функции дифференциальных уравнений.Пример из README строит уравнения Лоренца:

using ModelingToolkit

# Define some variables
@parameters t σ ρ β
@variables x(t) y(t) z(t)
@derivatives D'~t
eqs = [D(x) ~ σ*(y-x),
       D(y) ~ x*(ρ-z)-y,
       D(z) ~ x*y - β*z]
de = ODESystem(eqs)
f = ODEFunction(de, [x,y,z], [σ,ρ,β])
prob = ODEProblem(f,[1.0,1.0,1.0],(0.0,100.0),[1.0,3.0,2.0])

Затем вы можете определить новые переменные, которые являются комбинированными выражениями, и использовать их в производных уравнениях.Эта библиотека находится в постоянном развитии (текущий день: 27.04.2009), и будущие функции позволят упростить объединение предварительно построенных моделей дифференциальных уравнений для упрощения построения больших систем дифференциальных уравнений.

...