julia 向量微分方程:仅绘制向量的前 n 个分量
julia vector differential equation: plot only the first n components of the vector
我在 Julia 中对一个向量微分方程求积分(分量的数量是 50 的数量级)。当我绘制这个解决方案时,如果我绘制所有组件,显然这个图会非常拥挤,所以我只想绘制前 10 个组件。我找不到该怎么做。另外,我不想绘制每个组件的输出,而是不想绘制每个时间步长的积分输出,而是绘制它的双曲正切值。我也找不到如何进行这种操作。我觉得关键问题是我不知道understand/find微分方程的解在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()
如需帮助,请查看解决方案处理页面:http://diffeq.sciml.ai/latest/basics/solution.html。解决方案既是抽象数组又是连续函数。因此,例如,您可以在 10000 个均匀间隔的时间点(如 t=range(tspan[1],stop=tspan[2],length=10000)
)获得连续解,执行 A = sol(t)
,这将在均匀间隔的时间点给出每个解的 50x10000 时间序列,然后 sol[i,:]
将是第 i
个变量在时间点 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,:]
或者您可以使用在内部进行这种处理的绘图配方。看看 http://diffeq.sciml.ai/latest/basics/plot.html#Choosing-Variables-1 。你可以做一些事情,比如绘制第一个变量,然后覆盖第 10 个变量的图,比如:
plot(sol,vars=(0,1))
plot!(sol,vars=(0,10))
!
表示它的突变绘图功能,即通过添加新系列来修改以前的绘图。然后如文档中所述,有快捷方式,例如
plot(sol,vars = [1, 3, 4])
将绘制第 1、第 3 和第 4 个变量作为时间的函数。在这种形式中,您还可以指定您希望将哪种转换作为函数。在文档中的同一位置提到了这一点。例如,time vs tanh 的二维图就是变换函数 f=(t,y)->(t,tanh(y))
,即你如何将 2D 变量取入并吐出 2D 变量进行绘图只是通过第一个和 tanh
第二。然后使用这个,你会使用绘图命令:
f=(t,y)->(t,tanh(y))
plot(sol,vars = (f,0,5))
绘制第 5 个变量的 tanh
与时间的关系。
这些是操纵解决方案参数和生成所需绘图的几种不同方法。选择最适合您的一款。
我在 Julia 中对一个向量微分方程求积分(分量的数量是 50 的数量级)。当我绘制这个解决方案时,如果我绘制所有组件,显然这个图会非常拥挤,所以我只想绘制前 10 个组件。我找不到该怎么做。另外,我不想绘制每个组件的输出,而是不想绘制每个时间步长的积分输出,而是绘制它的双曲正切值。我也找不到如何进行这种操作。我觉得关键问题是我不知道understand/find微分方程的解在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()
如需帮助,请查看解决方案处理页面:http://diffeq.sciml.ai/latest/basics/solution.html。解决方案既是抽象数组又是连续函数。因此,例如,您可以在 10000 个均匀间隔的时间点(如 t=range(tspan[1],stop=tspan[2],length=10000)
)获得连续解,执行 A = sol(t)
,这将在均匀间隔的时间点给出每个解的 50x10000 时间序列,然后 sol[i,:]
将是第 i
个变量在时间点 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,:]
或者您可以使用在内部进行这种处理的绘图配方。看看 http://diffeq.sciml.ai/latest/basics/plot.html#Choosing-Variables-1 。你可以做一些事情,比如绘制第一个变量,然后覆盖第 10 个变量的图,比如:
plot(sol,vars=(0,1))
plot!(sol,vars=(0,10))
!
表示它的突变绘图功能,即通过添加新系列来修改以前的绘图。然后如文档中所述,有快捷方式,例如
plot(sol,vars = [1, 3, 4])
将绘制第 1、第 3 和第 4 个变量作为时间的函数。在这种形式中,您还可以指定您希望将哪种转换作为函数。在文档中的同一位置提到了这一点。例如,time vs tanh 的二维图就是变换函数 f=(t,y)->(t,tanh(y))
,即你如何将 2D 变量取入并吐出 2D 变量进行绘图只是通过第一个和 tanh
第二。然后使用这个,你会使用绘图命令:
f=(t,y)->(t,tanh(y))
plot(sol,vars = (f,0,5))
绘制第 5 个变量的 tanh
与时间的关系。
这些是操纵解决方案参数和生成所需绘图的几种不同方法。选择最适合您的一款。