Are*_*lis 3 simulation differential-equations julia differentialequations.jl
我目前正在研究DifferentialEquations.jl的文档,并尝试移植我的旧计算神经科学代码,而不是我自己的,不那么优雅和高性能的ODE求解器.在这样做时,我偶然发现了以下问题:是否可以在返回当前步骤后立即访问并使用求解器返回的结果(而不是等待问题完成)?
我正在寻找一种方法,例如实时绘制模拟神经元的电压电平,这似乎是一个足够简单的任务,并且使用已有的Julia软件包可能很简单,但我无法弄清楚如何.是否必须对回调做任何事情?提前致谢.
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)
Run Code Online (Sandbox Code Playgroud)
现在不是使用solve,而是init用来获取integrator.
integrator = init(prob,Tsit5())
Run Code Online (Sandbox Code Playgroud)
集成商界面在其文档页面中已完整定义,但基本用法是您可以单步使用step!.如果你把它放在一个循环中并继续踩踏,那么这基本上是什么solve.但它也有迭代器接口,所以如果你做了类似的事情,for integ in integrator那么for循环内部integ将是积分器的当前状态,integ.u在时间点有值integ.t.它还有各种各样的东西,比如用于中间插值的绘图配方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)
Run Code Online (Sandbox Code Playgroud)
和Plots.jl将为您提供动画gif,在每一步添加当前间隔.这是最终情节的样子:
它在每一步都有不同的颜色,因为它是一个不同的情节,所以你可以看到它是如何继续的.当然,您可以在该循环内部执行任何操作,或者如果您需要更多控制,则可以step!(integrator)根据需要手动执行.