有多无聊:弹性碰撞与Python代码

有多无聊:弹性碰撞与Python代码

看到一个博主讲了一件很有意思的事情,大意是两个方块物体在水平方向上弹性碰撞后,其中一块再撞到墙壁反弹,最终会发现,在一定条件下发生弹性碰撞的次数会和PI这个常量极度相关。


(图源 :pixabay)

撞击次数与圆周率

为了说明这个问题,我大致画了个图(原谅我的绘图技能):

在上图中,有红色方块A(1)和绿色方块B(2),A以速度v1前进,B静止不动(速度v2=0),A撞击到B,B被撞后获取一定的速度vb,方块B撞击墙体(黄实线)后返回,又撞击A。

如果A、B质量相等,那么撞击会发生3次,如果A的质量大于B,撞击会发生很多次。

而这个博主总结的规律为:

如果A、B质量相等,撞击3次
如果A的质量是B的100倍,那么撞击31次
如果A的质量是B的10000倍,那么撞击314次
如果A的质量是B的1000000倍,那么撞击3141次
如果A的质量是B的100000000倍,那么撞击31415次

观察撞击次数就会发现,撞击的次数竟然符合圆周率(PI)的规律。

弹性碰撞

其实如果是真实地实验,很难重现上述规律,为何?因为方块和平面之间存在摩擦,方块在空气中也会有空气阻力,方块和方块撞击时可能会发生一定程度的形变等等。

所以只有在理想情况下,才可能重现上述规律。那么什么是理想情况呢?就是不存在摩擦、不存在空气阻力、方块撞击时无形变等等。

百度百科里关于弹性碰撞定义的更科学一些,直接搬来:

在理想情况下,物体碰撞后,形变能够恢复,不发热、发声,没有动能损失,这种碰撞称为弹性碰撞(elastic collision),又称完全弹性碰撞(Perfect Elastic Collision)。

弹性碰撞符合两大物理定律:动量守恒定律 以及能量守恒定律

而根据我们描述的情况,不难推导出,弹性碰撞后物体的速度:

因为我们目的不是推导公式,所以直接拿来用就好了。因为我们例子中碰撞是发生在直线上的核心碰撞,所以公式中的v,就是物体的初速度啦。

Python代码

说了这么多,我是要证明弹性碰撞和圆周率的关系吗?非也!我只是好奇碰撞真的符合这个规律吗?

之前说了,理想情况下,实验才能重现出响应的规律,但是实际上没法弄出理想的实验条件呀?不过没关系,可以用程序模拟啊!

为了计算碰撞次数,我们首先需要计算碰撞前后的速度(其实就是简单地套用公式):

1
2
3
4
def collision(m1, v1, m2, v2):
va = (v1*(m1 - m2) + 2*m2*v2)/(m1 + m2)
vb = (v2*(m2 - m1) + 2*m1*v1)/(m2 + m1)
return va, vb

接下来是计算碰撞次数,这可难住了我,如何计算碰撞次数呢?其实就是找出符合什么条件会退出碰撞

从方块图中,我们不难分析出,只有当方块A向左侧行走,且方块B追不上它时,碰撞才会结束,假设向右运动为正,那么亦即符合如下条件:

v1 < 0 and v2<=0 and abs(v1) >= abs(v2)

还有就是方块和墙壁撞击,墙壁的质量,那么代入速度公式中,不难算出:

`v2 = -1v2`*

根据上述分析我写出如下代码来计算次数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def func_times(m1, v1, m2, v2):
times = 0
while(True):
if(v1 < 0 and v2<=0 and abs(v1) >= abs(v2)):
break
v1, v2 = collision(m1, v1, m2, v2)
times = times +1

if(v1 < 0 and v2<=0 and abs(v1) >= abs(v2)):
break

v2 = -1*v2
times = times +1

return times

见证奇迹

好了,现在是见证奇迹的时刻的时刻啦。

1
2
3
4
5
6
7
8
m1 = 100
m2 = 100
v1 = 100
v2 = 0
for i in range(0, 7):
m1 = 100*100**i
times = func_times(m1, v1, m2, v2)
print(f"M1:{m1}, M2:{m2}, v1:{v1}, v2:{v2}, Times:{times}")

给木块设定质量和初速度,然后模拟碰撞,看看是不是符合这个博主说的规律?

运行上述程序,输出如下:

哇哇哇,果然是圆周率啊,是不是很神奇?


(图源 :pixabay)

至于为何是圆周率,就留给聪明的你去证明啦!

相关链接


Vote For Me As Witness
https://steemit.com/~witnesses type in oflyhigh and click VOTE

Vote @oflyhigh via Steemconnect
Thank you!

This page is synchronized from the post: ‘有多无聊:弹性碰撞与Python代码’

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×