2

У меня есть код JuLiA:оживляющий решение ОДУ в Джулии

using DifferentialEquations 
using Plots 
using ParameterizedFunctions 
plotly() 
lorenz = @ode_def Lorenz begin 
    dx = σ*(y-x) 
    dy = ρ*x-y-x*z 
    dz = x*y-β*z 
end σ = 10. β = 8./3. ρ => 28. 
u0 = [1., 5., 10.] 
tspan = (0., 2.) 
prob = ODEProblem(lorenz, u0, tspan) 
sol = solve(prob,save_timeseries=true) 
plot(sol,vars=(:x,:y,:z)) 

Какие результаты в: next plot
Как я могу оживить этот сюжет таким образом, что он будет работать либо от РЕПЛ и jupyter?

ответ

2

Для DifferentialEquations.jl существует встроенная функция анимации, которая может справиться с этим. К сожалению, я понял, что забыл поставить его в последнем выпуске. Когда она выйдет, синтаксис будет (упрощая ваш код немного):

using DifferentialEquations 
using Plots 
using ParameterizedFunctions 
pyplot() 
lorenz = @ode_def Lorenz begin 
    dx = σ*(y-x) 
    dy = ρ*x-y-x*z 
    dz = x*y-β*z 
end σ = 10. β = 8./3. ρ => 28. 
u0 = [1., 5., 10.] 
tspan = (0., 2.) 
prob = ODEProblem(lorenz, u0, tspan) 
sol = solve(prob) 
animate(sol,vars=(:x,:y,:z),xlims=(-20,20),ylims=(-15,20),zlims=(10,40)) 

Несколько вещей: animate может принимать любое из нормального сюжета команды. Тем не менее, он в каждом кадре рисует от начала до i-го шага, что означает, что вам может понадобиться вручную установить ось, чтобы они не смещались. Другое дело, что я переключил серверы на PyPlot. Плоский бэкэнд не может делать анимации. Может быть, PlotlyJS может? The animation function is documented here.

Использование этой команды будет самым простым способом, но вы можете сделать это «более вручную», используя integrator interface. По сути, вы можете просто построить интервал каждого шага, используя это и в конце концов попасть в одно и то же место. Вам нужно будет использовать Plots.jl's animation interface.

Редактировать: Если вы Pkg.update(), это должно работать.

 Смежные вопросы

  • Нет связанных вопросов^_^