Python : mathで円周率の計算

円周率の計算です。

コロナが一向に収束しないのもあり、

現在会社が月の半分休業状態で、今日は家で自宅待機なのですが、

子供が宿題している横で、遊んでいるわけもいかないので、

円周率の計算をしてみました。

 

pythonでの円周率は

mathのモジュールの「math.pi」で出せるのですが、

せっかくなので、普通に計算してみました。

ちなみに、math.piの値は「3.141592653589793」

 

計算方法は、正多角形(内接、外接)ではさんだ値となり、

多角形の数が大きくなればなるほど、円に近似するという方法ですね。

円の長さ(2πr)は下記の青い八角形(内接円)と赤い八角形(外接円)の間

青い八角 > 円の長さ > 赤い八角

後は、画数が多ければ多いほど、円に近付くという計算方法です。

f:id:Kangkang1981:20200427182413p:plain


後は、一辺の長さは下記になるので、この正八角形の辺の分だけ足せばよいだけです。

内接円の場合は 2 x 半径 x sinθ

外接円の場合は 2 x 半径 x tanθ

 

まぁほぼ自己満足のプログラムです。

sin、tanを出す際にmathを使っていますからね~

下記のプログラムは正四角形から始まり、4倍ずつしていくプログラムで、

結果は下記のようになります。

csvに書き込むと下14桁が最小見たいで、途中から変わらなくなってしまいます。

f:id:Kangkang1981:20200427183644p:plain

最後の562兆角形のものは恐らく、小数点が足りずに

角度が0になってしまうのでしょうね、値が円周率が0になってしまいます。

 

f:id:Kangkang1981:20200427183723p:plain

これだけの計算が1秒かからないぐらいでできるので、素晴らしいですよね。

アルキメデスが見たら驚くでしょうね。

 

プログラムは下記です。

import math

#円周率
print(math.pi)

j = 4
j_angle = 360
list_angle = []
    
f_pi = open('pi.csv','w',encoding='utf-8')
f_pi.write('kakusu'+',')
f_pi.write('pi'+'\n')

###########################
for i in range(1,100):
#一辺の角度÷2
    angle = float(j_angle / j / 2)
#外接円の辺の長さ
    one_sin = math.sin(math.radians(90-angle)) * 0.5
    gaisetsuen = one_sin * 2 * j
#内接円の辺の長さ
    one_tan = math.tan(math.radians(90-angle)) * 0.5
    naisetsuen = one_tan * 2 * j
#内接円と外接円の平均
    average_length = (gaisetsuen + naisetsuen) / 2

#リストにデータを追加
    list_angle.append(str(j)+','
                      +str(average_length)+',' 
                      )
#csvにデータを追加
    f_pi.write(str(j)+',')
    f_pi.write(str(average_length)+'\n')

#正多角形の画数を増やす、倍々
    j = j * 2
    j_angle = 360 + (j-4)*180
#################################
    
print(list_angle)
f_pi.close()

今までにpythonについて書いた記事はここにリンクを貼ってあります。

興味があればぜひご覧ください。