忍者ブログ
統計、機械学習、AIを学んでいきたいと思います。 お役に立てば幸いです。

【Python】SymPyで対数(log)を解く!数学的な厳密計算

Pythonで数学の計算をする際、通常の math.log では小数(浮動小数点数)として結果が返ってくるため、わずかな誤差が生じることがあります。今回は、代数計算ライブラリ「SymPy」を使い、数学的に美しく、正確な答えを導き出す方法を紹介します。

1. 考え方:SymPy(シムパイ)による厳密解

SymPyは「記号計算」を行うためのライブラリです。例えば「log(8, 2)」を計算する場合、単なる数値計算ではなく「2を何乗したら8になるか」という数学的な構造として処理し、正確な「3」という整数を導き出します。

[ 準備 ]
外部ライブラリのため、インストールが必要です。
pip install sympy

[ 計算ルール ]
log(真数, 底) の順で指定します。
・底を省略すると自然対数(底がe)になります。

2. Pythonサンプルプログラム

SymPyの log 関数を使用して、「底を2とする8の対数」を求めます。計算結果が数値ではなくSymPyのオブジェクトとして扱われるのがポイントです。

# -*- coding: utf-8 -*-
from sympy import log

def main():
    # log(真数, 底)
    # 8 = 2^3 なので、結果は 3 になるはずです
    ans = log(8, 2)

    print("SymPyによる対数計算を開始します。")
    print(f"log(8, 2) の結果: {ans}")

if __name__ == "__main__":
    main()

3. 実行結果

SymPyによる対数計算を開始します。
log(8, 2) の結果: 3

4. ステップアップ:文字式のまま計算する

SymPyの真骨頂は、具体的な数字だけでなく「文字」を使って計算できる点にあります。

  • 記号の定義symbols('x') を使うと、xを未知数としたまま計算が可能です。
  • 式の整理simplify() を使えば、複雑な対数式を自動で簡略化してくれます。

5. mathモジュールとの決定的な違い

Python標準の mathSymPy、どちらを使うべきか比較表で確認しましょう。

比較項目math.log (標準)sympy.log (今回)
出力形式 float(小数) Integer / Symbol(整数や記号)
精度 近似値(誤差あり) 完全な精度(誤差なし)
主な用途 高速な数値計算、統計処理 数式の証明、因数分解、方程式を解く

6. まとめ

対数計算において、答えが綺麗に整数になる場合や、文字式として扱いたい場合は SymPy が最適です。標準の math では 2.9999999999999996 のように表示されてしまうケースでも、SymPyならスッキリと 3 と答えてくれます。数学的な美しさを保ちたいプログラムにぜひ取り入れてみてください!

PR