数学関数を使おう: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
モジュールのインポート方法- 数学定数(円周率π)へのアクセス
- 基本的な数学関数(絶対値、平方根、切り上げ・切り捨て)
- 角度の単位変換(度とラジアン)
- 実践例(二次方程式の解)
- 浮動小数点数の精度と限界
これらの関数を使うことで、より複雑な数学的計算を簡単に行えるようになります。全ての関数を覚える必要はなく、必要になったときに調べて使えば大丈夫です。