用R来举办布丰投针尝试
当前位置:以往代写 > 其他教程 >用R来举办布丰投针尝试
2019-06-14

用R来举办布丰投针尝试

用R来举办布丰投针尝试

在3月14日也就圆周率日那一天,果壳网推出一篇文章《圆周率日特献:π毕竟牛B在那边?》。个中就提到了布丰(Buffon)用投针尝试来计较π的近似值。不外这篇文章并没有具体说明如何用软件来做这个尝试,也看到网上有伴侣在问详细的进程。所以本文实验用R来实现这个尝试,算是狗尾续貂以作消遣。别的,Maxtrix67和魏太云都对这个问题有过出色的阐述,有乐趣的伴侣可以参考一下。

简朴来讲,投针尝试是指假设有两根平行的线,它们之间的间隔是1。随意投掷一根长度为0.5的针,那么投针便有时机与平行线相交。假如总的抛掷次数为N,产生相交的次数为X,那么可以用N/X来预计π的值。详细的故事和公式还可以参考这个文章。

为了在R中实现这个尝试进程,我们先绘制出一个空的图形,再加两根平行线。可以只思量针与一条线的相交环境,我们用一个while轮回来举办重复投针,其顶用随机数来模仿投针的坐标和角度,并绘制在图形中。假如发明相交则增加变量cross的计数,同时用cat函数显示尝试次数和预计值。下图是按照上述假设编写代码所绘制的图形。假如你本身在R语言中运行代码,可以按空格来重复投针,用y来竣事尝试,可以调查到当试验次数增加,预计值也随之靠近真值。


R代码如下:
rm(list=ls())

# 绘制空缺图形
plot(c(0,2),c(0,2),type=’n’,main=’布丰投针尝试’,xlab=’X’,ylab=’Y’)
# 增加平行线
abline(h=0.5)
abline(h=1.5,col=’red’)
finished <- FALSE
# trial为尝试次数,cross为交错次数
trial <- 0
cross <- 0
while (!finished) {
# Dist为针的中心间隔红线的垂直间隔
# Theta为针的角度
Dist <- runif(1,min=0,max=1/2)
Theta <- runif(1,0,pi)
# central.x为针中心点的横坐标
# central.y为针中心点的纵坐标
central.x <- runif(1,0.5,1.5)
central.y <- Dist +1
# 计较针两头的坐标
y1 <- sin(Theta)/4 + central.y
x1 <- cos(Theta)/4 + central.x
y2 <- sin(Theta+pi)/4 + central.y
x2 <- cos(Theta+pi)/4 + central.x
trial <- trial +1
# 计数交错次数
cross <- cross + ifelse(0.25*sin(Theta)>=Dist,1,0)
# 绘制针的线型和中心点
lines(c(x1,x2),c(y1,y2),lty=2)
points(central.x,central.y,pch=16,col=’grey’)
cat(‘trial=’,trial,’cross=’,cross,’PI=’,trial/cross,’\n’)
#continue?
input <- readline(‘stop?’)
# 若输入y,则竣事尝试
if (input ==’y’) finished <- TRUE

    关键字:

在线提交作业