在julia的DifferentialEquations.jl中,是否可以将我的函数转换为标准ODE函数?

时间:2019-04-27 13:04:51

标签: julia

我想用自己的函数构建ODE函数,并且可以将此函数输入到DifferentialEquations.jl中的ODEProblem中。

这是一个简化的示例。
我有两个结构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,))

在这种情况下,我在A中只有一个B分量。
但是在其他情况下,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 :(得分:0)

我认为您正在寻找ModelingToolkit.jl库,该库允许以编程方式构造微分方程函数。自述文件中的示例构建了Lorenz方程:

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

然后,您可以定义作为组合表达式的新变量,并在导数方程式中使用它们。该库正在持续开发中(当前日期:2019/4/27),未来的功能将使合并预构建的微分方程模型变得更加容易,从而更轻松地构建大型微分方程系统。