Документация Engee

Осциллятор Ван дер Поля

В этом примере показано, как смоделировать дифференциальное уравнение Ван дер Поля (VDP) второго порядка в Engee. В динамике генератор неконсервативен и имеет нелинейное затухание. При больших амплитудах генератор рассеивает энергию. При малых амплитудах генератор генерирует энергию.

Осциллятор задается дифференциальным уравнением второго порядка:

image.png

где:

  1. x — положение относительно времени.

  2. t - время

  3. Mu — затухание.

Генератор VDP используется в биологических и физических науках, в том числе в электрических цепях.

Далее перейдём к реализации – объявим функцию запуска модели и подключим необходимые библиотеки.

 using Plots

 function run_model(name_model)
    Path = (@__DIR__) * "/" * name_model * ".engee"

    if name_model in [m.name for m in engee.get_all_models()] # Проверка условия загрузки модели в ядро
        model = engee.open( name_model ) # Открыть модель
        model_output = engee.run( model, verbose=true ); # Запустить модель
    else
        model = engee.load( Path, force=true ) # Загрузить модель
        model_output = engee.run( model, verbose=true ); # Запустить модель
        engee.close( name_model, force=true ); # Закрыть модель
    end

    return model_output
end
run_model (generic function with 1 method)

Запустим модель с несколькими вариантами значения Mu. Далее на рисунке можно увидеть модель, которую мы сделали на основе формулы, описанной выше.

image.png

Коэффициент затухания равен единице

Зададим Mu и запустим модель, после чего проанализируем залогированные данные.

Mu = 1;
run_model("vdp")
sleep(5)
collect(simout)
Building...
Progress 100%
2-element Vector{WorkspaceArray}:
 WorkspaceArray("vdp/Integrator.1")
 WorkspaceArray("vdp/Integrator-1.1")
# Скорость
v = simout["vdp/Integrator.1"];
v = collect(v);
plot(v.time, v.value)

# Положение
p = simout["vdp/Integrator-1.1"];
p = collect(p);
plot!(p.time, p.value)

interactive-scripts/images/base_simulation_vdp/9f68c4572f1cb09bbf737ab764972ca6d23a6fef

Как мы видим из результирующего графика, при Mu = 1 генератор VDP имеет нелинейное затухание.

Коэффициент затухания равен нулю

Зададим Mu и запустим модель, после чего проанализируем залогированные данные.

Mu = 0;
run_model("vdp")
sleep(5)
collect(simout)
Building...
Progress 100%
2-element Vector{WorkspaceArray}:
 WorkspaceArray("vdp/Integrator.1")
 WorkspaceArray("vdp/Integrator-1.1")
# Скорость
v = simout["vdp/Integrator.1"];
v = collect(v);
plot(v.time, v.value)

# Положение
p = simout["vdp/Integrator-1.1"];
p = collect(p);
plot!(p.time, p.value)

interactive-scripts/images/base_simulation_vdp/d41e1f0dd33773fe5201b667546983009a68ce45

Анализируя график, мы можем сделать вывод, что при Mu = 0 генератор VDP не имеет затухания, энергия сохраняется, и само дифференциальное уравнение приобретает следующий вид:

image.png

Вывод

В данном примере мы смоделировали дифференциальное уравнение Ван дер Поля второго порядка в Engee и посмотрели, как оно работает с различными значениями коэффициента затухания.

Блоки, использованные в примере