読者です 読者をやめる 読者になる 読者になる

廿TT

譬如水怙牛過窓櫺 頭角四蹄都過了 因甚麼尾巴過不得

超球の体積をモンテカルロシミュレーションで求める

R

モンテカルロ法の例題として、円周率πの値の近似はよく見る。

正方形の領域に一様に点を打ち、内接する円の中に入った点の個数を全部の点の個数で割ってやると、正方形の面積と円の面積の比が出てくる。正方形の面積と円の面積の比に正方形の面積を掛けてやると、円の面積が出てくる。

f:id:abrahamcow:20151017012441p:plain

#Rのコード
set.seed(1234)
n <- 1e+04
x <-runif(n,-1,1)
y <-runif(n,-1,1)
D <-x^2+y^2 < 1
library(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 次元の超球の体積は実は、

\displaystyle V_p(r) = \frac{\pi^{p/2}}{\Gamma(\frac{p}{2} + 1)}r^p

超球の体積 - Wikipedia

この方法で超球の体積を求めてやると、だんだん近似がうまくいかなくなって14次元からは体積が0になってしまう。

f:id:abrahamcow:20151017012614p:plain

点線がモンテカルロシミュレーションによる近似値。

Vp2 <- numeric(20)
pi2 <- numeric(20)
for(p in 1: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")

高次元になると超球と超立方体とのすきまがどんどん大きくなって、乱数が超球に命中しなくなるのだ。

高次元はむずかしいですね、というお話。