AnyMath 文档
Notebook

体的弹性碰撞

在这个例子中,我们将计算两个物体在撞击时的运动。 该模型考虑了质量和速度,以及弹性,刚度和它们在冲击时增加的模型。

系统描述

该模型由两个块组成,用于模拟具有质量的点体,能够沿着一维轨迹移动。 在这个实验中,轨迹将被认为是直线的。

"传入停止"块负责碰撞,其下限设置为"减去无穷大"(-Inf),从而从侧面 R 没有任何东西限制连接对象在该块中的移动,并且如果对象远离止动器移动,则没有任何东西会阻止它。 在迎面而来的交通中,物体将同步能量传输到停止,停止将其传输到第二个物体。

image.png

上限的位置设置*移动物体在与静止物体碰撞之前必须行进的距离。

为了可视化运动,我们使用"绝对运动传感器",其中一个设置为质量的初始位置等于-1m。

启动计算

让我们在程序控制模式下运行模型:

In [ ]:
engee.open( "$(@__DIR__)/" * "mass_collision_model.engee");
data = engee.run( "mass_collision_model" );

根据获得的数据,我们可以构建图表:

In [ ]:
mass1_P = collect(data["Движение массы 1.p_out"]);
mass1_V = collect(data["Движение массы 1.v_out"]);
mass2_P = collect(data["Движение массы 2.p_out"]);
mass2_V = collect(data["Движение массы 2.v_out"]);
gr()
plot( mass2_P.value, mass2_P.value, c=:red, lw=3, xlabel="尸体的位置,m", ylabel="尸体的位置,m", label="重量2", marker=(:o,8))
plot!( mass1_P.value, mass1_P.value, lw=3, xlabel="尸体的位置,m", ylabel="尸体的位置,m", label="重量1", marker=(:o),
    mc = [(v > 0) ? :blue : :lightblue for v in mass1_V.value],
    ms = [(v > 0) ? 4 : 3 for v in mass1_V.value])
plot!(guidefont=font(8), legend=:bottomright, title="身体姿势", titlefont=font(11))
Out[0]:
No description has been provided for this image

红色标记显示碰撞前第一个身体的运动。

碰撞后,第二个身体开始移动(蓝色标记),第一个改变了移动方向(碰撞相当有弹性,第二个身体是第一个的两倍)。

In [ ]:
plot(mass1_V.time, mass1_V.value, lw=3, xlabel="尸体的位置,m", ylabel="尸体的位置,m", label="重量1", marker=(:o,5))
plot!(mass2_V.time, mass2_V.value, lw=3, xlabel="尸体的位置,m", ylabel="尸体的位置,m", label="重量2", marker=(:o,4))
plot!(guidefont=font(8), legend=:bottomright, title="身体的运动速度", titlefont=font(11))
Out[0]:
No description has been provided for this image

如果改变碰撞参数,则可以得到不同的运动模式。

In [ ]:
# 让我们减少冲击的弹性
engee.set_param!("mass_collision_model/Соударение", "k_upper_bound"=>Dict("value" => 1e2, "unit" => "N/m"))
data = engee.run( "mass_collision_model" );

# 让我们返回弹性参数的旧值
engee.set_param!("mass_collision_model/Соударение", "k_upper_bound"=>Dict("value" => 1e6, "unit" => "N/m"))

mass1_P = collect(data["Движение массы 1.p_out"]);
mass1_V = collect(data["Движение массы 1.v_out"]);
mass2_P = collect(data["Движение массы 2.p_out"]);
mass2_V = collect(data["Движение массы 2.v_out"]);

plot( mass2_P.value, mass2_P.value, lw=3, xlabel="尸体的位置,m", ylabel="尸体的位置,m", label="重量2", marker=(:o,8))
plot!( mass1_P.value, mass1_P.value, lw=3, xlabel="尸体的位置,m", ylabel="尸体的位置,m", label="重量1", marker=(:o,4))
plot!(guidefont=font(8), legend=:bottomright, title="身体姿势", titlefont=font(11))
Out[0]:
No description has been provided for this image

随着冲击弹性的这个参数,第一个身体继续向同一方向移动,但获得了轻微的滞后。

结论

在一维公式中,可以模拟相当复杂的机械系统,包括空间中物体的自由运动,同时考虑到碰撞,同时为数学模型的每个元素选择最合适的参数。