乱数(モンテカルロ法)を使って球の体積を求めてみよう(pythonを使う)

モンテカルロ法で体積を求める未分類

球の体積について

半径rの球の体積は、4πr3/3 ですね。導出は、また回を改めてやってみましょう。半径1とすると、4π/3 になります。

半径1の球の式は

x2+y2=1

でした。球は立体なので、x、y、z軸が必要になり、

x2+y2+z2=1

になります。乱数を使って体積を求める場合は、

一辺が2の立方体と、それに内接する球(半径1)を考えます。

一辺が2の立方体の中に乱数をn個プロットする。

プロットした点を(a,b,c)としよう。a2+b2+c2<1が成立したプロット数をカウントする。z個としよう。

立方体の体積:球の体積=n:z

なので、

(球の体積)×z =(立方体の体積)×n

が近似的に成り立ちます。これから

(球の体積)=(立方体の体積)×n / z

として求めることができます。

pythonで計算してみよう

さっそくpythonで計算させてみましょう。

import random

total=10000
en=0

for i in range(0,total,1):
    a=random.uniform(-1,1)
    b=random.uniform(-1,1)
    c=random.uniform(-1,1)
    if a*a+b*b+c*c<1:
        en=en+1

en_taiseki=8.0*en/total
print(str(en_menseki))

【プログラムを見てみよう】

a=random.uniform(-1,1)

で、[-1,1]の範囲の乱数を発生させます。これをa,b,cと3っつ発生させて、それぞれx、y、zの値とします。

if a*a+b*b+c*c<1:

        en=en+1

で球体内部にプロットされた数をカウントします。

最後に

en_taiseki=8.0*en/total

で体積を計算します。1辺が2の立方体の体積は8であることに注意しておきます。

結果は、

4.2016

となりました。理論値は

4π/3=4.18

ですので、近い値がでました。もっと近い値を出したいときは、totalの値を増やして、プロット数を増やします。

ちょっと微分に寄り道

球の体積と表面積には、

体積の微分=表面積

という関係があります。ちょっと微分を思いだしながら計算してみましょう。

球の体積をV(r)とおきます。(Vはrの関数という意味。rは球の半径です)

V(r)=4πr3/3

です.

V(r)の微分は、

( V(r+h)-V(r) ) / h

を計算して、hを0に近づければよかったです。

まず、V(r+h)-V(r) を計算してみましょう。

V(r+h)-V(r)=4π(r+h)3/3 – 4πr3/3

=(4π/3)×((r+h)3 -r3)

=(4π/3)×(r3+3r2h+3rh2+h3 -r3)

=(4π/3)×(3r2h+3rh2+h3)

なので、全体をhで割って、

( V(r+h)-V(r) ) / h = (4π/3)×(3r2+3rh+h2)

hを0に近づけると、(hがかかっている項は0とみなします)

(4π/3)×(3r2 )= 4πr2

となり、表面積と同じになります。

さらに学習したい方には

python初心者マークの方は

Pythonの絵本 Pythonを楽しく学ぶ9つの扉 [ 株式会社アンク ]

他の言語もかじりました系の方は

基礎からわかるPython [ 坂本俊之 ]

コメント

タイトルとURLをコピーしました