求解微分方程并绘制结果时,如何增加绘制的数据点数量?我有
using DifferentialEquations
using Plots
function lorenz(du,u,p,t)
du[1] = 10.0*(u[2]-u[1])
du[2] = u[1]*(28.0-u[3]) - u[2]
du[3] = u[1]*u[2] - (8/3)*u[3]
end
u0 = [5.0;0.0;0.0]
tspan = (0.0,100000.0)
prob = ODEProblem(lorenz,u0,tspan)
sol = solve(prob)
plot(sol, vars = 1, xlims = (10,100000),xscale =:log)
具体来说,当使用PyPlots这样的东西时,我可以使用:
x = linspace(0,100000,num=10000)
其中,我设置num=10000,这增加了样本数量,并允许在更长的集成时间跨度内获得更高的数据点分辨率。
显而易见的答案是使用PyPlots,但我不确定是否可以将PyPlots与DifferentialEquations包一起使用。很高兴知道Plots是如何做到这一点的。(根据函数的不同,有些情节会出现锯齿状(。
Plots.jl
实际上是一个封装器,用于封装像PyPlot.jl
和GR.jl
这样的后端(它们也是封装器(。
如果安装了PyPlot.jl
,则可以通过调用pyplot()
使Plots.jl
使用PyPlot。
using Plots
pyplot() # switch to PyPlot
plot(sol.t[2:end], sol[1,2:end], xlim =(10,100000), xscale=:log10)
注意,我从第二个索引开始,因为在第一个索引t
为0,这会造成日志规模的问题(即使设置了xlim
(。这将使用解决方案中的每个数据点。如果你在终端上,这将打开PyPlot GUI,这样你就可以随心所欲地缩放。如果您在Juno上,可以使用gui(plot(...))
打开窗口。
您可以在任意时间点对系统进行采样。(使用DifferentialEquations
'插入剂sol(t)
(
t = range(10, stop = 100000, num=10000) # to reach t=100000 you need to adjust `maxiters` accordingly in your call to `solve`
samples = sol(t) # sample using interpolator
plot(samples.t, samples.u[1,:], xscale=:log10)
您也可以使用不带对数刻度和plotdensity
选项的配方。
plot(sol, vars=1, plotdensity=1000)
有关更多示例,请参见此处:http://diffeq.sciml.ai/stable/basics/plot.html