2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

多次元球の体積とモンテカルロ法

2
Posted at

はじめに

多次元球の体積の一般式を求めるのは難しい。理由としては、重積分やガンマ関数等を用いる必要性があるからだ。さらに、4次元以上ともなるとそもそも描写することすらできない。
そこで、今回は多次元球の体積をモンテカルロ法を用いて推定してみる。

具体的には、ある球に、外接する立方体内に点を打っていく。
そのとき、球内部の領域にある点の数を数えることで球の体積を推定する。

以下、3次元の時のイメージである。

球体へのモンテカルロ法による体積近似.png

問題設定

$-R\le x_1,x_2\cdot \cdot \cdot x_{N-1},x_N\le R$とすると、$N$次元球の領域は以下のように与えられる。ただし$R$は半径とする。

x_1^2+x_2^2+\cdot\cdot\cdot+x_{N-1}^2+x_{N}^2\le R^2

つまり、


\sum_{k=1}^{N}{x_{k}^2}\le R^2

3次元の場合

例として、3次元の場合を扱う。

プログラム

python sphire_S_3d.py
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
import math
import random

# figureを生成
fig = plt.figure()
# axをfigureに設定
ax = fig.add_subplot(1, 1, 1, projection='3d')
 
n=1000
R=1


num_sphere=0
num_not_sphere=0

V_MCM_ary=[]

for i in range(n):

    xx= random.uniform(-R, R)
    yy= random.uniform(-R, R)
    zz= random.uniform(-R, R)
    if xx**2 + yy**2 + zz**2 <= R**2:   
        ax.scatter(xx, yy, zz, color="red")
        num_sphere += 1
    else:
        ax.scatter(xx, yy, zz, color="blue")
        num_not_sphere += 1
        
    V_MCM_ary.append((num_sphere/(num_sphere+num_not_sphere))*(2*R)**3)

plt.savefig("球体へのモンテカルロ法による体積近似.png")
plt.show()

plt.plot(range(n), V_MCM_ary,label="体積の近似値")
plt.axhline(y=(4/3)*math.pi*R**3, color='r', linestyle='--', label="真の体積")
plt.legend()
plt.xlabel("試行回数")
plt.ylabel("体積の近似値")
plt.savefig("球体へのモンテカルロ法による体積近似の推移.png")
plt.show()

このプログラムを実行すると、以下のようになった。

結果

図示

赤い点が球の内部にあるもので、青い点が外部にある点である。

球体へのモンテカルロ法による体積近似.png

推移

試行回数を増やすにつれて、推定値が真の値に近づいていることがわかる。

球体へのモンテカルロ法による体積近似の推移.png

ただし、疑似乱数の精度上ある程度で頭打ちになる。

多次元の場合

体積公式

$N$次元球の体積公式は以下のようになる。

V_{N}=\frac{\pi^{\frac{N}{2}}}{\Gamma(\frac{N}{2}+1)}

したがって、プログラムは以下のようになる。

プログラム

python sphere_S_Nd.py
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
import math
import random


#モンテカルロ法の試行回数(点の数)
n=1000
#球の半径
R=1
#次元数
N=6

xx_ary=np.zeros(N)

#モンテカルロ法による体積近似(num次元球体)
num_sphere=0
num_not_sphere=0

V_MCM_ary=[]

for i in range(n):
    
    for k in range(N):
        xx_ary[k]= random.uniform(-R, R)
    if np.sum(xx_ary**2) <= R**2:
        num_sphere += 1
    else:
        num_not_sphere += 1
    V_MCM_ary.append((num_sphere/(num_sphere+num_not_sphere))*(2*R)**N)

# num次元球体の真の体積の計算
V_n= (np.pi**(N/2))/(math.gamma(N/2 + 1)) * R**N

plt.plot(range(n), V_MCM_ary,label="体積の近似値")
plt.axhline(y=V_n, color='r', linestyle='--', label="真の体積")
plt.legend()
plt.xlabel("試行回数")
plt.ylabel("体積の近似値")
plt.title(f"{N}次元球体へのモンテカルロ法による体積近似")
plt.savefig(f"{N}次元球体へのモンテカルロ法による体積近似の推移.png")
plt.show()

結果

$N$を変えて、これを実行すると、以下のようになる。

2次元

2次元球体へのモンテカルロ法による体積近似の推移.png

3次元

3次元球体へのモンテカルロ法による体積近似の推移.png

4次元

4次元球体へのモンテカルロ法による体積近似の推移.png

5次元

5次元球体へのモンテカルロ法による体積近似の推移.png

6次元

6次元球体へのモンテカルロ法による体積近似の推移.png

まとめ

今回は、重積分の話題であがりやすい、多次元球の体積について考察した。
具体的には、Pythonを用いたモンテカルロ法で多次元球の体積を推定した。
結果、かなり精度よく多次元球の体積の推定値を求めることができることが分かった。

参考文献

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?