【问题标题】:Using results from ODEProblem while it is running在运行时使用 ODEProblem 的结果
【发布时间】:2018-02-06 22:23:52
【问题描述】:

我目前正在研究 DifferentialEquations.jl 的文档,并尝试移植我较旧的计算神经科学代码来使用它,而不是我自己的、不太优雅和高性能的 ODE 求解器。在执行此操作时,我偶然发现了以下问题:是否可以在返回当前步骤后立即访问和使用从求解器返回的结果(而不是等待问题完成)?

我正在寻找一种方法,例如实时绘制模拟神经元的电压水平,这似乎是一项足够简单的任务,而且使用现有的 Julia 包可能很简单,但我不知道怎么做。它与回调有什么关系吗?提前致谢。

【问题讨论】:

    标签: julia simulation differential-equations differentialequations.jl


    【解决方案1】:

    Plots.jl 现在似乎没有为我制作动画,但无论如何我都会向您展示这些步骤。是的,您可以为此使用DiscreteCallback。如果你创建condition(u,t,integrator)=true,那么每一步都会调用affect!,你可以这样做。

    但是,我认为使用积分器接口非常适合这种情况。让我给你看一个例子。从教程中提取 2D 问题:

    using DifferentialEquations
    using Plots
    A  = [1. 0  0 -5
          4 -2  4 -3
         -4  0  0  1
          5 -2  2  3]
    u0 = rand(4,2)
    tspan = (0.0,1.0)
    f(u,p,t) = A*u
    prob = ODEProblem(f,u0,tspan)
    

    现在不要使用solve,而是使用init 来获取integrator

    integrator = init(prob,Tsit5())
    

    积分器接口是完整定义的at its documentation page,但基本用法是可以单步使用step!。如果你把它放在一个循环中并继续前进,那么这基本上就是solve 所做的。但它也有迭代器接口,所以如果你执行for integ in integrator 之类的操作,那么在for 循环内部integ 将是积分器的当前状态,在时间点integ.t 具有值integ.u。它还有各种各样的东西,比如用于中间插值的绘图配方integ(t)(即使dense=false 也是如此,因为它是免费的并且不需要额外的储蓄分配,所以请随意使用它)。

    所以,你可以这样做

    p = plot(integrator,markersize=0,legend=false,xlims=tspan)
    anim = @animate for integ in integrator
        plot!(p,integrator,lw=3)
    end
    plot(p)
    gif(anim, "test.gif", fps = 2)
    

    并且 Plots.jl 将为您提供在每一步添加当前间隔的动画 gif。这是最终情节的样子:

    每个步骤的颜色都不同,因为它是一个不同的情节,所以你可以看到它是如何继续的。当然,您可以在该循环内执行任何操作,或者如果您想要更多控制权,您可以根据需要手动 step!(integrator)

    【讨论】:

    • 很好的答案,一如既往!
    • 感谢您的详细解释。在这一点上,集成器界面似乎确实为我提供了我需要的一切。
    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2014-06-29
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多