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

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

В этом примере мы покажем, как в Engee создать модель динамики, работающую согласно уравнению Ван дер Поля второго порядка.

Введение

Осциллятор Ван дер Поля демонстрирует динамику не консервативной системы с нелинейным характером затухания.

Эту систему можно описать следующим уравнением:

$$\frac{d^2 x}{dt^2} - \mu \left( 1- x^2 \right) \frac{dx}{dt} + x = 0$$

где $x$ – координата (например, положение осциллятора), $\mu$ – коэффициент демпфирования. При помощи такой модели исследуют самые разные процессы в биологии и в физике, в том числе в радиотехнике и электронике.

Мы будем моделировать эту систему с помощью блоков на холсте для графического моделирования в Engee. В файле van_der_pol_oscillator.engee содержится модель следующего вида:

image.png

В ней два отдельных интегратора, которые отвечают за вычисление сигналов x1 (координата) и x2 (скорость).

Запуск модели с μ = 1

Если запустить эту модель с аргументом $\mu = 1$, то мы увидим автоколебательный режим работы с нелинейным затуханием. Загрузим модель:

In [ ]:
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
Out[0]:
"Model(van_der_pol_oscillator)"

Запустим модель в исходном варианте и построим график:

In [ ]:
data = engee.run( m );

using Plots
plot( data["x1"].value, data["x2"].value )
Out[0]:

Мы можем выбирать разные исходные точки, меняя исходное значение каждого интегратора, но система всегда придет к предельному циклу.

График можно построить и для каждого сигнала в отдельности.

In [ ]:
plot( data["x1"].time, data["x1"].value, label="x1" )
plot!( data["x2"].time, data["x2"].value, label="x2" )
Out[0]:

Запуск модели с μ = 0

В этом режиме уравнение системы сокращается до уравнения обычного гармонического осциллятора:

$$\frac{d^2 x}{dt^2} + x = 0$$

Установим коэффициент $\mu$ в ноль и запустим модель.

In [ ]:
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 )
Out[0]:

Построим еще один график для этой системы:

In [ ]:
plot( data["x1"].time, data["x1"].value, label="x1" )
plot!( data["x2"].time, data["x2"].value, label="x2" )
Out[0]:

Заключение

Мы убедились, что графическое моделирование в Engee – удобный способ, позволяющий экспериментировать с топологией системы, усложнять модель или использовать ее в составе сложной демонстрации.

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