在 运行 时使用 ODEProblem 的结果
Using results from ODEProblem while it is running
我目前正在研究 DifferentialEquations.jl 的文档,并尝试移植我较旧的计算神经科学代码以使用它,而不是我自己的、不够优雅和性能的 ODE 求解器。在执行此操作时,我偶然发现了以下问题:是否可以在返回当前步骤后立即访问和使用求解器返回的结果(而不是等待问题完成)?
我正在寻找一种方法,例如实时绘制模拟神经元的电压水平,这似乎是一项足够简单的任务,而且使用现有的 Julia 包可能很简单,但我不知道如何做。它与回调有什么关系吗?提前致谢。
Plots.jl 现在对我来说似乎没有动画效果,但无论如何我都会向您展示这些步骤。是的,您可以为此使用 DiscreteCallback
。如果你做 condition(u,t,integrator)=true
那么每一步都会调用 affect!
,你可以这样做。
但是,我认为使用集成器界面非常适合这种情况。让我给你举个例子。拿教程里的二维问题:
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.u
=24=]。它也有各种各样的东西,比如中间插值的绘图配方 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)
。
我目前正在研究 DifferentialEquations.jl 的文档,并尝试移植我较旧的计算神经科学代码以使用它,而不是我自己的、不够优雅和性能的 ODE 求解器。在执行此操作时,我偶然发现了以下问题:是否可以在返回当前步骤后立即访问和使用求解器返回的结果(而不是等待问题完成)?
我正在寻找一种方法,例如实时绘制模拟神经元的电压水平,这似乎是一项足够简单的任务,而且使用现有的 Julia 包可能很简单,但我不知道如何做。它与回调有什么关系吗?提前致谢。
Plots.jl 现在对我来说似乎没有动画效果,但无论如何我都会向您展示这些步骤。是的,您可以为此使用 DiscreteCallback
。如果你做 condition(u,t,integrator)=true
那么每一步都会调用 affect!
,你可以这样做。
但是,我认为使用集成器界面非常适合这种情况。让我给你举个例子。拿教程里的二维问题:
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.u
=24=]。它也有各种各样的东西,比如中间插值的绘图配方 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)
。