碰撞次数与π的关系问题程序求解

29 篇文章 0 订阅
15 篇文章 1 订阅

碰撞次数与π的关系?

最近看到一个有意思的问题,如下图所示的两个理想状态下的滑块完全弹性碰撞,

M的初速度为u0

m的初速度为0

k 为 M和m的质量比,

k= 1, 碰撞次数为3 (M,m碰撞,m和墙碰撞,m,M碰撞)

k= 100, 碰撞次数为31

k= 10000, 碰撞次数为314

 

相关介绍及求解视频

如何从碰撞过程求圆周率π?一个奇妙的物理、代数、几何结合问题_哔哩哔哩_bilibili

腾讯内容开放平台

这个问题很对牛顿老先生的胃口,对我来说是很头疼。

碰撞的数值解为[π *√k ]

如同斐波拉契数列有通项公式,但我们还经常程序来计算某一项值一样,这里我们也来尝试使用程序来求解碰撞的次数。

由于有碰撞时的动量守恒和能量守恒,通过解二元二次方程,我们可以求得碰撞后的速度,

如果碰撞后,小球和大球都向右,且小球的速度小于(等于)大球的速度,这个时候就不会再有碰撞了,小球追不上了。

每一次,我们都可以通过数值求解来计算2个小球的速度,进而来判断是否可以继续碰撞。

这对编程来说,不是太难,只是有些繁琐,有的编程语言还提供了很方便的库方法。

递推

这里竟然有比较递推关系可以挖掘出来,程序员对递推是精神抖擞的。

我们假设向右的方向为正方向,大球M的初始速度为u0,小球的初始速度v0=0,

一次碰撞后,其速度分别为u1,v1,小球向左和墙碰撞后,速度反向,变为-v1,

这时,需要计算接下来的速度v2,u2,

mv2 + Mu2 = -mv1 + Mu1            动量守恒  1

mv1^2 + Mu1^2 = mv2^2 + Mu2^2     能量守恒  2

1式变换

 m(v2 +v1) = M(u1-u2)                3

2式变换

mv1^2 - mv2^2 = Mu2^2 - Mu1^2

  •  m(v1+v2)(v1-v2) = M(u1+u2)(u1-u2)    4

4式 除以 3式,得

V1-v2 = u1 – u2 

假设M = k*m

再结合1式,求得

u2 = (k-1)*u1 / (k+1) - 2*v1 / (k+1)

v2 = 2*k*u1 / (k+1) + (k-1)*v1 / (k+1)

每次2球的碰撞速度存在递推关系。

这样的递推公式的初始状态值是v1和u1,我们再把v0和u0带入1,2式,

V1 + ku1 = ku0

V1^2 + ku1^2 = ku0^2

得到

v1 = k * (u0-u1)

u1 = (k-1)*u0 / (k+1)

这样,就可以根据递推写程序了,u0赋值为一个负数就可以,表示向左。

程序

int getHitCounts(int k) 
{
	int cnt = 0;
	float v0 = 0;
	float u0 = -1000;

	float u1 = (k-1)*u0 / (k+1);
	float v1 = k * (u0-u1);
	//first hit
	cnt++;

	float v2, u2;
	while (1)
	{
		//the small ball hits the wall, than v1 becomes -v1
		//only when the direction towards left, it can hit the wall
		if (v1 < 0) 
		{
			cnt++;
		}

		//the two ball both toward right 
		//but the speed of small one less than the big one
		//they can not hit any more, so break the loop
		if (u1 > 0 && -v1 <= u1)
		{
			break;
		}
		//the two ball hit
		cnt++;
		u2 = (k-1)*u1 / (k+1) - 2*v1 / (k+1);
		v2 = 2*k*u1 / (k+1) + (k-1)*v1 / (k+1);

		v1 = v2;
		u1 = u2;
	}

	return cnt;
}

扩展

从解公式π *√k 可以看出,在十进制里有这样的现象,在其他进制里也是这样,

getHitCounts(7 * 7) 的结果是22

22的7进制值为31

参考资料:

一个与圆周率π有关的碰撞计数谜题 - 知乎

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值