DifferentialEquations.jl 回调函数选择问题
Callback function choosing problem in DifferentialEquations.jl
我有一个对象,当它达到一个阈值时,它会进入一个静默期,我使用一个参数(我称之为ode_status)在两者之间翻转1和0判断是否进行ODE。
阈值由ContinuousCallback
实现。
fucntion condition(u, t, integrator)
u[1] - threshold
end
function affect!(integrator)
integrator.p[1] = 0 # integrator.p[1] represents ode_status
flip_back_time[1] = integrator.t + 5 # define silence period = 5s
end
ContinuousCallback(condition, affect!)
接下来,我想在5s后向后翻转ode_status,所以我使用DiscreteCallback
。
function condition(u, t, integrator)
integrator.p[1] == 0 &&
integrator.t >= flip_back_time[1]
end
function affect!(integrator)
integrator.p[1] = 1
end
DiscreteCallback(condition, affect!)
然而,结果并不是我想的那样。 ode_status 翻转回来的时间不正好在 5s 之后。在另一次试验中是 5.107... 或 5.879。
我想我误用了这些回调函数。谁能告诉我如何解决这个问题?提前致谢!
这是因为下一步不正好在5秒后的时间。请记住,DiscreteCallback 仅在步骤时间触发,因此您需要插入一个 tstop
以告诉它在未来恰好 5 秒后停止。
function affect!(integrator)
integrator.p[1] = 0 # integrator.p[1] represents ode_status
flip_back_time[1] = integrator.t + 5 # define silence period = 5s
add_tstop!(integrator,integrator.t + 5)
end
我有一个对象,当它达到一个阈值时,它会进入一个静默期,我使用一个参数(我称之为ode_status)在两者之间翻转1和0判断是否进行ODE。
阈值由ContinuousCallback
实现。
fucntion condition(u, t, integrator)
u[1] - threshold
end
function affect!(integrator)
integrator.p[1] = 0 # integrator.p[1] represents ode_status
flip_back_time[1] = integrator.t + 5 # define silence period = 5s
end
ContinuousCallback(condition, affect!)
接下来,我想在5s后向后翻转ode_status,所以我使用DiscreteCallback
。
function condition(u, t, integrator)
integrator.p[1] == 0 &&
integrator.t >= flip_back_time[1]
end
function affect!(integrator)
integrator.p[1] = 1
end
DiscreteCallback(condition, affect!)
然而,结果并不是我想的那样。 ode_status 翻转回来的时间不正好在 5s 之后。在另一次试验中是 5.107... 或 5.879。
我想我误用了这些回调函数。谁能告诉我如何解决这个问题?提前致谢!
这是因为下一步不正好在5秒后的时间。请记住,DiscreteCallback 仅在步骤时间触发,因此您需要插入一个 tstop
以告诉它在未来恰好 5 秒后停止。
function affect!(integrator)
integrator.p[1] = 0 # integrator.p[1] represents ode_status
flip_back_time[1] = integrator.t + 5 # define silence period = 5s
add_tstop!(integrator,integrator.t + 5)
end