【Python】円周率の近似値を求める方法

この記事では、モンテカルロ法や数学の公式を使って円周率を近似する方法を紹介します。

Pythonを使って円周率を計算する手法を学びましょう!

目次から探す

モンテカルロ法による円周率の近似

モンテカルロ法の概要

モンテカルロ法は確率的な手法を用いて数値を求める手法の一つです。

円周率の近似を求める際にもモンテカルロ法を活用することができます。

モンテカルロ法では、ランダムなサンプリングを行い、その結果から数値を推定します。

円周率の場合、ランダムに点を打ち、その点が円の内部に入る確率を利用して円周率を求めることができます。

モンテカルロ法を用いた円周率の求め方

以下にPythonを用いて円周率をモンテカルロ法で近似する方法を示します。

import random

def estimate_pi(num_points):
    points_inside_circle = 0
    total_points = num_points

    for _ in range(num_points):
        x = random.uniform(0, 1)
        y = random.uniform(0, 1)
        distance = x**2 + y**2

        if distance <= 1:
            points_inside_circle += 1

    pi_estimate = 4 * points_inside_circle / total_points
    return pi_estimate

num_points = 1000000
estimated_pi = estimate_pi(num_points)
print(f"Estimated value of pi: {estimated_pi}")

このサンプルコードでは、指定された数のランダムな点を生成し、それらが単位円の内部に入るかどうかを判定して円周率を推定しています。

実行結果として、近似された円周率の値が出力されます。

レーマンの公式による円周率の近似

レーマンの公式とは

レーマンの公式は、数学者ベルンハルト・レーマンによって発見された円周率を求めるための公式です。

この公式は、無限級数を用いて円周率を近似する方法です。

レーマンの公式は以下のように表されます。

この公式を用いることで、円周率を近似的に求めることができます。

レーマンの公式を用いた円周率の求め方

Pythonを用いて、レーマンの公式を実装して円周率を求める方法を示します。

def leibniz_pi(n):
    result = 0
    sign = 1
    for i in range(1, n*2, 2):
        result += sign * (1/i)
        sign *= -1
    return result * 4

# nを大きくするほど精度が向上します
n = 1000000
approx_pi = leibniz_pi(n)
print(f"円周率の近似値: {approx_pi}")

このサンプルコードでは、指定された回数分だけレーマンの公式を計算し、円周率の近似値を求めています。

nの値を大きくするほど、より精度の高い近似値が得られます。

レーマンの公式は収束が遅いため、高い精度の近似値を得るには多くの項を計算する必要があります。

チュドノフスキーの公式による円周率の近似

チュドノフスキーの公式とは

チュドノフスキーの公式は、円周率を計算するための無限級数を用いた公式です。

この公式は、数学者ボルチャノ・チュドノフスキーによって提案されました。

チュドノフスキーの公式は、円周率を正確に表現するために必要な無限級数を有限の項で近似することができる特徴があります。

チュドノフスキーの公式を用いた円周率の求め方

チュドノフスキーの公式を用いて円周率を求める手順は以下の通りです。

  1. チュドノフスキーの公式を用いて円周率を計算するために、公式の中で使用するパラメーターを設定します。
  2. チュドノフスキーの公式を適用し、有限の項で円周率の近似値を計算します。
  3. 計算結果を出力し、円周率の近似値を確認します。

以下に、Pythonを用いてチュドノフスキーの公式を実装するサンプルコードを示します。

import math

def chudnovsky_pi(n):
    pi = 0
    for k in range(n):
        pi += ((-1)**k) * math.factorial(6*k) * (13591409 + 545140134*k) / (math.factorial(3*k) * math.factorial(k)**3 * 640320**(3*k))
    
    pi = pi * 12 / (640320**1.5)
    pi = 1 / pi
    
    return pi

# 項数を設定
n = 10

# チュドノフスキーの公式を用いて円周率を計算
approx_pi = chudnovsky_pi(n)
print("Approximated Pi using Chudnovsky's formula:", approx_pi)

このサンプルコードでは、指定した項数(n)に基づいてチュドノフスキーの公式を用いて円周率を近似計算しています。

計算結果はApproximated Pi using Chudnovsky's formula:の後に表示されます。

マチンの公式による円周率の近似

マチンの公式とは

マチンの公式は、円周率を計算するための無限級数を表した公式です。

この公式は、数学者マチンによって発見されました。

マチンの公式は、円周率を正確に表現するための方法の一つとして知られています。

マチンの公式を用いた円周率の求め方

マチンの公式は以下のように表されます。

この公式を用いて円周率を近似するためには、上記の無限級数をいくつかの項まで計算し、その結果を4倍することで円周率の近似値を得ることができます。

以下に、Pythonを用いてマチンの公式を実装するサンプルコードを示します。

import math
# マチンの公式による円周率の近似計算
def machin_formula(n):
    result = 0
    for i in range(n):
        result += 4 * ((-1) ** i) / (2 * i + 1)
    return result

# 項数を指定して円周率を近似計算
n = 1000
approx_pi = machin_formula(n)
print(f"マチンの公式による円周率の近似値({n}項まで計算): {approx_pi}")

このサンプルコードでは、machin_formula関数でマチンの公式を実装し、指定した項数までの計算結果を用いて円周率の近似値を求めています。

実行結果として、指定した項数までの円周率の近似値が表示されます。

その他の円周率の近似方法

ニュートン法を用いた円周率の求め方

ニュートン法は、数値解析において根を見つけるための反復法の一つです。

円周率を求める際にも応用することができます。

ニュートン法を用いて円周率を求める手順は以下の通りです。

  1. ニュートン法の基本的なアルゴリズムを理解する。
  2. ニュートン法を円周率の計算に適用する。
  3. 反復計算を行い、円周率の近似値を求める。

以下にPythonでのニュートン法を用いた円周率の計算のサンプルコードを示します。

def newton_pi():
    x = 1.0  # 初期値
    while True:
        fx = x - 1 + 1/(x**2)
        if abs(fx) < 1e-6:  # 収束条件
            break
        fpx = 1 + 2/(x**3)
        x = x - fx / fpx
    return x

approx_pi = newton_pi()
print("ニュートン法による円周率の近似値:", approx_pi)

ラマヌジャンの公式を用いた円周率の求め方

ラマヌジャンの公式は、数学者ラマヌジャンによって発見された円周率の近似式です。

この公式を用いることで、高い精度で円周率を求めることができます。

ラマヌジャンの公式を用いた円周率の計算手順は以下の通りです。

  1. ラマヌジャンの公式を理解する。
  2. 公式に必要なパラメータを設定する。
  3. 公式を計算し、円周率の近似値を求める。

以下にPythonでラマヌジャンの公式を用いた円周率の計算のサンプルコードを示します。

import math

def ramanujan_pi():
    pi = 0
    k = 0
    while True:
        pi += (math.factorial(4*k) * (1103 + 26390*k)) / ((math.factorial(k)**4) * 396**(4*k))
        if math.isclose(pi, math.pi, rel_tol=1e-6):  # 収束条件
            break
        k += 1
    return 1 / ((2 * math.sqrt(2) / 9801) * pi)

approx_pi = ramanujan_pi()
print("ラマヌジャンの公式による円周率の近似値:", approx_pi)

これらの方法を用いることで、ニュートン法やラマヌジャンの公式を活用して円周率の近似値を求めることができます。

目次から探す