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

Математические модели тел

Открыть пример в Engee

В данном примере мы рассмотрим две модели тел. В первом случае это будет маятник, а во втором – тело на пружине. Проанализируем поведение этих тел.

Математический маятник

Давайте разберём процесс описания колебательных систем при помощи интегральных расчётов в среде разработки Engee. На рисунке показана модель колебательной системы:

engee_maiatnik_4.png

Модель включает в себя несколько основных понятий:

  1. Материальная точка массы m.
  2. Невесомая нерастяжимая нить длиной l.
  3. Однородное поле сил тяготения g.

В таком случае формула для расчёта момента силы тяжести $M$ равна отрицательному значению массы $m$, умноженному на $g$ и $l$ и на синус угла отклонения маятника.

$$M = - mg l sin \theta$$

Перейдём к реализации. Первым этапом объявим параметры системы.

In [ ]:
m = 1;
g = 9.8;
l = 1;

theta_init = 40*(pi/180); # перевод начального значения градуса отклонения в радианы

mgl=(-m*g*l);
invI = 1/(m * l^2);

Теперь запустим систему интегральных уравнений, построенную в моделях Engee. На рисунке ниже представлена эта модель:

image.png

Примечание: при моделировании использовался решатель AB3.

AB3 – трехшаговый метод третьего порядка, инициализация методов Ралстона второго порядка.

In [ ]:
# Запуск модели
model = engee.load("/user/start/examples/base_simulation/mathematical_models_of_bodies/Math_pendulum.engee"; force = true);
engee.run(model, verbose=true);
engee.close(model, force=true);
Building...
Progress 0%
Progress 0%
Progress 5%
Progress 10%
Progress 15%
Progress 20%
Progress 25%
Progress 30%
Progress 35%
Progress 40%
Progress 45%
Progress 50%
Progress 55%
Progress 60%
Progress 65%
Progress 70%
Progress 75%
Progress 80%
Progress 85%
Progress 90%
Progress 95%
Progress 100%

Для обработки и визуализации результатов моделирования нам необходимо подключить несколько библиотек.

In [ ]:
using CSV
using DataFrames
using Plots
plotlyjs()
Out[0]:
Plots.PlotlyJSBackend()

Теперь мы можем считать данные, записанные в процессе моделирования. Данные в CSV-файле содержат два столбца:

  1. временные отметки моделирования;
  2. выходные данные, в данном случае значения градуса отклонения маятника.
In [ ]:
# Чтение CSV
Data = Matrix(CSV.read("/user/start/examples/base_simulation/mathematical_models_of_bodies/out.csv",DataFrame));
Data_time = Data[:,1];
Data = Data[:,2];

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

In [ ]:
# Построение графиков
plot(Data_time , Data, legend = false)
plot!(title = "Результаты моделирования в Engee", ylabel = "Данные", xlabel="Время, c")
Out[0]:

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

Математическая модель масса-пружина-демпфер

В данном примере мы продемонстрируем возможности расчёта поведения тела на пружине с целью демонстрации возможностей Engee в сфере решения интегральных уравнений. На рисунке ниже показан общий вид тела, для которого будут выполняться расчёты.

xxmass_spring_damper.png

Демпфер масс-пружины, изображенный на рисунке, моделируется дифференциальным уравнением второго порядка.

$$m \ddot x + c \dot x + kx = F$$

где $F$ – это сила, приложенная к массе, и $х$ – горизонтальное положение массы.

Перейдём к реализации. Сначала объявим параметры системы.

In [ ]:
m = 2;
c = 50;
k = 0.2;

invM = 1/m;

Теперь запустим систему интегральных уравнений, построенную в моделях Engee. На рисунке ниже представлена эта модель:

image_2.png

Примечание: при моделировании использовался решатель AB3.

AB3 – трехшаговый метод третьего порядка, инициализация методов Ралстона второго порядка.

In [ ]:
# Запуск модели
model = engee.load("/user/start/examples/base_simulation/mathematical_models_of_bodies/Body_on_spring.engee", force=true);
engee.run(model, verbose=true);
engee.close(model, force=true);
Building...
Progress 0%
Progress 0%
Progress 5%
Progress 10%
Progress 15%
Progress 20%
Progress 25%
Progress 30%
Progress 35%
Progress 40%
Progress 45%
Progress 50%
Progress 55%
Progress 60%
Progress 65%
Progress 70%
Progress 75%
Progress 80%
Progress 85%
Progress 90%
Progress 95%
Progress 100%

Для обработки и визуализации результатов моделирования нам необходимо подключить несколько библиотек.

In [ ]:
using CSV
using DataFrames
using Plots
plotlyjs()
Out[0]:
Plots.PlotlyJSBackend()

Теперь мы можем считать данные, записанные в процессе моделирования. Данные в CSV-файле содержат два столбца:

  1. временные отметки моделирования;
  2. выходные данные.
In [ ]:
# Чтение CSV
Data1 = Matrix(CSV.read("/user/start/examples/base_simulation/mathematical_models_of_bodies/out1.csv",DataFrame));
Data2 = Matrix(CSV.read("/user/start/examples/base_simulation/mathematical_models_of_bodies/out2.csv",DataFrame));

Data_time = Data1[:,1];
Data1 = Data1[:,2];
Data2 = Data2[:,2];

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

In [ ]:
# Построение графиков
plot(Data_time , Data1, legend = false)
plot!(Data_time , Data2, legend = false)
plot!(title = "Результаты моделирования в Engee", ylabel = "Данные", xlabel="Время, c")
Out[0]:

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

Вывод

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

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