在DifferentialEquations.jl中的n个回调之后是否有一种惯用的方法来终止集成

问题描述 投票:5回答:1

首先,我使用DifferentialEquations.jl库,太棒了!无论如何,我的问题如下:

比如说,我有以下微分方程:

function f(du, u, t)
    du[1] = u[3]
    du[2] = u[4]
    du[3] = -u[1] - 2 * u[1] * u[2]
    du[4] = -u[2] - u[1]^2 + u[2]^2
end

我有一个回调,每次轨迹穿过y轴时都会触发回调:

function condition(u, t, integrator)
    u[2]
end

但是,我需要集成在正好3次交叉后终止。我知道可以通过使用效果终止集成:

function affect!(integrator)
    terminate!(integrator)
end

但是,在满足终止标准之前,允许计算回调次数的正确方法是什么。此外,有没有办法将此方法扩展到具有n个不同计数的n个事件?

在我的研究中,我经常需要查看Poincare地图以及第一,第二,第三等返回地图,因此我需要一个允许我执行此计数终止的框架。我还是朱莉娅的新手,所以我想尽早加强好的惯用代码。任何帮助表示赞赏,请随时要求澄清。

julia differential-equations
1个回答
5
投票

userdata有一个solve关键字参数,可以对此有用。它允许您将对象传递给积分器。这些对象可以通过回调函数以创造性的方式使用。

如果你将userdata = Dict(:my_key=>:my_value)传递给solve,那么你可以从integrator.opts.userdata[:my_key]访问它。

这是一个最小的示例,它控制在实际终止模拟之前触发回调的次数:

function f(du, u, t)
    du[1] = sin(t)
end
function condition(u, t, integrator)
    u[1] 
end

function affect!(integrator)
    integrator.opts.userdata[:callback_count] +=1
    if integrator.opts.userdata[:callback_count] == integrator.opts.userdata[:max_count]
        terminate!(integrator)
    end
end


callback = ContinuousCallback(condition, affect!)

u0 = [-1.]
tspan = (0., 100.)

prob = ODEProblem(f, u0, tspan)
sol = solve(prob; callback=callback, userdata=Dict(:callback_count=>0, :max_count=>3))
© www.soinside.com 2019 - 2024. All rights reserved.