有没有办法将我的函数转换为julia中Differentialsequations.jl中的标准ODE函数?
我想用我自己的函数来构建ODE函数,这个函数可以输入微分方程中的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
我有两个结构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])