Осциллятор Ван дер Поля
В этом примере мы покажем, как в Engee создать модель динамики, работающую согласно уравнению Ван дер Поля второго порядка.
Введение
Осциллятор Ван дер Поля демонстрирует динамику не консервативной системы с нелинейным характером затухания.
Эту систему можно описать следующим уравнением:
где – координата (например, положение осциллятора), – коэффициент демпфирования. При помощи такой модели исследуют самые разные процессы в биологии и в физике, в том числе в радиотехнике и электронике.
Мы будем моделировать эту систему с помощью блоков на холсте для графического моделирования в Engee. В файле van_der_pol_oscillator.engee
содержится модель следующего вида:
В ней два отдельных интегратора, которые отвечают за вычисление сигналов x1
(координата) и x2
(скорость).
Запуск модели с μ = 1
Если запустить эту модель с аргументом , то мы увидим автоколебательный режим работы с нелинейным затуханием. Загрузим модель:
if "van_der_pol_oscillator" in [m.name for m in engee.get_all_models()]
m = engee.open( "van_der_pol_oscillator" );
else
m = engee.load( "/user/start/examples/edu/van_der_pol_oscillator/van_der_pol_oscillator.engee" );
end
"Model(van_der_pol_oscillator)"
Запустим модель в исходном варианте и построим график:
data = engee.run( m );
using Plots
plot( data["x1"].value, data["x2"].value )
Мы можем выбирать разные исходные точки, меняя исходное значение каждого интегратора, но система всегда придет к предельному циклу.
График можно построить и для каждого сигнала в отдельности.
plot( data["x1"].time, data["x1"].value, label="x1" )
plot!( data["x2"].time, data["x2"].value, label="x2" )
Запуск модели с μ = 0
В этом режиме уравнение системы сокращается до уравнения обычного гармонического осциллятора:
Установим коэффициент в ноль и запустим модель.
engee.set_param!( "van_der_pol_oscillator/Mu", "Gain"=>0 )
data = engee.run( m );
data = engee.run( m );
using Plots
plot( data["x1"].value, data["x2"].value )
Построим еще один график для этой системы:
plot( data["x1"].time, data["x1"].value, label="x1" )
plot!( data["x2"].time, data["x2"].value, label="x2" )