数学関数を使おう:mathモジュールを使った数学的計算#

はじめに#

これまでの記事では、基本的な四則演算やべき乗、剰余といった計算方法について学びました。しかし、より複雑な数学的計算を行う場合、これらの基本演算子だけでは不十分なことがあります。例えば、三角関数を使った計算や、小数点以下の切り上げ・切り捨てなどです。

この記事では、前の記事でも取り上げたmathモジュールを使って、数学的な計算を行う方法について学びます。

基本的な数学関数#

mathモジュールが提供する基本的な数学関数を見ていきましょう。

絶対値#

絶対値(absolute value)は、数値の符号を無視した値です。math.fabs()関数を使って計算できます。

>
# 絶対値を計算する
import math

print(f"5の絶対値: {math.fabs(5)}")
print(f"-5の絶対値: {math.fabs(-5)}")

実行結果:

5の絶対値: 5.0
-5の絶対値: 5.0

Python には組み込み関数の abs() も絶対値を計算できますが、math.fabs() は常に浮動小数点数を返す点が異なります。

>
# abs()関数との比較
print(f"abs(5): {abs(5)}")       # 整数を返す
print(f"math.fabs(5): {math.fabs(5)}")  # 浮動小数点数を返す

実行結果:

abs(5): 5
math.fabs(5): 5.0

平方根#

平方根(square root)は、二乗するとその数になる値です。math.sqrt()関数を使って計算できます。これは前回の記事でも触れましたね。

>
# 平方根を計算する
import math

print(f"25の平方根: {math.sqrt(25)}")
print(f"2の平方根: {math.sqrt(2)}")

実行結果:

25の平方根: 5.0
2の平方根: 1.4142135623730951

切り上げと切り捨て、四捨五入#

数値を整数に丸める関数もあります。

  • math.ceil(): 切り上げ(ceiling)
  • math.floor(): 切り捨て(floor)
  • round(): 四捨五入(Pythonの組み込み関数)
>
# 切り上げ、切り捨て、四捨五入
import math

print(f"3.7の切り上げ: {math.ceil(3.7)}")
print(f"3.7の切り捨て: {math.floor(3.7)}")
print(f"3.7の四捨五入: {round(3.7)}")

print(f"3.2の切り上げ: {math.ceil(3.2)}")
print(f"3.2の切り捨て: {math.floor(3.2)}")
print(f"3.2の四捨五入: {round(3.2)}")

# 負の数の場合
print(f"-3.7の切り上げ: {math.ceil(-3.7)}")
print(f"-3.7の切り捨て: {math.floor(-3.7)}")
print(f"-3.7の四捨五入: {round(-3.7)}")

実行結果:

3.7の切り上げ: 4
3.7の切り捨て: 3
3.7の四捨五入: 4
3.2の切り上げ: 4
3.2の切り捨て: 3
3.2の四捨五入: 3
-3.7の切り上げ: -3
-3.7の切り捨て: -4
-3.7の四捨五入: -4

負の数の場合、切り上げは数直線上で右側の整数(絶対値が小さい方)、切り捨ては左側の整数(絶対値が大きい方)になります。

三角関数と角度変換#

mathモジュールには三角関数(sin、cos、tan)や角度の単位変換の関数もあります。これらは数学や物理学でよく使われますが、普段はあまり使わないかもしれません。必要になったときに使い方を調べれば大丈夫です。

>
# 角度の単位変換
import math

# 三角関数
print(f"sin(0) = {math.sin(0)}")  # 0
print(f"cos(0) = {math.cos(0)}")  # 1
print(f"tan(0) = {math.tan(0)}")  # 0

# 度からラジアンへ
degrees = 90
radians = math.radians(degrees)
print(f"{degrees}度 = {radians}ラジアン")

# ラジアンから度へ
angle = math.pi / 2  # 90度相当のラジアン
degrees = math.degrees(angle)
print(f"{angle}ラジアン = {degrees}度")

実行結果:

sin(0) = 0.0
cos(0) = 1.0
tan(0) = 0.0
90度 = 1.5707963267948966ラジアン
1.5707963267948966ラジアン = 90.0度

対数関数(簡略版)#

対数(logarithm)も日常生活ではあまり使いませんが、データ分析や科学計算では重要です。必要になったときのために、基本的な使い方だけ紹介しておきます。

>
# 対数関数の基本例
import math

# 常用対数(底が10)
print(f"log10(100) = {math.log10(100)}")  # 2.0(10の2乗が100)

# 自然対数(底がe)
print(f"ln(10) = {math.log(10)}")  # 約2.3

実行結果:

log10(100) = 2.0
ln(10) = 2.302585092994046

実践例:二次方程式の解の公式#

次に、二次方程式「ax² + bx + c = 0」の解の公式を実装してみましょう。中学の復習になりますが、解の公式は数学では次のように表されます。

x = (-b ± √(b² - 4ac)) / 2a

この公式を使って、二次方程式の解を求めるプログラムを作成します。

>
# 二次方程式の解を求める
import math

# 二次方程式の係数
a = 1
b = -5
c = 6

# 判別式を計算
discriminant = b**2 - 4*a*c

# 判別式の結果によって場合分け
# (if文は後の記事で詳しく説明します)
if discriminant > 0:
    # 2つの実数解がある場合
    x1 = (-b + math.sqrt(discriminant)) / (2*a)
    x2 = (-b - math.sqrt(discriminant)) / (2*a)
    print(f"方程式 {a}x² + ({b})x + {c} = 0 の解は:")
    print(f"x1 = {x1}")
    print(f"x2 = {x2}")
elif discriminant == 0:
    # 重解(2つの解が同じ)の場合
    x = -b / (2*a)
    print(f"方程式 {a}x² + ({b})x + {c} = 0 の解は:")
    print(f"x = {x} (重解)")
else:
    # 実数解がない場合
    real_part = -b / (2*a)
    imaginary_part = math.sqrt(-discriminant) / (2*a)
    print(f"方程式 {a}x² + ({b})x + {c} = 0 の解は:")
    print(f"x1 = {real_part} + {imaginary_part}i")
    print(f"x2 = {real_part} - {imaginary_part}i")

実行結果:

方程式 1x² + (-5)x + 6 = 0 の解は:
x1 = 3.0
x2 = 2.0

この例では、x² - 5x + 6 = 0 の解を求めています。解の公式を使った計算の結果、x = 3 と x = 2 という2つの解が得られました。実際に代入して確認すると、

  • 3² - 5×3 + 6 = 9 - 15 + 6 = 0
  • 2² - 5×2 + 6 = 4 - 10 + 6 = 0

となり、正しい解であることが確認できます。

数学関数の精度と限界#

Pythonの数学関数は高精度ですが、浮動小数点数の性質上、ごくわずかな誤差が生じることがあります。例えば、次のような計算を考えてみましょう。

>
# 浮動小数点数の精度の例
import math

# 理論上は0になるはずの計算
result = math.sin(math.pi)

print(f"sin(π) = {result}")

実行結果:

sin(π) = 1.2246467991473532e-16

理論上、sin(π)は0のはずですが、実際には非常に小さい値(ほぼ0)が出ています。これは、浮動小数点数のπの表現が完全に正確ではないためです。このような誤差は、数値計算の際に考慮する必要があります。

まとめ#

この記事では、Pythonのmathモジュールを使った数学関数の活用方法を学びました。

  • mathモジュールのインポート方法
  • 数学定数(円周率π)へのアクセス
  • 基本的な数学関数(絶対値、平方根、切り上げ・切り捨て)
  • 角度の単位変換(度とラジアン)
  • 実践例(二次方程式の解)
  • 浮動小数点数の精度と限界

これらの関数を使うことで、より複雑な数学的計算を簡単に行えるようになります。全ての関数を覚える必要はなく、必要になったときに調べて使えば大丈夫です。