対数関数の計算とグラフ描画

対数関数の計算とグラフ描画

 Python で 対数関数 を計算するときには、mathモジュールあるいは numpyモジュールをインポートします。

mathモジュールの対数関数

 mathモジュールで扱える対数関数 math.log(x [, base]), math.log10(x), math.log2(x), math.log1p(x) はいずれも受け取った引数 x を float型(浮動小数点数)に変換します。したがって引数 x に complex型数値(複素数)を指定すると、

 can't convert complex to float
 (complex型を float型に変換できません)

というタイプエラー (TypeError) が発生します。x に負の値を指定することもできません。負数や複素数の対数を計算する場合は、後述するように numpyモジュールをインポートしてください
 

math.log(x [, base])

 math.log(x [, base]) は base を底とした x の対数を返します。オプション引数の base を省略した場合、自然対数の底 e を指定したことになります。

# mathモジュールをインポート
import math

# math.log(x [,base])
# baseを省略すると底はe

# eを底とする5の対数
a = math.log(5)

# eを底とするeの対数
b = math.log(math.e)

# 2を底とする5の対数
c = math.log(5, 2)

# 3を底とする+∞の対数
d = math.log(float("inf"), 3)

# a, b, c, d の値をリストに格納
my_list = [a, b, c, d]

print("[a, b, c, d] =", my_list)
[a, b, c, d] = [1.6094379124341003, 1.0, 2.321928094887362, inf]

 inf は float型の +∞ を表しています (対数関数 y = logx は x → +∞ の極限で +∞ となります)。
 

math.log10(x)

 math.log10(x) は x の常用対数 (10 を底とした対数) を返します。

# mathモジュールをインポート
import math

# math.log10(x)
a = math.log10(1)
b = math.log10(10)
c = math.log10(100)
d = math.log10(0.1)

# a, b, c, d の値をリストに格納
my_list = [a, b, c, d]

print("[a, b, c, d] =", my_list)
[a, b, c, d] = [0.0, 1.0, 2.0, -1.0]

 

math.log2(x)

 math.log2(x) は 2 を底とした x の対数を返します。

# mathモジュールをインポート
import math

# math.log2(x)
a = math.log2(1)
b = math.log2(2)
c = math.log2(8)
d = math.log2(0.5)

# a, b, c, d の値をリストに格納
my_list = [a, b, c, d]

print("[a, b, c, d] =", my_list)
[a, b, c, d] = [0.0, 1.0, 3.0, -1.0]

 

math.log1p(x)

 math.log1p(x) は、e を底とした 1 + x の対数を計算します。この関数は真数が 1 に近い値のときの対数を正確に計算するために用意されたものです。たとえば、math.log1p(0.01) は math.log(1.01) よりも精度の良い値を返します。

# mathモジュールをインポート
import math

# math.log1p(x)と math.log(x,10)の精度の比較

# eを底とする1.01の対数
a = math.log(1.01)
b = math.log1p(0.01)

print("a = ", a)
print("b = ", b)
a =  0.009950330853168092
b =  0.009950330853168083

 

numpyモジュールの対数関数

 numpyモジュールで扱える対数関数 numpy.log(x), numpy.log10(x), numpy.log2(x), numpy.log1p(x) の引数 x にはint型、float型、complex型、もしくは ndarray型(配列)を指定することができます。np.array() によって ndarray型のオブジェクトを作成しておけば、複数の要素に対してまとめて対数計算を行なうことができます。

numpy.log(x)

 numpy.log(x) はネイピア数 e を底とした x の対数を返します。

# numpyモジュールをインポート
import numpy as np

# 変数の入った配列を作成
my_array = np.array([1, np.e, 10])

# 配列の各要素に対してeを底とする対数を計算
log_array = np.log(my_array)

print(log_array)
[0.         1.         2.30258509]

 

numpy.log10(x)

 numpy.log(x) は x の常用対数を返します。

# numpyモジュールをインポート
import numpy as np

# 変数の入った配列を作成
my_array = np.array([1, 10, 0.1])

# 配列の各要素に対して常用対数を計算
log_array = np.log10(my_array)

print(log_array)
[0.  1. -1.]

 

numpy.log2(x)

 numpy.log2(x) は 2 を底とした x の対数を返します。

# numpyモジュールをインポート
import numpy as np

# 変数の入った配列を作成
my_array = np.array([1, 2, 4, 0.5])

# 配列の各要素に対して2を底とした対数を計算
log_array = np.log2(my_array)

print(log_array)
[0.  1.  2. -1.]

 

numpy.log1p(x)

 numpy.log1p(x) は e を底とした 1 + x の対数を計算します。この関数は真数が 1 に近い値のときの対数を正確に計算するために用意されています。たとえば、numpy.log1p(0.001) は numpy.log(1.001) よりも高い精度の値を返します。

# numpyモジュールをnpという名前でインポート
import numpy as np

# np.log1p(x)とnp.log(x,10)の精度を比較

# eを底とする1.001の対数を計算
a = np.log(1.001)
b = np.log1p(0.001)

print("a = ", a)
print("b = ", b)
a =  0.0009995003330834232
b =  0.0009995003330835331

 

底の変換

 numpy には e, 2, 10 という 3 種類の底の対数関数しか用意されていません。任意の底 $a$ の対数を計算するときには底の変換公式

\[\log_a x=\frac{\log x}{\log a}\]を利用します。

# numpyモジュールをnpという名前でインポート
import numpy as np

# 3を底とする9の対数を計算
log3_9 = np.log(9)/np.log(3)

print(log3_9)
2.0

 

複素数の対数

 numpyモジュールの対数関数には complex型数値(複素数)を引数に渡すことができます。複素解析学において、複素変数 $z$ の対数 $w = \log z$ は、複素変数の指数関数 $z = \exp(w)$ の逆関数として定義されています。これは無限個の分枝
\[w_k=\log r+i(\theta+2k\pi)\]をもつ無限多価関数ですが、$z$ 平面を切断して、その平面上で1つの分枝を選択することによって一価関数として扱うことができます。たとえば $w = \log i$ の値は $(2k + 1/2)\pi i$ であり、任意定数 $k$ によって無限の値を取り得ますが、Python では $\pi i/2$ という一意の値を返すようになっています。

# numpyモジュールをnpという名前でインポート
import numpy as np

# e を底とする i の対数を計算
a = np.log(1j)

print(a)
1.5707963267948966j

 

負数の対数

 変数を実数から複素数に拡張された対数関数は、真数として負の値を選ぶこともできます。ただし、numpy.log(x) の引数に負の浮動小数点数をそのまま入れるとエラーになります。-1 の対数を計算したいときは、-1 + 0j のように complex型の値を渡すようにします。

# numpyモジュールをnpという名前でインポート
import numpy as np

# eを底とする-1の対数を計算
a = np.log10(-1+0j)

print(a)
3.141592653589793j

 実行結果から、$\log(-1) = \pi i$ であることがわかります。

対数関数のグラフ

 Matplotlib で対数関数のグラフを描画させるサンプルコードです。

# 対数関数のグラフ

# モジュールをインポート
import numpy as np
import matplotlib.pyplot as plt

# フィギュアを設定
fig = plt.figure()

# グリッド線を表示
plt.style.use("ggplot")

# グラフ描画領域を追加
ax = fig.add_subplot(111)

# グラフタイトルを設定
ax.set_title("y = log(x)", fontsize = 16)

# x軸, y軸のラベルを設定
ax.set_xlabel("x", fontsize = 16)
ax.set_ylabel("y", fontsize = 16)

# xのデータを用意
x = np.arange(0.1, 4, 0.1)

# yのデータを用意
y = np.log(x)

# データをプロット
ax.plot(x, y)

Python 対数関数グラフ