確率アルゴリズムは、確率的な手法を用いて問題を解くアルゴリズムです。その中でもモンテカルロ法は、特に数値計算や統計において広く利用されています。モンテカルロ法は、ランダムなサンプルを生成し、それを使って数値的な結果を近似する手法です。
モンテカルロ法の基本的なアイデアは、ランダムな試行を行い、その結果から全体の特性を推測することです。この手法は、特に次のような問題に役立ちます。
ここでは、モンテカルロ法を用いて円の面積を近似する例を示します。この例では、1辺の長さが2の正方形の中に円を描き、その円にランダムな点を打ちます。円の中に点が落ちる確率から円の面積を近似します。
円の面積は ( \pi r^2 ) であり、ここでは半径 ( r = 1 ) の円を考えます。したがって、円の面積は ( \pi ) です。
以下に、円の面積をモンテカルロ法で近似するPythonのコードを示します。
import random
import matplotlib.pyplot as plt
def monte_carlo_pi(num_samples):
inside_circle = 0
x_inside = []
y_inside = []
x_outside = []
y_outside = []
for _ in range(num_samples):
x = random.uniform(-1, 1)
y = random.uniform(-1, 1)
if x**2 + y**2 <= 1:
inside_circle += 1
x_inside.append(x)
y_inside.append(y)
else:
x_outside.append(x)
y_outside.append(y)
pi_estimate = (inside_circle / num_samples) * 4
return pi_estimate, x_inside, y_inside, x_outside, y_outside
# サンプル数を設定
num_samples = 10000
# モンテカルロ法により円の面積を近似
pi_estimate, x_inside, y_inside, x_outside, y_outside = monte_carlo_pi(num_samples)
# 結果の表示
print(f"Estimated value of Pi: {pi_estimate}")
# プロット
plt.figure(figsize=(8, 8))
plt.scatter(x_inside, y_inside, color='blue', s=1)
plt.scatter(x_outside, y_outside, color='red', s=1)
plt.title(f'Monte Carlo Simulation of Pi (Samples: {num_samples})')
plt.xlabel('X')
plt.ylabel('Y')
plt.xlim(-1, 1)
plt.ylim(-1, 1)
plt.gca().set_aspect('equal', adjustable='box')
plt.show()
random
: ランダムな数値を生成するために使用します。matplotlib.pyplot
: 結果を可視化するためのライブラリです。
関数の定義:
monte_carlo_pi(num_samples)
: モンテカルロ法を使って円の面積を近似する関数です。inside_circle
: 円の中に落ちた点の数をカウントします。x_inside
と y_inside
: 円の中に落ちた点の座標を格納するリストです。x_outside
と y_outside
: 円の外に落ちた点の座標を格納します。
ランダムな点の生成:
指定した数のサンプルを生成し、各点が円の中にあるかどうかを判定します。
円の面積の近似:
円の中に落ちた点の割合を用いて、円の面積を近似します。
結果の表示:
matplotlib
を使用して、円の中に落ちた点と外に落ちた点をプロットします。モンテカルロ法は、確率的手法を用いて数値的な問題を解く強力なツールです。この手法を使うことで、複雑な計算を簡略化し、近似的な解を得ることができます。上記の例を通じて、基本的なモンテカルロ法の実装を理解できたかと思います。この手法は、他の多くの分野にも応用可能ですので、ぜひ試してみてください。