🐱

FileMakerでモンテカルロ法を用いた円周率

2021/12/05に公開約5,600字

はじめに

ニッチな刺さり方しかしないようなネタで恐縮ですが、今回はFileMakerでモンテカルロ法を用いて円周率πを求める方法を記載したいと思います。

ぶっちゃけ、FileMakerでやる必然性はほぼゼロです。そもそもPi関数も既にありますしね。長くFileMakerでの開発に携わっていますが、実務で今まで円周率πの算出を要求されたことは一度もありません。また、残りの人生でもないと断言できます。じゃあなぜやるの?と言うと、それはレガシーなネイティブグラフ機能に一筋の光を当てたくなった、それだけです。

レガシーなネイティブグラフ機能に一筋の光を当てたくなった
大事なので2回。
Clarisさん、聞いてます?あなたに言っていr

とまぁ、ややふざけましたが、実際に求める方法は結構真面目にやってます。


本題

円周率πは、まずどなたもご存じかと思います。3.1415926535...でしたっけね?私の脳デバイスではここまでの桁数がリミットですが、一般的に3.14で習ったと思います。

でも、そもそもなぜ3.14なのよ?ってとこです。

そりゃ円の直径を測ってその長さの紐とかを円の周囲にこう当てていって、1,2...3とちょっとあるから3.14くらいなんでしょ?っていうのでは、sadness Pie。あまりにも悲しい円周率です。それはそれで間違ってはいないんですが、せっかく偉大な先人達が試行錯誤で求めようとしてきましたので、その知恵を利用したい。


モンテカルロ法とは

ただ名前の響きの良さだけで今回採用してみたモンテカルロ法。それは、

ファルシのルシがコクーンでパージですね。ですので簡潔に言えば恐らく、

乱数を大量発生させて計算し、確率から数値的近似解を求める

ということだと推測します。誰か教えてエライ人。


手順その1

乱数を大量発生、これが一つのキーです。なぜそこから円周率が求められるのかは追々説明するとして、まずはグラフ機能を設定します。「え?wグラフ機能ってどこよ?w」って方の為に図解で説明します。テーブルを適当に用意して、

適当な正方形のカタチに
次にグラフ設定ですが、

グラフタイプを散布図にし系列を2つ設定
系列を2つ設定しますが、それぞれ変数名や記号を変える点に注意して下さい。

さらに軸オプション

X軸、Y軸とありますが、図のように共に同じ設定にします。あんまり細かい設定が出来ないのが昔からFileMaker特有の詰めの甘さ。ガッデム。

データソースは区切りデータに。

オブジェクト名はglaphと設定しておきます。

一先ず、ここまで設定できたらブラウズモードに戻します。

こんな風に見立てています。
軸のオプション設定で、最小値「0」最大値「1」にしていますので、一辺が「1」の正方形ですね。やや縦長に見えます?気のせいです。テストで紙面に印刷されている図形は必ずしも縮尺が正しいとは限らない法則。


手順その2

今回はフィールドとか要りません。スクリプトが命、全て。
一旦、次のようなスクリプトを作成します。

特段難しいことはしていませんが、ポイントを解説しますと、

  • 10,11行目:$x,$yに、それぞれ0以上1未満の小数点以下2桁のランダム値を設定
  • 13,14行目:それらを改行区切りデータとして、$$inX,$$inYに設定

となります。
それをLoopで100回繰り返すのですが、実際にこのスクリプトを実行すると、

0以上1未満の値を100回ランダムにプロットするようにしているので、こんな感じのエモぃ散布図が得られます。このスクリプトを何度も実行して暇つぶししてもいいんですが、目的は円周率を求めることですから、何度か遊んだら次に進みましょう。


ちょっと考えてみる

このランダムプロットした図を、こういう風に見るとどうでしょう。

青で囲んだ一辺が1の正方形の中に半径1の円の1/4を当てはめてみました。そうすると、この赤で囲んだ1/4の円の中に納まっているプロットと、収まっていないプロットがあることが分かると思います。

先程はLoopが100回でしたが、1,000回でやってみます。つまり1,000プロット。

ぶっちゃけキモぃ。エモさを通り越してキモぃ。鳥肌が立った人、So sorry.
でもここでエライ人は考えました。どんどんプロット数を増やしていくと、

  • 1/4の円の中にプロットされる確率は、正方形の面積に対する1/4の円の面積の割合

に近似されていくのではないか、と。
確かにそう言われればそんな感じはしますかねぇ...正方形の面積1/4の円の面積は、それぞれのプロット数で比較できそうなのかなぁ、と。


え?ホントに?っていうね

実際に数えて手計算してみたいので、Loopを10回に減らして見てみます、つまり10プロット。

10プロットの内、1/4の円の中には6つプロットされていますね。

では、まず確立を計算。

  • 1/4の円の中にプロットされる確率
\frac{\frac{1}{4}の円の中のプロット数}{全プロット数} = \frac{6}{10} = 0.6

次に、それぞれの面積を計算し割合を算出

  • 1/4の円の面積
π×r^2×\frac{1}{4}=3.14×1^2×\frac{1}{4}=0.785
  • 正方形の面積
1×1=1
  • 正方形の面積に対する1/4の円の面積の割合
\frac{\frac{1}{4}の円の面積}{正方形の面積}=\frac{0.785}{1}=0.785

確立は0.6でしたが...面積割合の0.785に近いっちゃ近いけども遠いと言えば遠い。ただまぁ、今は10プロットでの計算ですので、プロット数が増えれば近似されていきそうなのは何となくは分かりますよ、エライ人。


ともかくつまり、円周率πはこう導ける

前述のエライ人の考えで言えば、十分なプロット数があれば、

  • 1/4の円の中にプロットされる確率は、正方形の面積に対する1/4の円の面積の割合

に近似されるハズ。なのでつまり、

\frac{\frac{1}{4}の円の中のプロット数}{全プロット数}=\frac{\frac{1}{4}の円の面積}{正方形の面積}=\frac{π×1^2×\frac{1}{4}}{1×1}=\frac{1}{4}π

ということなので、

\frac{\frac{1}{4}の円の中のプロット数}{全プロット数}=\frac{1}{4}π

左右入れ替えたりして、結果、

π=\frac{\frac{1}{4}の円の中のプロット数}{全プロット数}×4

おぉ、スゲー!
1/4の円の中のプロット数さえ分かれば円周率πが出せるのね、エライ人やるじゃん。
ところでエライ人って誰だ。


1/4の円の中のプロット数をどうカウントするか

全プロット数が10程度ならさっきみたいに手計算でいけますが、1,000プロットとかなるとキモ過ぎな図になりますし、それを目視でカウントとかただの罰ゲーム。日が暮れます。

もう一度、100回プロットした際の図を見てみます。

問題は、1/4の円の中のプロット数をどうカウントするか、ですよね。
そもそも、1/4の円の中に収まる為のx,yの条件は何か。

ここで三平方の定理を考えてみます。覚えていますか?遥かキヲクの彼方に追いやられているかもしれませんが、こういうのです。

こういった、例えばそれぞれの長さがz,x,yといった辺の直角三角形があった場合に、

z^{2} = x^{2} + y^{2}

が成り立つというアレですアレ。「あー何か見たことあるなー」っていうアレです。
これを先ほどの、1/4の円の中に収まっているプロットと収まっていないプロットを頂点とした直角三角形で見てみます。

こうすると、斜辺に当たるZの長さが、円の半径の長さである1以下であれば、収まることが分かります。三平方の定理に当てはめて言えばZが1以下に収まる条件はつまり、

1^2 ≧ x^{2} + y^{2}

これが成り立つx,yが円に収まるということになります。
ぅ...頭が...と言う人も、もう少しで終わります、後はスクリプトを組むだけです。


そして伝説へ・・・

では、これまでの条件を元に最終的なスクリプトです。

100回Loopしてプロットするスクリプトから若干変更しているだけです。ポイントとしては、

  • 16~26行目:先程の1/4の円に収まる条件のx,yと収まらないx,yを分けて変数に格納
  • 35行目:収まった数から円周率πを算出

という点です。

このスクリプトを実行すると、やや時間がかかりますが、

キモ過ぎる...いゃそうではなくて、円周率πが3.1452!
近似できてると思うかどうかはアナタ次第...


おわりに

以上、いかがだったでしょうか。
ぶっちゃけ、グラフ機能を使わなくても円周率πは算出できることが分かると思いますが、

レガシーなネイティブグラフ機能に一筋の光を当てたくなった

っていう理由だけで、グラフ機能を無理やり使いました。視覚的にも分かりますしね。
ちなみに、あんまりLoop回数を増やし過ぎるとハングアップするので注意です。もしくは、スクリプトを最適化して下さい。

それでは
Let's enjoy FileMaker!

Discussion

ログインするとコメントできます