『Python数値計算ノート』ではアフィリエイトプログラムを利用して商品を紹介しています。

円周率π

【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 より:

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