在Julia/Differentials方程中使用VectorContinuousCallback时,输出解决方案中事件的索引

在Julia/Differentials方程中使用VectorContinuousCallback时,输出解决方案中事件的索引,julia,differentialequations.jl,Julia,Differentialequations.jl,我有一个可以发生很多事件的动力系统。我想终止一个事件的轨迹积分,但我也想知道哪个事件被激活了 我发现的解决方法是使用一个全局变量将事件索引保存在impact函数。以下是的修改版本: 有更好的解决方案吗?您可以使用integrator.p作为缓存,并围绕该值进行更改,最后使用sol.prob.p。但是,是的,这个或Ref是一个很好的方法。您可以使用integrator.p作为缓存,并围绕该值进行更改,最后使用sol.prob.p。但是,这个或Ref是一个很好的方法。您也可以使用integrator

我有一个可以发生很多事件的动力系统。我想终止一个事件的轨迹积分,但我也想知道哪个事件被激活了

我发现的解决方法是使用一个全局变量将事件索引保存在
impact函数。以下是的修改版本:


有更好的解决方案吗?

您可以使用integrator.p作为缓存,并围绕该值进行更改,最后使用sol.prob.p。但是,是的,这个或Ref是一个很好的方法。

您可以使用integrator.p作为缓存,并围绕该值进行更改,最后使用sol.prob.p。但是,这个或Ref是一个很好的方法。

您也可以使用
integrator.p
作为缓存,并围绕该值进行更改,最后使用
sol.prob.p
。但是是的,这或是一个
Ref
是一个很好的方法。@ChrisRackauckas谢谢!我不知道我可以访问
sol.prob.p
(对于differentialsequations.jl,这就是我尝试移动到Julia的原因)您也可以使用
integrator.p
作为缓存,并围绕该值进行更改,最后使用
sol.prob.p
。但是是的,这或是一个
Ref
是一个很好的方法。@ChrisRackauckas谢谢!我不知道我可以访问
sol.prob.p
(对于differentialsequations.jl,这就是我试图转到Julia的原因)
using DifferentialEquations

function f(du,u,p,t)
  du[1] = u[2]
  du[2] = -p
  du[3] = u[4]
  du[4] = 0.0
end

function condition(out,u,t,integrator) # Event when event_f(u,t) == 0
  out[1] = u[1]
  out[2] = (u[3] - 10.0)u[3]
end

event_idx = [0, ]  # global variable
function affect!(integrator, idx)
    event_idx[1] = idx
    terminate!(integrator)
end

cb = VectorContinuousCallback(condition,affect!,2)

u0 = [50.0,0.0,0.0,2.0]
tspan = (0.0,15.0)
p = 9.8
prob = ODEProblem(f,u0,tspan,p)
sol = solve(prob,Tsit5(),callback=cb,dt=1e-3,adaptive=false)
println(sol.retcode)
println(event_idx) # [1]