有没有办法将我的函数转换为julia中Differentialsequations.jl中的标准ODE函数?

有没有办法将我的函数转换为julia中Differentialsequations.jl中的标准ODE函数?,julia,Julia,我想用我自己的函数来构建ODE函数,这个函数可以输入微分方程中的ODE问题 下面是一个简化的示例。 我有两个结构VariableA和VariableB,我使用它们生成A,B. 最后,我想使用A,B生成ODE函数。 A有一个主微分方程,我想动态地把B加到A中。 这意味着A中可以有0个或1个或2个或更多的B组件。 我不知道从哪里开始。 我能实现这个想法吗?有什么建议吗 # -------------------------- mutable struct VariableA main_dif

我想用我自己的函数来构建ODE函数,这个函数可以输入微分方程中的ODE问题

下面是一个简化的示例。
我有两个结构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!(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

提前谢谢你

我想您正在寻找一个库,该库允许对微分方程函数进行编程构造。自述文件中的示例构建了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日),未来的功能将使组合预先构建的微分方程模型更容易,从而更容易构建大型微分方程系统。

我曾多次尝试阅读您的问题,但我很难理解您的目标。你能把问题简化成一个没有不必要细节的小例子吗?很抱歉,我的问题把你弄糊涂了。我们的目标是,我的微分方程由一个主微分方程和一些分量组成(数字不确定)。例如,它可以是dA=A+B或dA=A+B+B2。我不知道如何将结构A(A将包含所有信息)转换为用(du,u,p,t)编写的标准函数。我再次编辑了这个问题,希望你能理解,谢谢!对不起,我以前没有找到这个图书馆。我会试试看,非常感谢!ModelingToolkit.jl适合我!我只是好奇ModelingToolkit.jl中没有实现回调函数,对吗?是的,但它在候选名单上:我明白。谢谢你的回复!
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])