S8G7 布丰投针估计圆周率 Pi

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