首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在DifferentialEquations.jl中的n个回调之后,有没有一种惯用的方法来终止集成

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

Stack Overflow用户
提问于 2019-04-09 12:16:38
回答 1查看 269关注 0票数 5

首先,我使用的是DifferentialEquations.jl库,它非常棒!无论如何,我的问题如下:

举个例子,我有下面的微分方程:

代码语言:javascript
复制
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轴时都会触发:

代码语言:javascript
复制
function condition(u, t, integrator)
    u[2]
end

然而,我需要集成终止后,恰好3个交叉。我知道可以通过使用以下效果来终止集成:

代码语言:javascript
复制
function affect!(integrator)
    terminate!(integrator)
end

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

在我的研究中,我经常需要查看Poincare地图和第一,第二,第三等返回到地图,所以我需要一个框架,允许我执行这种计数终止。我对Julia还是个新手,所以我正在努力在早期强化良好的习惯用法代码。感谢任何帮助,请随时要求澄清。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-09 18:54:49

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

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

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

代码语言:javascript
复制
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))
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55585048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档