弹跳球模拟
此示例演示如何在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]:
让我们继续这个演示的理论部分。 下图显示了演示背后的基本原理。 条件:球从10m的高度以15m/s的速度投掷。
弹跳球模型是混合动力系统的典型例子。 混合动力系统是包括连续动力学以及离散转换的系统,其中系统动力学可以改变并且状态值可以转换。
弹跳球的连续动力学以简单的方式描述如下:
哪里: 加速度是由于重力, -球的位置和 -速度。 因此,系统具有两个连续状态:位置 和速度 .
混合模型系统的方面来自于模拟球与地面的碰撞。 如果假设与地面发生部分弹性冲击,那么碰撞前的速度为 和碰撞后的速度 可能与球的回收率有关 如下:
因此,弹跳球在过渡条件下显示连续状态(速度)的跳跃 .
让我们继续启动模型并分析数据。 模型本身如下图所示。
In [ ]:
h_start = 10; # Высота
v_start = 15; # Скорость
run_model("bouncing_ball")
sleep(5)
collect(simout)
Out[0]:
我们将基于聚合数据构建图表,并且为了视觉上的方便,我们将构建一个零Y轴的图表。
In [ ]:
# Скорость
v = simout["bouncing_ball/V"];
v = collect(v);
plot(v.time, v.value, label="Скорость")
# Положение
p = simout["bouncing_ball/P"];
p = collect(p);
plot!(p.time, p.value, label="Положение")
plot!(p.time, zeros(size(p.time)))
Out[0]:
结论
在这个例子中,我们建立了一个弹跳球的模拟,并且还考虑了从Engee脚本与模拟环境交互的可能性。
弹跳球是显示禅宗现象的最简单的模型之一。 对于某些混合系统,禅宗行为的非正式特征是在有限的时间内发生无限多的事件。 当球在弹跳球模型中失去能量时,在相继较短的时间间隔内开始发生与地面的大量碰撞。 因此,模型体验禅宗行为。 禅宗行为模型不容易在计算机上模拟,但它们是必要的,因为它们在许多常见和重要的工程应用中被发现。