碰撞次数与π的关系?

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

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 hitcnt++;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 wallif (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 loopif (u1 > 0 && -v1 <= u1){break;}//the two ball hitcnt++;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. 夫妻过河 c语言程序,求解夫妻过河问题.doc

    求解夫妻过河问题83275933 本科生毕业论文 论文题目: matlab求解夫妻过河问题 摘要 渡河问题.始于公元8 世纪,至今它仍是一个逻辑难题,许多数学建模教材上已经提到.这个问题指的是:有不同 ...

  2. java 输入 方程,用java 编写一程序,求解一元二次方程:aX2+bX+c=0.参数a、b及c从命令行做参数输入 java...

    题目: 用java 编写一程序,求解一元二次方程:aX2+bX+c=0.参数a.b及c从命令行做参数输入 java 答案参考: 以下程序在jdk5.0测试通过 import java.util.Sca ...

  3. LeetCode 2211. 统计道路上的碰撞次数

    文章目录 1. 题目 2. 解题 1. 题目 在一条无限长的公路上有 n 辆汽车正在行驶.汽车按从左到右的顺序按从 0 到 n - 1 编号,每辆车都在一个 独特的 位置. 给你一个下标从 0 开始的 ...

  4. 编写lisp程序解一元二次方程_用C语言编写一程序求解一元二次方程的根。

    展开全部 C语言编写一程序求解32313133353236313431303231363533e78988e69d8331333365643661一元二次方程的根: #include #include ...

  5. 详细解释:Epoch、batch_size批处理大小、迭代次数之间的关系

    Epoch.batch_size批处理大小.迭代次数之间的关系 问题:当遇到参数Epoch时,我们应该将其具体设置多少呢?或者应该迭代多少次呢? 举例说明 问题:当遇到参数Epoch时,我们应该将其具 ...

  6. 车桥耦合(公路梁桥,斜拉桥,悬索桥等),方法有基于MATLAB-ANSYS建模程序求解

    1.车桥耦合(公路梁桥,斜拉桥,悬索桥等),方法有基于MATLAB-ANSYS建模程序求解 基于ANSYS全过程车桥耦合命令流建模求解. 程序通用性很强,换个桥梁参数和车辆参数即可实现. 2.梁桥,斜 ...

  7. 编程序求解方程实数根

    上机内容:C程序的编写和运行 上机目的:掌握简单C程序的编辑.编译.连接和运行的一般过程 我的程序: #include<stdio.h> #include<math.h>flo ...

  8. 编写一个表达学生和课程关系的程序,定义两个类Student和Course.在Student类中有一个Course的数组,表示学生所选的课程

    编写一个表达学生和课程关系的程序, 定义两个类Student和Course.在Student类中有一个Course的数组,表示学生所选的课程;在Course类里有一个Student数组,表示选了该课程 ...

  9. c语言编程木块碰撞次数,C语言实用程序设计100例

    第一篇 基础与提高 实例1 利用库函数编写基本显示程序 3 实例2 变量属性 5 实例3 运算符与类型 7 实例4 关于程序结构 9 实例5 显示函数曲线图 12 实例6 二分法迭代的应用 15 实例 ...

  10. scala语言的底层是java实现的_Scala学习笔记一(与Java、Jvm的关系以及程序执行流程分析)...

    一.Scala语言与Java.Jvm的关系分析 Scala语言是马丁奥德斯基接触Java语言后,针对Java语言的特点,将函数式编程语言的特点融合到Java中,由此发明的.Scala语言和Java语言 ...

最新文章

  1. return false
  2. 多目标遗传优化算法nsga2求解复杂约束问题【python源码实现,二进制编码】
  3. 攻击 | 神奇的木马(虚拟机模拟木马入侵)
  4. 三目运算符的空指针问题
  5. 源码编译wget问题解决
  6. hive2mysql的udf_hive中的UDF函数
  7. jsp+ssh+mysql Java web学生考勤管理系统源码附视频指导运行教程
  8. android 圆形自定义进度条,Android实现自定义圆形进度条
  9. 最大子段和问题(3种方法)
  10. 困扰我两天的问题(nginx配置好ssl证书,https却不能访问)
  11. Java语法糖以及实现
  12. Cannot allocate memory
  13. 河南省申请测绘资质保密人员要求
  14. cl.ez6.xyz index.php,[BJDCTF2020]EzPHP-POP链
  15. 2019版云计算大数据学习路线图(含大纲+视频+工具+书籍+面试)
  16. 输入一行字符(输入以字符#结束),分别统计其中字母和数字字符的个数。
  17. DCM+BUFG的使用
  18. HTML给整个框架插入背景图片
  19. 计算可由time_t数据类型表示的最近时间。如果超出了这一时间将会如何?
  20. HTML5权威指南观后笔记

热门文章

  1. 强大的Windows 10数字权利获取工具HWIDGEN
  2. 计算机中英汉字段如何切换,电脑上中英文切换按哪个键
  3. 小象学院 零基础Python入门 案例四 52周存钱挑战v_4.0
  4. 可视化滤波器fvtool
  5. phpstudy开机自启
  6. python编程一球从100米_Python求解一个球从100米高度自由落下的问题
  7. matlab中或者的表达,MATLAB
  8. Issue during builing Android app with ant under Win7
  9. 2000元台式电脑组装配置单2021 2000元组装电脑配置清单
  10. pythonlambda多行_Python中通过lambda抛异常的奇迹淫巧