Engee 文档
Notebook

人体数学模型

在本例中,我们将考虑两种物体模型。第一个模型是摆,第二个模型是弹簧上的物体。我们将分析这些物体的行为。

数学摆

让我们分析一下在Engee开发环境中使用积分计算描述振荡系统的过程。图中显示了一个振荡系统的模型:

engee_maiatnik_4.png

该模型包括几个基本概念:

1.质量为 m 的物质点。 2.一根长度为l的无重力不可拉伸的线。 3. 重力g的均质场。

在这种情况下,重力动量的计算公式$M$ 等于质量$m$ 的负数,乘以$g$ 和$l$ 以及摆的偏转角的正弦。

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

让我们继续实施。第一步是声明系统参数。

In [ ]:
Pkg.add(["CSV"])
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是一种三阶三步法,是二阶 Ralston 方法的初始化

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是一种三阶三步法,是二阶 Ralston 方法的初始化

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通过建立物体的数学模型来模拟物体行为的能力。 通过本例,您可以根据物体的参数来演示物体的行为,并将其应用到更复杂的算法和系统中。