www.youtube.com
【中学生でもわかる!】円周率の求め方⇒モンテカルロ法を用いてPythonプログラミ
www.youtube.com
■■文字おこし解説■■
円周率の例で説明していくね。
まず、円周率は円の直径に対する円周の長さの比率のことなんだ。
そして、円の面積は 円周率×半径の2乗 だったよね。
公式で1表すと円の面積をS 半径をr 円周率をπとした場合
S=πr2乗だね。
だから、半径を1とした場合 π×1×1=πとなり。
円周率と円の面積とがイコールとなるんだ。
円の中心をX軸 Y軸共に0とした場合
円の上の部分は Xは0 Yは1 円の右側は Xは1 Yは0となる。
右斜め上はXは1 Yも1 となる。
その4点を結ぶと、長さが1の正方形が描ける。
つぎに、その正方形の中にランダムに点を打っていく
とりあえず、20個ランダムに点を打つね。
その打った点について、円の内部に存在する点を数える。
今回は20このうち 15個が円の内側に入ったとする。
正方形の面積は1×1で1だよね。
その面積に対して、均等に点が打たれたとした場合、
円の面積は 20分の15で表される
つまり、正方形全体に対する、円の内部の点の割合を円の面積として考えるんだ。
今回は円全体に対する面積の4分の1の面積を求めたわけだから。
これを4倍すれば円全体の面積となる。
そして、はじめに話したように、半径1の円の面積が円周率と一致するから、
今回の場合は
20分の15 ×4 が円周率となる。
さっきのサイコロと同じように点の数を増やすほど、精度が上がり、皆が知っている3.1415の円周率に近づいていく。
ちなみに、点が円の内部にあるかどうかは置いた点のxとyの座標を確認して
xの2乗プラスyの2乗の値が1より小さければ、円の内側となる。
つまりxの2乗プラスyの2乗が1の場合は点が円周上に位置しているんだ。
import numpy.random as rd
import matplotlib.pyplot as plt
totalcount = 2000
incount = 0
for i in range(totalcount):
x = rd.random()
y = rd.random()
if x**2 + y**2 < 1.0:
incount += 1
plt.scatter(x, y, c="red")
else:
plt.scatter(x, y, c="blue")
print(" 円周率:", incount * 4.0 / totalcount)
plt.title("Monte Carlo method")
plt.show()
今話した内容をPythonプログラムで表すとこんな感じになる。
今回は点を2000個打っていこう。
円の中に入った点を赤と円の外だった点を青にして、円周率を求めるプログラムを組んでいこう。
numpy(ナムパイ)とmatplotlibの呼び出しはさっきと同じ
ランダムに打つ点の総数を2000としてtotalcount変数に代入する。
円に入った点の数は初期値0としてincountに代入する。
for文はtotalcount数だから2000回繰り返す
さっきのx2乗プラスyの2乗が1より小さい場合は
円の中に入ったってことだから、赤色で点をうつ、それ以外は青にする。
同時に、円の内側の点の数÷打った点の総数 ×4をしてさっき説明したように円周率も出力してみよう。
青と赤に分かれて円の4分の1が描かれて、同時に今回の半径1の場合の円の面積つまり円周率が算出できたね。
さっき話したように打つ点が多くなるほど精度が上がって3.1415・・のみんなの知っている円周率に近づいていく。
こんな感じでランダムな数を沢山与えて、事象を確率的に解析することをモンテカルロ法というんだ。
大学入学共通テストでは、このシミュレーションした結果を複数組み合わせて読み解く能力が求められるから、今後問題演習を通して、データ解析能力を鍛えていく予定だよ。
www.youtube.com