円内部のランダムな3点がつくる三角形面積の期待値【Expected area of random triangle in a circle
はじめに
前に自作した「円周上のランダムな3点がつくる三角形面積の期待値」が無事に解けたので、1次元とくれば次は2次元、ということで、タイトルの「円内部の~」に取り組んでみることにした──というのが2023年のおはなし。1年半経った今も、ネットで調べても日本語/英語ともに満足な回答が出てこないので、思い切って成果を記事にしてみることにした。タイトルに英語をくっつけているのは、運が良ければお困りの海外ニキにも届くかも?と思ってのこと。解くにあたって助けてくれた見知らぬ海外ニキ(Henry)、ありがとう!
さて、ここからはお気持ち数学(Feeling math)領域を展開する。お気持ち数学(造語)とは、「ああ、確かにそれならそうなりそうだ」という感覚を重視し、数学的厳密性に対しては「こまけぇこたぁいいんだよ!!」を決め込んで行う数学のこと。工学系が得意とする。私はお気持ち数学記事しか書けかない。
悩んだ経緯と正しい答え
■もし自力で解けそうであれば、ここで立ち止まって一度解いてみてほしい。
自分がはじめに出した答えはこれ↓だった(円の半径を
はじめに出した答え(これは間違っている)
(同じ答えになってしまった人はおそらく同じポイントで嵌まっている)
私は、得られた答えが合っているか確かめようと思い、みんな大好きモンテカルロ法でランダム三角形の面積の平均を出してみることにした。
Pythonのコードと実行例を置いておく(円の半径は1としている)。
Pythonのコードと実行例
モンテカルロ法で平均値を求めるコード
import numpy as np
rand_gen = np.random.default_rng()
print("How many triangles do you generate to calculate average of area?:")
num = int(input())
area_triangle = []
for i in range(num):
points = []
for point in range(3):
while True:
x = rand_gen.uniform(-1.0, 1.0)
y = rand_gen.uniform(-1.0, 1.0)
if x**2 + y**2 <= 1.0:
points.append([x, y])
break
v1 = [points[1][0] - points[0][0], points[1][1] - points[0][1]]
v2 = [points[2][0] - points[0][0], points[2][1] - points[0][1]]
#
area_triangle.append((1/2)*np.abs(v1[0]*v2[1] - v1[1]*v2[0]))
print("average of area: " + str(np.mean(area_triangle)))
実行例
How many triangles do you generate to calculate average of area?:
10000000
average of area:0.2321864169770789
自分が出した答えとわずかにズレている……! 初めはモンテカルロ法の精度を疑ったが、平均する数を増やしてみて、さすがに10,000,000個の平均が2%もズレるわけがない!ということで見直してみたところ、自分の考え方ではわずかに負の面積を勘定に入れてしまうということが分かった。円周上の3点の場合と違って、3点
で、正しい答えはこちら
正しい答え
これを今から求めていく。
証明・解説
はじめに、ここで紹介する解き方の全体的な流れを説明する。
- 円(半径:
)の内部からランダムに選ばれた3点のうち、最も円の外側に位置するものをR とし、円の中心からの距離をp_0 とする。q - 半径
、微小幅q の円環領域内に最遠点dq が来る確率p_0 をdP を使って表す。dq - 半径
の円の内部に作られる任意の図形(円と同じスケールで拡大縮小されるものとする)の面積をq とする。kq^2 は図形によって変わる比例定数で、例えば半径k の円そのものならq 。(実際には、図形は「円の内部」でなくてもよい)k=\pi
- 半径
- 半径
の円周上に1点が固定されたので、「半径q の円内部から3点を選ぶ」問題が「半径 q$ の円内部から2点を選ぶ」問題に帰着される。「半径R の円周上から1点、内部から2点をランダムに選んで作られる、三角形の面積の期待値q 」を式で表す。E[S_q]\ (=E[kq^2]) - 「2点ランダム下での三角形の面積の期待値
」、「その状況になる確率E[kq^2] 」が決まったので、その積をdP で積分することで、「円周上のランダムな3点がつくる三角形の面積の期待値」が求まる。0\le q<R
図で書くとこんな感じ。
思ったより分かりやすくならなかったな……
ここからは実際に式を立ててこねていく。
-
半径
、微小幅q の円環領域内に最遠点dq が来る確率p_0 :dP
円全体の面積 において、\pi R^2 が微小幅円環の面積p_0 から選ばれ、かつ残りの2点は半径2\pi q\times dq の内側面積q から選ばれ、さらに3点のうちどの点も最遠点になりえるので、この確率はこう書ける。\pi q^2
-
半径
の円周上から1点、内部から2点をランダムに選んで作られる、三角形の面積の期待値q :E[kq^2]
これには少し工夫が必要。平面上で常に3点が反時計回り(または時計回り)に並んでいないと、式から絶対値が外せず大変なことになる(この工夫のためにわざわざ最遠点を円の端に固定した)。
そのため、まず( は円周上のどこにあっても結果は同じになるので)p_0 のある場所を新たに原点とすることを考える。このとき円を、原点を通り、第1象限と第2象限にまたがるように設定する。すると、円の範囲はp_0 と表すことができる。D_{\mathrm{circle}}(q):\ \{0\le r<2q\sin \phi,\ 0\le \phi <\pi \}
※以下の図を参照
固定されていない2点を
※
- そして最後に、
とE[kq^2] の積をdP で積分して得られる、円周上のランダムな3点がつくる三角形の面積の期待値0\le q<R :E[S]
さいごに
普通に気が狂う! こんなん自分一人で思いつけるわけない!!
あ、もっと🌹elegant✨️な解き方あるよ~って人はぜひ教えてください(私に理解できるか分かりませんが)。
てかはじめてZennで書いてみたけど使い心地最高じゃんね
技術寄りだから数学記事の扱いがどうなのか知らないけど
ルビ振りと中央寄せが実装されたらさらに良い
Discussion