使用Julia

时间:2018-07-05 16:55:26

标签: julia differentialequations.jl

我是Julia的新人,我想解决这个系统

\ frac {dx} {dt} = k1y \ \ frac {dy} {dt} = k2y + I

其中k1和k2是常数参数。但是,当y,0或Ky时,I = 0,其中k为常数。

我遵循了有关ODE的教程,问题是如何在DifferentialEquations.jl中解决此分段微分方程,但是我没有找到有关分段函数的任何信息

预先感谢

Francisco

1 个答案:

答案 0 :(得分:1)

在OP Julia Discourse的交叉帖子上得到答复;为了完整起见,在这里复制。

这是一个(轻微)有趣的示例$ x''+ x'+ x = \ pm p_1 $,其中当在$ x = p_2 $处遇到切换流形时,$ p_1 $的符号发生变化。为了使事情变得更有趣,请考虑切换歧管中的磁滞,以便每当穿越切换歧管时$ p_2 \ mapsto -p_2 $。

代码相对简单;可以忽略StaticArrays / SVector / MVector,它们只是为了提高速度。

using OrdinaryDiffEq
using StaticArrays

f(x, p, t) = SVector(x[2], -x[2]-x[1]+p[1])  # x'' + x' + x = ±p₁
h(u, t, integrator) = u[1]-integrator.p[2]  # switching surface x = ±p₂;
g(integrator) = (integrator.p .= -integrator.p)  # impact map (p₁, p₂) = -(p₁, p₂)

prob = ODEProblem(f,  # RHS
                  SVector(0.0, 1.0),  # initial value
                  (0.0, 100.0),  # time interval
                  MVector(1.0, 1.0))  # parameters
cb = ContinuousCallback(h, g)
sol = solve(prob, Vern6(), callback=cb, dtmax=0.1)

然后将sol[2,:]相对于sol[1,:]作图以查看相平面-在这种情况下,这是一个很好的非平滑极限循环。

请注意,如果您尝试对结果解(例如,sol(t))进行插值,则由于插值运算会有些偏差,因此需要非常注意具有不连续导数的点。这就是为什么我在这种情况下使用dtmax=0.1来获得更平滑的解决方案输出的原因。 (我可能也没有使用最合适的集成器,但这是我复制粘贴的上一段代码中使用的集成器。)