Pythonで対数関数のグラフを描こう!

Pythonで対数関数を比較

プログラミングを数学の学習に活用してみましょう。今回はプログラミング言語 Pythonで対数関数のグラフを描いてみます。

対数は役に立つの?

日常生活の中で対数の計算をすることは(ほとんど)ないため、役に立たない、何のために学ぶのかわからない、という人も多いかもしれません。

近年注目されているAI(機械学習・ディープラーニング)の裏側では、対数を使った計算が行われています。コンピューターで大量のデータを扱うとき、対数はなくてはならないものです。

コンピューターで大きすぎる数値、逆に小さすぎる数値の計算をすると、オーバーフロー / アンダーフローと呼ばれる現象が起きてしまい、正しく計算できなくなります。 log a M N = log a M + log a N という対数の基本性質により、オーバーフローやアンダーフローを引き起こす掛け算(積)でも、対数に変換することで足し算(和)の計算になり、コンピューターで計算可能になります。

手にしているスマートフォンの中、ウェブサービスの裏側など日常生活のあらゆるところで、対数は活用されています。

少し前置きが長くなってしまいました。本題に進みましょう。

必要なライブラリ

Python で対数関数(logarithmic function)を描くには以下のライブラリが必要になるので、あらかじめインストールしておきましょう。

インストールされているかわからない場合は、とりあえずプログラムを実行してみましょう。インストールされていないと、エラーが出るのですぐにわかります。

対数関数のグラフを描く方法

NumPy には numpy.log / numpy.log2 / numpy.log10 の3つの関数があらかじめ用意されています。これらの関数を使って対数関数のグラフを描いていきましょう。

2 を底とする対数関数

Python で 2 を底とする対数関数 y = log 2 ⁡ x のグラフを描いてみましょう。

対数関数といっても特別なことはありません。yを計算する関数の式が違うだけで、これまで学んできた他の関数と描き方は同じです。さっそくPythonのコードを書いてみましょう。

グラフを描くのが初めての方はPython で一次関数のグラフを描こう!を参照ください。グラフの描き方の基本をいちから解説しています。

import numpy as np  # numpy の読み込み
import matplotlib.pyplot as plt  # Matplotlib の読み込み

with np.errstate(invalid='ignore'): # エラーを制御
    x = np.arange(-1, 15, 0.01)  # x座標を-1 から 10 まで 0.01 きざみで取得
    y = np.log2(x)

    plt.xlim([-1, 15])  # x座標の範囲を -1 から 15 までにする
    plt.ylim([-5, 5])  # y座標の範囲を -5 から 5 までにする
    plt.xlabel('x')  # x軸のラベルを表示する
    plt.ylabel('y', rotation=0)  # y軸のラベルを表示する
    plt.gca().set_aspect('equal')  # x軸とy軸のスケールを揃える
    plt.grid()  # グリッド(目盛軸)を表示
    plt.plot(x, y)  # x, y をプロット
    plt.show()

コードを実行すると以下の図が表示されます。

2を底とする対数関数のグラフ
図1. 2を底とする対数関数のグラフ

with np.errstate(invalid=’ignore’): について

対数関数 y = log a ⁡ x は真数 x が正( x > 0 )のときしか定義されません。そのため x が 0 以下の場合 RuntimeWarning: invalid value encountered in log といったエラーになってしまいます。with np.errstate(invalid=’ignore’): を記述することで、このエラーを制御しています。
詳しくは公式ドキュメントの numpy.errstate をご覧ください。

10を底とする対数関数(常用対数)

Python で 10 を底とする対数関数 y = log 10 ⁡ x のグラフを描いてみましょう。10 を底とする対数を常用対数と呼びます。

with np.errstate(invalid='ignore'):
    x = np.arange(-1, 15, 0.01)
    y = np.log10(x)

    plt.xlim([-1, 15])
    plt.ylim([-5, 5])
    plt.xlabel('x')
    plt.ylabel('y', rotation=0)
    plt.gca().set_aspect('equal')
    plt.grid()
    plt.plot(x, y)
    plt.show()

コードを実行すると以下の図が表示されます。

10を底とする対数関数のグラフ
図2. 常用対数のグラフ

e を底とする対数関数(自然対数)

Python で e を底とする対数関数 y = log ⅇ ⁡ x のグラフを描いてみましょう。ネイピア数 e (約2.72)を底とする対数を自然対数と呼びます。単に対数といった場合には、一般的に自然対数のことを指します。自然対数は底 e を省略して単に log8 や log30 のように記されるのが一般的です。

with np.errstate(invalid='ignore'):
    x = np.arange(-1, 15, 0.01)
    y = np.log(x)

    plt.xlim([-1, 15])
    plt.ylim([-5, 5])
    plt.xlabel('x')
    plt.ylabel('y', rotation=0)
    plt.gca().set_aspect('equal')
    plt.grid()
    plt.plot(x, y)
    plt.show()

コードを実行すると以下の図が表示されます。

自然対数のグラフ
図2. 自然対数のグラフ

1つの図にまとめて表示(応用)

応用例として、3つの対数関数を1つの図にまとめて表示するサンプルソースコードを紹介します。

with np.errstate(invalid='ignore'):
    x = np.arange(-1, 15, 0.01)  # x座標を-1 から 10 まで 0.01 きざみで取得

    y_log_2 = np.log2(x)
    y_log_e = np.log(x)
    y_log_10 = np.log10(x)

    plt.xlim([-1, 15])  # x座標の範囲を -1 から 15 までにする
    plt.ylim([-5, 5])  # y座標の範囲を -5 から 5 までにする
    plt.xlabel('x')  # x軸のラベルを表示する
    plt.ylabel('y', rotation=0)  # y軸のラベルを表示する
    plt.gca().set_aspect('equal')  # x軸とy軸のスケールを揃える
    plt.grid()
    # log2 を 赤、loge を緑, log10 を青でプロット
    plt.plot(x, y_log_2, color="red", label="log2")
    plt.plot(x, y_log_e, color="green", label="loge")
    plt.plot(x, y_log_10, color="blue", label="log10")
    plt.legend()  # 凡例を表示
    plt.show()

コードを実行すると以下の図が表示されます。

Pythonで対数関数を比較

NumPy に用意されてない対数関数

Numpy のドキュメント数学関数(Mathematical functions)を見ると、 log / log2 / log10 の3つの関数しか用意されていないようです。用意されていない 3 や 5 を底にする対数関数のグラフを描くにはどうすればよいでしょうか。

答えは簡単で(?)、数学の授業で習った「底の変換公式」を使うだけです。忘れてしまった方は Google で「対数 底の変換公式」と検索してみましょう。

y = log 3 ⁡ x y = log 5 ⁡ x  のグラフを描いてみることにします。

with np.errstate(invalid='ignore'):
    x = np.arange(-1, 15, 0.01)

    y_log_2 = np.log2(x)
    y_log_3 = np.log(x) / np.log(3)  # 底の変換公式
    y_log_5 = np.log(x) / np.log(5)  # 底の変換公式

    plt.xlim([-1, 15])
    plt.ylim([-5, 5])
    plt.xlabel('x')
    plt.ylabel('y', rotation=0)
    plt.gca().set_aspect('equal')
    plt.grid()
    # log2 を 赤、log3 を緑, log5 を青でプロット
    plt.plot(x, y_log_2, color="red", label="log2")
    plt.plot(x, y_log_3, color="green", label="log3")
    plt.plot(x, y_log_5, color="blue", label="log5")
    plt.legend()  # 凡例を表示
    plt.show()

コードを実行すると以下の図が表示されます。

log3 と log5 のグラフ

以上、対数関数のグラフの描き方でした。

一次関数、二次関数、三角関数、指数関数、対数関数・・・と、中学・高校数学で習う関数を一通り描けるようになったかと思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です