【问题标题】:Callback function choosing problem in DifferentialEquations.jlDifferentialEquations.jl 中的回调函数选择问题
【发布时间】:2020-08-11 19:05:20
【问题描述】:

我有一个对象,当它达到一个阈值时,它会进入一个静默期,我使用一个在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。

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

【问题讨论】:

    标签: julia differentialequations.jl


    【解决方案1】:

    这是因为下一步并不完全在 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-28
      • 1970-01-01
      • 2019-01-29
      • 2020-09-11
      • 1970-01-01
      • 1970-01-01
      • 2020-08-02
      • 1970-01-01
      相关资源
      最近更新 更多