碰撞次数与π的关系?

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

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. 【干货书】Python金融分析,714页pdf掌握数据驱动金融
  2. 解决jquey中当事件嵌套时,内层事件会执行多次的问题
  3. OpenGL实现3D立体显示
  4. 机器学习 数据模型_使用PyCaret将机器学习模型运送到数据—第二部分
  5. leetcode 275. H 指数 II
  6. bat函数调用 带返回值
  7. 二叉树的遍历-C++
  8. 将数组A中的内容和数组B中的内容进行交换,计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,1到 100 的所有整数中出现多少次数字9。
  9. 如何实现Windows Network所有会话的限制登录和访问控制
  10. 注册机偷懒写法1、之直接扣代码
  11. 中奖人js滚动效果_jQuery教程 如何实现中奖人员信息向上滚动
  12. 9元包一年 阿里宝与腾讯王卡10G/月全国流量
  13. Ubuntu Kylin如何关闭自动锁屏
  14. NICE的Verilog代码
  15. Vue的模板语法及案例
  16. 爬虫漫游指南:HTTP/2 网站爬取
  17. mysql单精度双精度相加_单精度与双精度
  18. 弦振动 matlab,弦振动规律和MATLAB数据处理.doc
  19. 读了两年“游戏学院”才知被忽悠
  20. 人工神经网络持续学习的脑激励重放

热门文章

  1. Radis还年轻,代替MySQL还言之过早
  2. 魔兽顶级装备如何打造各个职业最强装备包括宝石和全身附魔
  3. 安卓开发:WebView下载文件
  4. 《单片机》实验——实验2 MCS-51外部中断控制实验
  5. 期货术语-关于升、贴水,点价,洗船
  6. word文档中实现目录索引中标题加粗,前导符和页码不加粗
  7. 怎么批量将多个 PDF 转换为 jpeg、png、bmp 图片
  8. Linux安装phpstudy
  9. linux下word转pdf
  10. Python和C语言运行速度对比(累加1亿次)