SciMLはローレンツ方程式を解きます

ローレンツアトラクタは微分方程式の古典的なエントリケースであり、画像も非常に認識されます。どの言語でも、微分方程式を解くパッケージはどれもローレンツを解くのが好きです。

その方程式は

dxdt =σ(y − x)dydt = x(ρ− z)− ydzdt = xy −βz \ begin {aligned} \ frac {\ text dx} {\ text dt}&= \ sigma(yx)\\ \ frac {\ text dy} {\ text dt}&= x(\ rho-z)-y \\ \ frac {\ text dz} {\ text dt}&= xy- \ beta z \ end {aligned}d tdx _d td yd tdz _=σ yx =x ρ=xy _βz _

ジュリア関数として書き直してください

function lorenz!(du,u,p,t)
    σ,ρ,β = p
    du[1] = σ*(u[2]-u[1])
    du[2] = u[1]*(ρ-u[3]) - u[2]
    du[3] = u[1]*u[2] - β*u[3]
end

初期値を設定するu0u_0u0およびパラメータpppはに設定されます

u0 = [1.0,0.0,0.0]
p = (10,28,8/3)

あなたと行く

using DifferentialEquations         #导入微分方程包
tspan = (0.0,100.0)
prob = ODEProblem(lorenz!,u0,tspan,p)
sol = solve(prob)

お絵かき

using Plots; gr()
plot(sol,vars=(1,2,3))
savefig("ode_4.png")

ここに画像の説明を挿入

もちろん、この画像では実際には「アンチエイリアシング」がオンになっています。sol結果自体は個別の量のセットであるため、閉じdenseplotた後、次のように表示されます。

plot(sol,vars=(1,2,3),denseplot=false)
savefig("ode_5.png")

ここに画像の説明を挿入

ParameterizedFunctions.jl非常に便利なマクロがで提供されておりode_def、パラメトリック形式でローレンツ方程式をより直感的に記述できます。

L = @ode_def Lorentz begin
    dx = σ*(y-x)
    dy = x*(ρ -z)- y
    dz = x*y -β*z
end σ ρ β

prob = ODEProblem(L,u0,tspan,p)
sol = solve(prob)
plot(sol,vars=(1,2,3))

おすすめ

転載: blog.csdn.net/m0_37816922/article/details/123681528
おすすめ