1

我有一个对象,当它达到阈值时,它将进入静默期,我使用一个在 1 和 0 之间翻转的参数(我称之为ode_status)来确定是否执行 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。

我想我滥用了这些回调函数。有人能告诉我如何解决这个问题吗?提前致谢!

4

1 回答 1

2

这是因为下一步并不完全在 5 秒后的时间。请记住,DiscreteCallback 仅在步进时间触发,因此您需要插入 atstop来告诉它在未来 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
于 2021-05-21T12:22:42.827 回答