DifferentialEquations.jl 中的 n 次回调后是否有一种惯用的方法来终止集成
Is there an idiomatic way to terminate integration after n callbacks in DifferentialEquations.jl
首先,我正在使用 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 映射以及映射的第一、第二、第三等 return,因此我需要一个允许我执行此计数终止的框架.我对 Julia 还是个新手,所以我想尽早强化良好的惯用代码。感谢任何帮助,请随时要求澄清。
solve
有一个 userdata
关键字参数,可用于此。它允许您将对象传递给集成器。回调函数可以以创造性的方式使用这些对象。
如果您将 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))
首先,我正在使用 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 映射以及映射的第一、第二、第三等 return,因此我需要一个允许我执行此计数终止的框架.我对 Julia 还是个新手,所以我想尽早强化良好的惯用代码。感谢任何帮助,请随时要求澄清。
solve
有一个 userdata
关键字参数,可用于此。它允许您将对象传递给集成器。回调函数可以以创造性的方式使用这些对象。
如果您将 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))