Engee 文档
Notebook

弹跳球模拟

本例展示了如何在Engee中模拟弹跳球。

首先,让我们声明一个运行模型的函数,以及处理模型数据时需要的库。

In [ ]:
 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
Out[0]:
run_model (generic function with 2 methods)

接下来,让我们进入本演示的理论部分。下图显示了演示背后的基本原理。条件:从 10 米高处以 15 米/秒的速度抛出一个球。

image.png

弹跳球模型是混合动力系统的一个典型例子。混合动力系统是一个包含连续动力和离散转换的系统,系统动力可以改变,状态值也可以转换。

弹跳球的连续动力学简单描述如下:

image.png

image_2.png

其中:$g$ 重力加速度,$x(t)$ 球的位置,$v(t)$ 球的速度。因此,系统有两个连续状态:位置$x$ 和速度$v$ 。

模型的混合系统方面来自于球与地面碰撞的建模。如果假定与地面发生部分弹性碰撞,碰撞前的速度$v^-$ 和碰撞后的速度$v^+$ 与球的恢复系数$\kappa$ 的关系如下:

image_3.png

因此,给定过渡$x=0$ ,弹起的球在连续状态(速度)下显示出跳跃。

下面我们来运行模型并分析数据。模型本身如下图所示。

image.png

In [ ]:
h_start = 10; # Высота
v_start = 15; # Скорость
run_model("bouncing_ball")
sleep(5)
collect(simout)
Building...
Progress 100%
Out[0]:
2-element Vector{WorkspaceArray}:
 WorkspaceArray("bouncing_ball/P")
 WorkspaceArray("bouncing_ball/V")
In [ ]:
h_start = 10; # Высота
v_start = 15; # Скорость
run_model("bouncing_ball")
sleep(5)
collect(simout)

我们根据记录的数据绘制图表,为便于直观,我们将图表的 Y 轴设为零。

In [ ]:
# Скорость
v = simout["bouncing_ball/V"];
v = collect(v);
plot(v.time, v.value)

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

plot!(p.time, zeros(size(p.time)))
Out[0]:

结论

在这个示例中,我们建立了一个弹跳球的模拟模型,并研究了通过 Engee 脚本与建模环境进行交互的可能性。 弹跳球是显示芝诺现象的最简单模型之一。对于某些混合系统,芝诺现象的非正式特征是在有限的时间间隔内发生无限多的事件。当弹跳球模型中的球失去能量时,大量与地面的碰撞开始在连续较小的时间间隔内发生。因此,该模型出现了芝诺行为。在计算机上模拟具有芝诺行为的模型并不容易,但却很有必要,因为在许多常见和重要的工程应用中都能发现它们。