Simulink学习——弹球仿真(一)

Simulink经典案例-弹球仿真


Hi,我是一块大肥皂,请各位大佬多指教~


问题概述

问题分析

球体初始高度为10m

初速度为15m/s,初始速度向上

地面为刚性的,小球为弹性的

当高度为0时,会发生一次碰撞,动量会发生改变

每次与地面碰撞时,小球会失去一部分动量,导致小球最终会停下来

通过如下公式,可以通过公式描述出小球的运动特性:

验证下公式 

首先尝试通过这样一个模型先描述小球首次上抛和下降时的位置和速度变化

没问题,描述出了小球首次上抛和下降在弹回前的位置变化。

如何表现反弹?

首先,当位置变为0时,小球发生碰撞,动量方向发生改变指向反方向。同时,小球在反弹过程中会损失部分动量。由于假设小球碰撞前后质量不变,因此可以认为小球碰撞后的速度 abs(Vaftpeng = abs(k*Vbefpeng),0<k<1。

初步想法:在模型中可以体现为,当检测到位置为0时,重置速度为k*Vbefpeng。

第一次实现:

当小球位置≤0时:

进行一次触底计数累加,累加次数大于0时,速度积分器的输入值由初始速度切换为新速度。

将上一个时刻的小球速度*-0.8得到反弹后的速度,重置速度模块的积分器,重新开始对速度进行计算。

新的速度积分输入到位置积分器,位置积分器持续描述小球的位置变化情况。

虽然好像成功仿真了小球的反弹,但是系统有些太复杂了。。。

参考一下Matlab的示例:

明显简洁了很多 

对比我第一次建立的模型,其处理触底反弹的方式则简单了很多。

触底时:

重置速度积分器,重新输入初始值为重置时速度值的-0.8倍。

重置位置积分器,位置重新从0开始计数。

对比起来,主要是由于对积分模块initialvalue port和state port的运用不够熟练,导致在初始值和重置积分器的方法上复杂很多。

另外值得注意的是,两个仿真中的位置仿真结果也稍有不同,这个问题我们下期再继续进行探讨学习。

猜你喜欢

转载自blog.csdn.net/weixin_44281768/article/details/108458161