Julia 在ODE运行时使用该问题的结果

Julia 在ODE运行时使用该问题的结果,julia,simulation,differential-equations,differentialequations.jl,Julia,Simulation,Differential Equations,Differentialequations.jl,我目前正在研究我的旧的计算神经科学代码的文档,并尝试移植这些代码来使用它,而不是我自己的、不那么优雅和性能较差的ODE解算器。在执行此操作时,我偶然发现了以下问题:是否可以在返回当前步骤后立即访问并使用解算器返回的结果(而不是等待问题完成) 我正在寻找一种方法,例如,实时绘制模拟神经元的电压水平,这似乎是一项足够简单的任务,而且使用现有的Julia软件包可能很简单,但我不知道如何实现。它与回调有什么关系吗?提前感谢。Plots.jl现在似乎没有为我制作动画,但我将向您展示这些步骤。是的,您可以为

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


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

Plots.jl现在似乎没有为我制作动画,但我将向您展示这些步骤。是的,您可以为此使用
离散回调
。如果设置
条件(u,t,integrator)=true
,则
影响,您可以这样做

但是,我认为使用integrator接口非常适合这种情况。让我给你举个例子。以教程中的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 = init(prob,Tsit5())
integrator接口是完整定义的,但基本用法是您可以使用
step。如果你把它放在一个循环中,然后继续前进,那么本质上这就是
solve
所做的。但是它也有迭代器接口,因此如果您在integrator中执行类似于
的操作,那么for循环
integ
内部将是integrator的当前状态,在时间点
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接口似乎确实为我提供了所需的一切。