2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

円同士で囲まれるアーモンド型領域の面積とモンテカルロ法

2
Posted at

はじめに

以下のような円同士で囲まれるアーモンド型領域の面積を求める問題は、小学校や中学校の数学入試問題で頻出である。解き方としては、各扇形から三角形の面積を減算する。
この問題は、思考力を必要とするため力試し的な問題として有名である。

一方で、乱数を利用したシミュレーション方法にモンテカルロ法という手法がある。
とくに、ある区間内の領域の面積の近似値を算出しなければならない場合に役立つ。

そこで、今回は、モンテカルロ法を用いて、アーモンド型領域の面積の近似値を求める。
具体的には、アーモンド型領域周辺に点を打っていき領域内に含まれる点の数からアーモンド型領域の面積の近似値を算出することを目指す。

アーモンド形領域へのモンテカルロ法による面積近似.png

アーモンド形領域へのモンテカルロ法による面積近似の推移.png

問題設定

$0\le x\le 1$であるとする。このとき、以下の黒で囲まれた領域すなわち、


y_{-}\le y\le y_{+}

の面積を求めよ。

ただし、

y_{+}=1-\sqrt{1-x^2},y_{-}=\sqrt{1-(x-1)^2}

とする。

アーモンド形領域へのモンテカルロ法による面積近似.png

答えとしては、(三角形の面積ー扇形の面積)×2で、

S=\frac{\pi}{2}-1

となる。

モンテカルロ法

モンテカルロ法は、このような代数的に解くことが難しい(?)面積問題、積分問題の近似値を求める際に役立つ。

今回は、$0\le x,y\le 1$の正方形領域の中、ランダムに1000個の点を打ちアーモンド領域内部に打たれた赤い点の数を使って面積を推定する。

プログラム

以下のようなプログラムを作成した。

python almond_S_MCM.py
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
import math
import random

n=100
x_ary=np.linspace(0,1,n)
#アーモンド領域の定義
def almond(x):
    y_p=(1-(x-1)**2)**0.5
    y_m=1-(1-x**2)**0.5
    return y_p, y_m
#モンテカルロ法の試行回数(点の数)
seed_num=1000

num_almond=0
num_not_almond=0

S_MCM_ary=[]
#モンテカルロ法による面積近似
for i in range(seed_num):

    xx= random.random()
    yy= random.random()
    y_p, y_m = almond(xx)
    if y_m<yy<y_p:
        plt.scatter(xx, yy, color="red")
        num_almond += 1
    else:
        plt.scatter(xx, yy, color="blue")
        num_not_almond += 1
    S_MCM_ary.append(num_almond/(num_almond+num_not_almond))

#アーモンド領域の境界線の描画
y_p_ary, y_m_ary = almond(x_ary)
plt.plot(x_ary, y_p_ary, color="black")
plt.plot(x_ary, y_m_ary, color="black")

plt.xlabel("x")
plt.ylabel("y")
plt.gca().set_aspect('equal', adjustable='box')
plt.savefig("アーモンド形領域へのモンテカルロ法による面積近似.png")
plt.show()

m_ary=np.linspace(0,seed_num,seed_num)
plt.plot(m_ary, S_MCM_ary,label="面積の近似値")
plt.axhline(y=0.5*math.pi-1, color='r', linestyle='--', label="真の面積")
plt.legend()
plt.xlabel("試行回数")
plt.ylabel("面積の近似値")
plt.savefig("アーモンド形領域へのモンテカルロ法による面積近似の推移.png")
plt.show()

結果

結果は、以下のようになった。

イメージ図

領域内の点を赤、領域外の点を青として点を打っていった。
アーモンド形領域へのモンテカルロ法による面積近似.png

推定面積の推移

最初は真の面積から離れた値だったが、試行回数を増やすにつれて、近い値に収束した。ただし、計算機は疑似的な乱数しか生成できないので、精度はあまり向上しなかった。

アーモンド形領域へのモンテカルロ法による面積近似の推移.png

まとめ

モンテカルロ法は、解析的に解けないような複雑な積分問題や面積を求める問題を扱わなければならない際に役立つ。しかし、一般的には大量の乱数を使用するため計算量が多くなってしまう。また、精度は生成乱数の質にも依存するため、求められた値は近似値でしかないことに注意しな変えればならない。

ただ、それさえ受け入れることができれば、様々な形状の領域に応用することができる自由度の高い手法だといえる。

今回は、中学数学で扱うような領域の面積を興味本位で推定してみた。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?