円周率π

当サイトではアフィリエイトプログラムを利用して商品を紹介しています。

【Python】円周率の近似値

Python で円周率 πの近似値を使いたいときには、mathモジュールの math.pi, あるいは numpyモジュールの numpy.pi をインポートします。近似精度 (桁数) を設定したい場合は mpmath.pi を使います。

math.pi

math.pi は mathモジュールに用意されている 16 桁の円周率近似値です。

# PYTHON_MATH_PI

# In[1]

import math

# 円周率の近似値
x = math.pi

# 円周率の近似値の桁数
y = len(str(x))-1

print("pi:{}".format(x))
print("桁数:{}".format(y))
# pi:3.141592653589793
# 桁数:16

円周率の桁数を求めるときに、str() 関数で文字列に変換して len() 関数で長さを求め、小数点1文字を差し引いています。
 
from math import pi と記述して math.pi を呼びだしておけば、pi という名前で円周率を扱えます。

# In[2]

# mathモジュールから円周率の近似値をインポート
from math import pi

print(pi)
# 3.141592653589793

math.tau

math.tau は数学定数τの近似値を呼び出します。τとは [円周/半径] 、すなわち円周率の 2 倍に等しい定数として定義されています。

# PYTHON_MATH_TAU

# In[1]

import math

# τ=2*piの近似値
x = math.tau

print("τ:{}".format(x))
# τ:6.283185307179586

あらかじめ math.tau をインポートしておけば、tau という名前で τ を扱うことができます。

# In[2]

from math import tau

# τ=2*pi の近似値を表示
print(tau)
# 6.283185307179586

numpy.pi

numpy.pi は NumPy パッケージに用意されている 16 桁の円周率近似値です。

# NUMPY_PI

# In[1]

import numpy as np

# 円周率πの近似値
x = np.pi

# 円周率πの近似値の桁数
y = len(str(x))-1

print("pi:{}".format(x))
print("桁数:{}".format(y))
# pi:3.141592653589793
# 桁数:16

精度は math.pi と同じです。
numpy.pi をインポートしておけば、pi という名前で円周率を扱えるようになります。

# In[2]

# 円周率の近似値をインポート
from numpy import pi

print(pi)
# 3.141592653589793

mpmath.pi

mpmath.pi は任意精度の円周率です。
mp.dps で設定した桁数に応じて値が調整されます。

# MPMATH_PI

# In[1]

from mpmath import *

# 10桁の円周率
mp.dps = 10
print("10桁の円周率 : {}".format(pi))

# 30桁の円周率
mp.dps = 30
print("30桁の円周率 : {}".format(pi))

# 30桁の2*pi
mp.dps = 30
print("30桁の2*pi : {}".format(2*pi))
# 10桁の円周率 : 3.141592654
# 30桁の円周率 : 3.14159265358979323846264338328
# 30桁の2*pi : 6.28318530717958647692528676656

sympy.pi

sympy.pi は円周率を表すシンボルとして扱われます。

# SYMPY_PI

# In[1]

import sympy

# 円周率のシンボルを取得
print(sympy.pi)
# pi

evalf() メソッドを使って値を評価できます。
デフォルトでは 15 桁の精度があります。

# In[2]

# piの値を評価
print(sympy.pi.evalf())
# 3.14159265358979

evalf() メソッドに引数をわたせば任意精度で評価できます。

# In[3]

# piの値を25桁で評価
print(sympy.pi.evalf(25))
# 3.141592653589793238462643

円周率近似値を用いた計算例

math.pi を用いた計算例を載せておきます。
numpy.pi を用いても結果は同じなので、好きな方を使ってください。

円の周長と面積の計算

半径 5 の円の周長と面積を計算するサンプルコードです。

# CIRCLE_SURFACE_AREA

# In[1]

# mathから円周率の近似値をインポート
from math import pi

# 半径5の円の周長と面積を計算
# (p は perimeter, s は surface area の頭文字)
circle5_p = 2 * pi * 5
circle5_s = pi * 5 ** 2

print("L:{}".format(circle5_p))
print("S:{}".format(circle5_s))
# L:31.41592653589793
# S:78.53981633974483

球の表面積と体積の計算

半径 11 の球の表面積と体積を計算するサンプルコードです。

# SPHERE_SURFACE_AREA

# In[1]

# mathから円周率の近似値をインポート
from math import pi

# 半径11の球の表面積と体積を計算
# (sはsurface areaの頭文字,vはvolume の頭文字)
sphere11_s = 4 * pi * 11 ** 2
sphere11_v = (4 * pi * 11 ** 3) / 3

print("S:{}".format(sphere11_s))
print("V:{}".format(sphere11_v))
# S:1520.53084433746
# V:5575.279762570685

マチンの公式で円周率を計算する

ライブラリを使わずに数値計算で円周率を求めてみましょう。古くから円周率を計算する色々な方法が知られていますが、ここではマチンの公式
 \[\pi=16\,\mathrm{Arctan}\:\frac{1}{5}-4\,\mathrm{Arctan}\:\frac{1}{239}\tag{1}\]
を使って計算してみます。右辺に現れる $\mathrm{Arctan}\,x$ は、正接関数 $\tan{x}$ の逆関数で、
 \[y=\mathrm{Arctan}\,x\tag{2}\]
としたとき、
 \[x=\tan{y}\tag{3}\]
という関係が成り立ちます。$\mathrm{Arctan}\,x$ は以下のような無限級数で表されることが知られています。
 \[\mathrm{Arctan}\,x=\sum_{n=0}^{\infty}\frac{(-1)^n}{2n+1}x^{2n+1}\tag{4}\]
具体的に書き表すと、
 \[\mathrm{Arctan}\,x=x-\frac{x^3}{3}+\frac{x^5}{5}-\frac{x^7}{7}+\cdots\tag{5}\]
となります。数値計算では無限に項を足し算できないので、適当なところで打ち切って近似値を得る必要があります。(2) 式を任意の項まで計算する関数を Python で実装してみましょう。

# Machin's formula

# In[1]

# 逆正接関数を定義
def arctan(x, k):
    s = 0
    for n in range(k):
        s += (-1) ** n * x ** (2 * n + 1) / (2 * n + 1)
    return s

k は項数を指定します。たとえば、$\mathrm{Arctan}\,1$ を $30$ 項の級数で計算する場合は arctan(1, 30) と記述します。

# In[2]

# Arctan(1)を30項の級数で計算
val = arctan(1, 30)

print(val)
# 0.7770671416747368

次にこの arctan() を組み込んで、マチンの公式 (1) を実装してみます。

# In[3]

# マチンの公式で円周率を計算する関数
def machin(k):
    return 16 * arctan(0.2, k) - 4 * arctan(1/239, k)

$10$ 項の級数で円周率の近似値を計算してみましょう。

# In[4]

# 10項で円周率を計算する
pi_m = machin(10)

print(pi_m)
# 3.1415926535897922

真値は $3.14159\ 26535\ 89793\ 23846\ 26433\ \cdots$ なので、たった 10 項で 15 桁まで一致する精度です。

コメント

  1. 吉岡 より:

    円の周長と面積の計算のところの面積の計算で”のいちがprintの外に出ている。

    • BlogCat より:

      御指摘ありがとうございます。
      記事は訂正しておきました。本当に助かりました。

  2. あとりえこばと より:

    【AI連載小説】科学とコードの交差点(12)
     
    大学のラボで、六郷開誠と刑部明信は円周率を計算する最適な方法について情熱的に話し合っていた。プロジェクトにおいて円周率の正確な値が必要であり、どのアルゴリズムが最も適しているかを模索していた。
     
    開誠が興味津々で言った。「円周率の計算、様々なアルゴリズムがあるけど、どれが一番正確で効率的だろう?」
     
    明信も同様に興奮気味に答えた。「そうだね。アルゴリズムによって計算時間や必要なリソースが違うし、どれを選ぶかはプロジェクトの要件によるね」

    開誠はノートにメモを取りながら続けた。「Pythonでは、mathモジュールのpi定数を使うこともできるけど、それだと計算のプロセスが分からないし、自前で計算したい時もあるよね」
     
    明信は微笑みながら応じた。「その通りだね。アルゴリズムによっては、数学的な理論や計算の仕組みを理解できるから、学習の一環としても面白いよ」
     
    開誠が考え込みながら言った。「また、アルゴリズムによっては、収束の速さや必要なメモリの量も大きく違うから、プロジェクトの性格によっても選択が変わるかもしれない」

    「それに、数学的な定義や性質に基づいて円周率を計算するアルゴリズムもある。数学とプログラミングの融合が、新しい視点を提供してくれそうだね」
     
    彼らはPythonコードを書きながら、様々なアルゴリズムを検証し、円周率を計算する最適な方法についてアイデアを出し合っていた。