Анимация решения для ODE в Юлии

У меня есть код Джулии:

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))

Что приводит к следующему сюжету
Как я могу оживить этот сюжет так, чтобы он работал либо из REPL и Jupyter?

1 ответ

Для 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. Бэкэнд Plotly не может делать анимацию. Может PlotlyJS может? Функция анимации описана здесь.

Использование этой команды будет намного проще, но вы можете сделать это "более вручную", используя интерфейс интегратора. По сути, вы можете просто построить каждый шаг с использованием этого и в конце добраться до того же места. Вам придется использовать интерфейс анимации Plots.jl.

Изменить: если вы Pkg.update() теперь это должно работать.

Другие вопросы по тегам