はじめに
多次元球の体積の一般式を求めるのは難しい。理由としては、重積分やガンマ関数等を用いる必要性があるからだ。さらに、4次元以上ともなるとそもそも描写することすらできない。
そこで、今回は多次元球の体積をモンテカルロ法を用いて推定してみる。
具体的には、ある球に、外接する立方体内に点を打っていく。
そのとき、球内部の領域にある点の数を数えることで球の体積を推定する。
以下、3次元の時のイメージである。
問題設定
$-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次元の場合を扱う。
プログラム
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()
このプログラムを実行すると、以下のようになった。
結果
図示
赤い点が球の内部にあるもので、青い点が外部にある点である。
推移
試行回数を増やすにつれて、推定値が真の値に近づいていることがわかる。
ただし、疑似乱数の精度上ある程度で頭打ちになる。
多次元の場合
体積公式
$N$次元球の体積公式は以下のようになる。
V_{N}=\frac{\pi^{\frac{N}{2}}}{\Gamma(\frac{N}{2}+1)}
したがって、プログラムは以下のようになる。
プログラム
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次元
3次元
4次元
5次元
6次元
まとめ
今回は、重積分の話題であがりやすい、多次元球の体積について考察した。
具体的には、Pythonを用いたモンテカルロ法で多次元球の体積を推定した。
結果、かなり精度よく多次元球の体積の推定値を求めることができることが分かった。
参考文献







