前回は Python を使ってビュッフォンの針の実験を仮想的に行いましたが、今回は針を投げる回数を増やすにつれて円周率がどのように変遷していくかをグラフから観察します。

ビュッフォンの針 Python グラフ matplotlib

2019年4月13日:公開

今回のテーマ

前回は Python を使ってビュッフォンの針の実験を仮想的に行いましたが、今回は針を投げる回数を増やすにつれて円周率がどのように変遷していくかをグラフから観察します。

図:針を投げる回数を増やしたときの円周率の変遷
図:針を投げる回数を増やしたときの円周率の変遷

最終的に Python を使って上のようなグラフを描画することが目標です。青いグラフは針を投げる回数が(1 回から 5000 回まで)増えるにつれて実験から得られた経験的な円周率の値がどのように変化していくかを表しています。一方、赤い直線のグラフは真の円周率を表しています。針を投げる回数が増えるにつれて実験から得られる円周率が真の円周率へ近づいていく様子をグラフから観察できます。

 

グラフの描写に必要なライブラリをインストールする

Python を使ってグラフを描画する際によく使われるのは matplotlib ライブラリです。このライブラリをインストールする際にはコマンドプロンプトにおいて以下のコマンドを実行してください。

注意点として、上のコマンドはコマンドプロンプトにおいて Python を起動する前の段階で実行してください。Python のインタラクティブモードに入った後で上のコマンドを実行してもライブラリはインストールできません。

 

グラフを描画する方法

ライブラリのインストールが終わったら早速 Python のコードを書いていきますが、まずはグラフを描写するために必要な matplotlib.pyplot パッケージを以下の要領でインポートしておきます。

先ほど見たように、今回描画するグラフは横軸に針を投げる回数、縦軸に実験から得られた円周率の値をとったものですが、このような種類のグラフを描く際には pyplot.plot 関数を利用します。

具体的には、横軸のデータに相当するリストを x で、縦軸のデータに相当するリストを y でそれぞれ表すとき、\begin{equation*}
\text{pyplot.plot(x, y)}
\end{equation*}と入力するとグラフを作成します。さらに作成したグラフを画面上に描画する際には、\begin{equation*}
\text{pyplot.show()}
\end{equation*}と入力します。以下が簡単な具体例です。

上のコードを実行すると以下のグラフが出力されるはずです。

図:平面上の直線グラフ
図:平面上の直線グラフ

今回はベンチマークとして真の円周率を表すグラフも合わせて描画しますが、一般に、定数関数 \(y=c\ \)のグラフを作成する際には pyplot.axhline 関数を使って、\begin{equation*}
\text{pyplot.axhline(c)}
\end{equation*}と入力します。以下が簡単な具体例です。

上のコードを実行すると以下のグラフが出力されるはずです。

図:定数関数のグラフ
図:定数関数のグラフ

複数のグラフを同時にプロットする方法は、それらのグラフを順番に作成するだけです。例として、上で例として作成した 2 つのグラフを同時にプロットしてみましょう。ちなみに、以下のように color オプションを利用すればグラフに色を付けることもできます。

上のコードを実行すると以下のグラフが出力されるはずです。

図:2つのグラフを同時に描画する
図:2つのグラフを同時に描画する

 

ビュッフォンの針を実行して実験結果を取得する

前回はビュッフォンの針を実行する関数を定義しましたが、それを利用して先の pyplot.plot 関数に入力する 2 つのリストを作成します。

前回の記事を読む

グラフの横軸に入る「針を投げる回数」を表すリストを result_x と名付け、グラフの縦軸に入る「実験から求められた円周率」を表すリストを result_y と名付けます。また、ビュッフォンの針を実行する関数は前回と同様に buffon(n,L,d) です。関数に入力する n は針を投げる回数、L は針の長さ、d は床に描く線どうしの間隔です。Ld 以下でなければなりません。

関数 buffon が実験結果に相当する 2 つのリスト result_xresult_y を返すようにしたものが以下です。

関数 buffon の仕組みは前回説明した通りです。今回は特に新しいモジュールやメソッドを使っていないので改めて解説はしません。詳細は前回の記事を参照してください。

前回の記事を読む

 

実験結果をグラフとして描く

得られた実験結果から以下のようにしてグラフを描きます。

ここでは新たに pyplot.ylim 関数を利用していますが、これはグラフを描画する範囲(縦軸)を指定する関数です。実験結果である円周率のデータは \(3\) 付近に集中することが予測されるため、上の例では縦軸の描画範囲として\(3\)以上\(3.5\)以下と指定しています。

ちなみに、横軸の描画範囲を指定する際には pyplot.xlim 関数を利用します。使い方は pyplot.ylim と同様です。

最後に全体のコードを以下に掲載します。実行すると冒頭に掲載したようなグラフが出力されるはずです。

図:針を投げる回数を増やしたときの円周率の変遷
図:針を投げる回数を増やしたときの円周率の変遷