我想用自己的函数构建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
提前谢谢!
答案 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),未来的功能将使合并预构建的微分方程模型变得更加容易,从而更轻松地构建大型微分方程系统。