碰撞次数与π的关系问题程序求解
碰撞次数与π的关系?
最近看到一个有意思的问题,如下图所示的两个理想状态下的滑块完全弹性碰撞,
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
参考资料:
一个与圆周率π有关的碰撞计数谜题 - 知乎
碰撞次数与π的关系问题程序求解相关推荐
- 夫妻过河 c语言程序,求解夫妻过河问题.doc
求解夫妻过河问题83275933 本科生毕业论文 论文题目: matlab求解夫妻过河问题 摘要 渡河问题.始于公元8 世纪,至今它仍是一个逻辑难题,许多数学建模教材上已经提到.这个问题指的是:有不同 ...
- 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 ...
- LeetCode 2211. 统计道路上的碰撞次数
文章目录 1. 题目 2. 解题 1. 题目 在一条无限长的公路上有 n 辆汽车正在行驶.汽车按从左到右的顺序按从 0 到 n - 1 编号,每辆车都在一个 独特的 位置. 给你一个下标从 0 开始的 ...
- 编写lisp程序解一元二次方程_用C语言编写一程序求解一元二次方程的根。
展开全部 C语言编写一程序求解32313133353236313431303231363533e78988e69d8331333365643661一元二次方程的根: #include #include ...
- 详细解释:Epoch、batch_size批处理大小、迭代次数之间的关系
Epoch.batch_size批处理大小.迭代次数之间的关系 问题:当遇到参数Epoch时,我们应该将其具体设置多少呢?或者应该迭代多少次呢? 举例说明 问题:当遇到参数Epoch时,我们应该将其具 ...
- 车桥耦合(公路梁桥,斜拉桥,悬索桥等),方法有基于MATLAB-ANSYS建模程序求解
1.车桥耦合(公路梁桥,斜拉桥,悬索桥等),方法有基于MATLAB-ANSYS建模程序求解 基于ANSYS全过程车桥耦合命令流建模求解. 程序通用性很强,换个桥梁参数和车辆参数即可实现. 2.梁桥,斜 ...
- 编程序求解方程实数根
上机内容:C程序的编写和运行 上机目的:掌握简单C程序的编辑.编译.连接和运行的一般过程 我的程序: #include<stdio.h> #include<math.h>flo ...
- 编写一个表达学生和课程关系的程序,定义两个类Student和Course.在Student类中有一个Course的数组,表示学生所选的课程
编写一个表达学生和课程关系的程序, 定义两个类Student和Course.在Student类中有一个Course的数组,表示学生所选的课程;在Course类里有一个Student数组,表示选了该课程 ...
- c语言编程木块碰撞次数,C语言实用程序设计100例
第一篇 基础与提高 实例1 利用库函数编写基本显示程序 3 实例2 变量属性 5 实例3 运算符与类型 7 实例4 关于程序结构 9 实例5 显示函数曲线图 12 实例6 二分法迭代的应用 15 实例 ...
- scala语言的底层是java实现的_Scala学习笔记一(与Java、Jvm的关系以及程序执行流程分析)...
一.Scala语言与Java.Jvm的关系分析 Scala语言是马丁奥德斯基接触Java语言后,针对Java语言的特点,将函数式编程语言的特点融合到Java中,由此发明的.Scala语言和Java语言 ...
最新文章
- 【干货书】Python金融分析,714页pdf掌握数据驱动金融
- 解决jquey中当事件嵌套时,内层事件会执行多次的问题
- OpenGL实现3D立体显示
- 机器学习 数据模型_使用PyCaret将机器学习模型运送到数据—第二部分
- leetcode 275. H 指数 II
- bat函数调用 带返回值
- 二叉树的遍历-C++
- 将数组A中的内容和数组B中的内容进行交换,计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,1到 100 的所有整数中出现多少次数字9。
- 如何实现Windows Network所有会话的限制登录和访问控制
- 注册机偷懒写法1、之直接扣代码
- 中奖人js滚动效果_jQuery教程 如何实现中奖人员信息向上滚动
- 9元包一年 阿里宝与腾讯王卡10G/月全国流量
- Ubuntu Kylin如何关闭自动锁屏
- NICE的Verilog代码
- Vue的模板语法及案例
- 爬虫漫游指南:HTTP/2 网站爬取
- mysql单精度双精度相加_单精度与双精度
- 弦振动 matlab,弦振动规律和MATLAB数据处理.doc
- 读了两年“游戏学院”才知被忽悠
- 人工神经网络持续学习的脑激励重放