julia - 在 Julia/DifferentialEquations 中使用 VectorContinuousCallback 时输出解中事件的索引
问题描述
我有一个可能发生许多事件的动态系统。我想终止一个事件上的轨迹积分,但我也想知道哪个事件被激活了。
我找到的解决方法是使用全局变量将事件索引保存在affect!
函数中。这是弹跳球示例的修改版本:
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]
这样做有更好的解决方案吗?
解决方案
您可以使用 integrator.p 作为缓存,并围绕该值进行更改,最后使用 sol.prob.p。但是,是的,这个或 Ref 是一个很好的方法。
推荐阅读
- three.js - 未捕获的 TypeError:THREE.GLTFLoader 不是构造函数
- c# - 使用Identity时,如何在没有注册页面的情况下注册第一个用户?
- javascript - 获取今天的日期并添加 7 天(用于 Google 选择加入代码)
- ruby-on-rails - 活动记录查询枚举列
- ruby-on-rails - 如何将 resque-web 用于 rails api-only 应用程序?
- r - 为什么在 0 列的 data.frame 上调用 rbind 会丢弃所有行?
- java - 如何在 android listview 中使可点击并打开自定义警报对话框?
- java - 指定的孩子已经有一个父母。创建自定义视图类时,您必须首先在孩子的父级上调用 removeView()
- database - 多人游戏服务器、客户端数据库结构
- r - R:到 LATEX 中的稳健标准错误