モンテカルロ法の例題として、円周率πの値の近似はよく見る。
正方形の領域に一様に点を打ち、内接する円の中に入った点の個数を全部の点の個数で割ってやると、正方形の面積と円の面積の比が出てくる。正方形の面積と円の面積の比に正方形の面積を掛けてやると、円の面積が出てくる。
#Rのコード set.seed(1234) n <-1e+04 x <-runif(n,-1,1) y <-runif(n,-1,1) D <-x^2+y^2<1library(ggplot2) ggplot(data.frame(x,y,D))+ geom_point(aes(x,y,colour=D),size=2)+ theme_bw(20)+ theme(legend.position="none")
>4*(sum(D)/n)[1]3.1876#3.14にするためにはもっと試行回数が必要
同じやり口が高次元でも使えるはずである。
3次元の球の体積が知りたかったら立方体に点を打ち、接する球の中に入った点の個数を全部の個数で割って、立方体の体積を掛けてやればいい。
4次元の超球の体積が知りたかったら4次元の超立方体に点を打ち、接する4次元の超球の中に入った点の個数を全部の個数で割って、4次元の超立方体の体積を掛けてやればいい。
ちなみに p 次元の超球の体積は実は、
この方法で超球の体積を求めてやると、だんだん近似がうまくいかなくなって14次元からは体積が0になってしまう。
点線がモンテカルロシミュレーションによる近似値。
Vp2 <-numeric(20) pi2 <-numeric(20)for(p in1:15){ x <- sapply(1:p,function(x)runif(n,-1,1)) D <- apply(x,1,function(x)sum(x^2))<1 Vp2[p]<-(2^p)*(sum(D)/n)} Vp <-function(p){(pi^(p/2))/gamma(p/2+1)} p<-1:20 plot(p,Vp(p),ylim=c(0,5.5),type="b",lwd=2) points(p,Vp2,pch=4,cex=1.5,lty=3,lwd=1.5,type="b")
高次元になると超球と超立方体とのすきまがどんどん大きくなって、乱数が超球に命中しなくなるのだ。
高次元はむずかしいですね、というお話。