我是Julia的新人,我想解决这个系统
\ frac {dx} {dt} = k1y \ \ frac {dy} {dt} = k2y + I
其中k1和k2是常数参数。但是,当y,0或Ky时,I = 0,其中k为常数。
我遵循了有关ODE的教程,问题是如何在DifferentialEquations.jl中解决此分段微分方程,但是我没有找到有关分段函数的任何信息
预先感谢
Francisco
答案 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
来获得更平滑的解决方案输出的原因。 (我可能也没有使用最合适的集成器,但这是我复制粘贴的上一段代码中使用的集成器。)