Plot julia向量微分方程:仅绘制向量的前n个分量

Plot julia向量微分方程:仅绘制向量的前n个分量,plot,julia,ode,Plot,Julia,Ode,我在Julia中积分一个向量微分方程(分量的数量级为50)。当我绘制这个解决方案时,如果我绘制所有组件,显然这个图会非常拥挤,所以我只想绘制前10个组件。我不知道怎么做。另外,我不想绘制每个组件的输出,我不想绘制每个时间步的积分输出,而是绘制该时间步的双曲正切。我也不知道怎么做这个操作。我认为关键的问题是我不理解/发现微分方程的解在julia中是什么样的对象 下面是一个最小的工作示例,它集成了微分方程并绘制了整个解决方案 using DifferentialEquations using Plo

我在Julia中积分一个向量微分方程(分量的数量级为50)。当我绘制这个解决方案时,如果我绘制所有组件,显然这个图会非常拥挤,所以我只想绘制前10个组件。我不知道怎么做。另外,我不想绘制每个组件的输出,我不想绘制每个时间步的积分输出,而是绘制该时间步的双曲正切。我也不知道怎么做这个操作。我认为关键的问题是我不理解/发现微分方程的解在julia中是什么样的对象

下面是一个最小的工作示例,它集成了微分方程并绘制了整个解决方案

using DifferentialEquations
using Plots
using LinearAlgebra

N=50                      
J=0.18*randn(Float64,N,N)   
g=1   

function hDerivative(timederiv,h,p,t)
    for i=1:length(h)
        timederiv[i] = -h[i]
        for j=1:length(h)
            timederiv[i]=+timederiv[i]+J[i,j]*tanh(g*h[j])            
        end

    end  
end

function pltTimeVolution()
    hinit=rand(Float64,N)
    tspan=(0.0,50)
    prob = ODEProblem(hDerivative,hinit,tspan)
    sol=solve(prob)

    plot(sol)  
    print(sol)

end

pltTimeVolution()

有关帮助,请查看解决方案处理页面:。解决方案是一个抽象数组和一个连续函数。例如,你可以在10000个等距时间点得到一个连续的解,比如
t=range(tspan[1],stop=tspan[2],length=10000)
,do
a=sol(t)
,这将在等距时间点得到每个解的50x10000个时间序列,然后
sol[i,:]
将是
i
th变量在时间点
t
的时间序列。你可以用它来构建你想要的阵列,并绘制它们。完整代码如下:

t=range(tspan[1],stop=tspan[2],length=10000)
A = sol(t)
ts10 = sol[10,:]
另一种方法是使用类似于
saveat=t
的方法进行求解,在这种情况下,解决方案是在这些时间点保存的数组。这看起来像:

t=range(tspan[1],stop=tspan[2],length=10000)
sol=solve(prob,saveat=t)
ts10 = sol[10,:]
或者你也可以利用plot recipe在内部进行这种处理。看一看。可以绘制第一个变量的曲线图,然后覆盖第十个变量的曲线图,如:

plot(sol,vars=(0,1))
plot!(sol,vars=(0,10))
表示其为变异绘图功能,即通过添加新系列修改先前的绘图。然后,如文档中所述,有一些快捷方式,如

plot(sol,vars = [1, 3, 4])
将绘制第一、第三和第四个变量作为时间函数。在这种形式中,您还可以指定作为函数所需的转换类型。这在文档中的同一位置提到。例如,时间与tanh的二维图将是变换函数
f=(t,y)->(t,tanh(y))
,也就是说,如何引入2D变量并吐出2D变量来绘制,只需通过第一个变量和
tanh
第二个变量即可。然后使用此命令,可以使用plot命令:

f=(t,y)->(t,tanh(y))
plot(sol,vars = (f,0,5))
绘制第5个变量的
tanh
与时间的关系图

以下是操纵solution参数和生成所需绘图的几种不同方法。选择一个最适合你的