欢迎光临散文网 会员登陆 & 注册

S8G7 布丰投针估计圆周率 Pi

2021-02-28 21:54 作者:学用数学  | 我要投稿


布丰投针

 3/14 是国际数学日,又称 Pi Day 。上次我们用 GGB 的随机内点来估计 Pi,这次来模拟这个很神奇的 Pi 的估算法:布丰投针。

在 n 条距离 1 的 平行线,随机丢入一个 长度为 1 的针 n 次。然后统计与平行线有相交的次数有 m 次,当 n 很大时, 2*n/m 的值会趋近于圆周率 3.1415926... 。 

要完成这个模拟,推荐先去完成 S6G2 。

链接:https://www.bilibili.com/video/BV1Mz411v7Hg


任务一 布置随机内点

产生随机内点

说明:在这节主要使用 Geogebra 的「随机内点」功能产生在正方形 Box 内的随机 N 个点。正方形的大小设定为 s。

操作:

s = 4

N = 500

Box = Polygon((-s,-s),(s,-s),4 ) 

Lines = Sequence( Line((-s,k), (s,k)),k,-s,s)

# Lines=序列(直线((-s,k),(s,k)),k,-s,s)

rOS = Sequence( RandomPointIn( Box ),k,1,N)

# rOS=序列(随机内点(Box),k,1,N)

任务二 设定针的角度

设定针的角度

说明:要完成随机落下的针,除了中心点外,还要设定随机的角度。在此利用 [RandomUniform(均匀分布随机数)] 来达成。有了角度,可再利用  [Zip(映射)] ,来建立线段。

而为了让点有依次出现的效果,再设定个滑动条 n ,并使用 First 来取得数列前  n 个点。

操作:

rAs= Sequence(RandomUniform(0,π),k,1,N)

# rAs=序列(均匀分布随机数(0,π),k,1,N)

rSs = Zip( Segment(o+(0.5;a),o-(0.5;a)), o, rOS,a,rAs  )

# rSs=映射(线段(o+(0.5; a),o-(0.5; a)),o,rOS,a,rAs)

n = 100

nSs = First(rSs,n)

任务三 判断相交的情况

判断相交情况

说明:产生随机落下的针后,就要开始判断针与平行线是否相交。在这利用 [ KeepIf (条件子列) ] ,判断的方法是,判断线段的两端点的 y 坐标的整数值是否相等,利用 floor 无条件舍去来完成。

而线段的两端点,利用 Corner(S,1), Corner(S,2) 来取得,其中 S 为序列 nSs 内的线段。 若相等则表示不相交,若上端点的y的整数值大于下端点则表示相交。

最后再利用 m 来计算符合这些条件的线段数量,接着再利用文本来显示 pi 的估计。

操作:

nPs=KeepIf(floor(y(Corner(S,1)))>floor(y(Corner(S,2))),S,nSs)

# nPs=条件子列(floor(y(顶点(S,1)))>floor(y(顶点(S,2))),S,nSs)

m = Length(nPs)


小结与链接

这节利用 Geogebra 的随机功能与条件子列,就可完成这类模拟估计。至于布丰投针为何可估算 Pi 可参考以下视频的解说。

链接:https://www.bilibili.com/video/BV19E41157QZ


【GGB】https://www.geogebra.org/classic/s2hmxcex

【Bili】https://www.bilibili.com/video/BV1b54y1h7FN?p=2&spm_id_from=pageDriver

【youtube】https://www.youtube.com/watch?v=RjujfzUQXPk

S8G7 布丰投针估计圆周率 Pi的评论 (共 条)

分享到微博请遵守国家法律