モンテカルロ積分[python]
27/09/2022 15/10/2023
pythonでモンテカルロ積分をしてみたいと思います。
まずは基本的なところで、円の面積を計算してみたいと思います。
モンテカルロ積分は、Pythonのライブラリで関数として定義されていないため、
今回は自分で書いていきます。
モンテカルロ積分は、今回の範囲を円と仮定すると、
ランダム関数の適用範囲と、足しこんでいく範囲(加算範囲)に分けられます。
以下、概念図です。


■ソースコード
import math as mt
import matplotlib.pyplot as plt
import random
import scipy.integrate as si
import numpy as np
list_X = [0]
list_Y = [0]
list_XO = [1]
list_YO = [1]
S = 0
SS = 0
Nmax = 1000000
for i in range(Nmax):
px = random.uniform(0,1)
py = random.uniform(0,1)
if np.abs(mt.sqrt(px**2+py**2))<=1:
S = S + 1
list_X.append(px)
list_Y.append(py)
else:
list_XO.append(px)
list_YO.append(py)
#円の1/4の範囲で計算したため、円の面積を出すときは4倍した値を返します。
print(4*S/Nmax)
plt.scatter(list_X,list_Y,color = "b")
plt.scatter(list_XO,list_YO,color = "r")
plt.show()

100万回まわしてみると、3.1415・・・という円周率に近づいていくのが確認できます。
当たり判定も見ていきます。

簡単なモンテカルロ積分を試してみました。
random関数も、範囲を決めて使用できるため、使い勝手が良いと感じました。
また、今回は、matplotlibも使用し、pyplotを使ってみました。
従来だと、CSVやdatファイルに書き出してからgnuplotに食わせていたため、
可視化までの時間がかかっていましたが、ソースコード上から直接グラフを描くことができるので、
手軽さがあっていいと思っています。
by さくらえび
関連記事: