ネイピア数と指数関数

当サイトではアフィリエイトプログラムを利用して商品を紹介しています。

mathモジュールの指数関数

mathモジュールをインポートすると、math.e, math.exp(x), math.expm1(x) を使えるようになります。

math.e

math.e にはネイピア数(自然対数の底)の近似値が格納されています。

# PYTHON_NAPIER'S_CONSTANT

# In[1]

import math

val = math.e  # ネイピア数e
print(val)  # 2.718281828459045


# In[2]

digits = len(str(math.e)) - 1  # math.eの桁数
print(digits)  # 16

math.exp()

math.exp(x) はネイピア数(e = 2.718…)を底とする指数関数 e^x の値を返します。
受け取った引数は float型に変換されます。complex型は float型に変換できないので、複素数を引数に指定することができません。

# PYTHON_MATH_EXP

# In[1]

import math

val = math.exp(1)
print(val)  # 2.718281828459045


# In[2]

val = math.exp(2)
print(val)  # 7.38905609893065


# In[3]

val = math.exp(-1)
print(val)  # 0.36787944117144233

math.e と math.exp(1) が一致することを確認しておきます。

# In[4]

import math

a = math.e
b = math.exp(1)

print(a == b)
# True

math.expm1()

math.expm1(x) は指数関数 exp(x) から 1 を引いた値を返します。
非常に小さな x で exp(x) – 1 を計算すると減算により桁落ちしますが、expm1()関数は精度を保ちます。

# PYTHON_MATH_EXPM1

# In[1]

import math

val = math.expm1(1.0e-5)

print(val)
# 1.0000050000166667e-05

【NumPy】指数関数

NumPyをインポートすると、numpy.e, numpy.exp(x) を扱うことができます。NumPy の関数は ndarray という多次元配列を引数として与えると ndarray で返すユニバーサル関数です。

numpy.e

numpy.e はネイピア数(自然対数の底) の近似値を呼び出します。

# NUMPY_NAPIER'S_CONSTANT

import numpy as np

# ネイピア数(自然対数の底)
print(np.e)

# 2.718281828459045

numpy.exp()

numpy.exp(x) は指数関数 ex を返します。

# NUMPY_EXP

# In[1]

import numpy as np

# 変数 x = 0, 1, 2
x = np.array([0, 1, 2])

# exp(0), exp(1), exp(2) を計算
y = np.exp(x)

print(y)
# [1.         2.71828183 7.3890561]

numpy.exp(x) の引数 x には複素数を指定することもできます。

# In[2]

# 複素数変数を定義
z = 5 + 11j

val = np.exp(z)

print(val)
# (0.6568318196405344-148.411705625828j)

指数関数のグラフ

Matplotlib を読み込んで指数関数のグラフを描画させるサンプルコードです。Jupyter Notebook などで使ってみてください。

# NUMPY_EXPONENTIAL_PLOT

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 = exp(x)", fontsize = 16)

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

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

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

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

指数関数のグラフ

【SymPy】指数関数

SymPy をインポートすると記号を使って指数関数を計算できます。

sympy.exp()

 sympy.exp() はネイピア数 e を底とする指数関数を返します。

# SYMPY_EXP

# In[1]

import sympy

# 記号xを定義
sympy.var('x y')

# f(x)=exp(x)
f = sympy.exp(x)

# g(y)=exp(y)
g = sympy.exp(y)

# h=f(x)g(y)
h = sympy.simplify(f*g)

print(h)
# exp(x + y)

コメント

  1. HNaito より:

    下記は誤植と思われますので、ご確認ください。
    EXP_07 プログラムの実行結果で、’ggplot’ スタイル → デフォルトスタイル

    • HNaito より:

      上記のコメントを取り消します。
      プログラム中の plt.style.use(“ggplot”) を見落としていました。

  2. あとりえこばと より:

    【AI連載小説】科学とコードの交差点(25)「指数関数の高速計算」
     
    Pythonサークルのメンバーたちはある日、指数関数を計算する最良の方法について活発な議論を繰り広げていた。開誠、明信、あやか、たくや、まなみ、さとる、たけしが集まり、Pythonの指数関数の計算について知見を共有していた。

    開誠: 指数関数って言えば、mathモジュールのexp()が一般的だけど、他にも速い方法はないかな?
    明信: NumPyのnp.exp()もあるよ。これは配列に対しても高速に計算できるんだ。
    あやか: それにしても、Pythonの指数関数の計算はどのアルゴリズムが使われているんだろう?
    たくや: mathモジュールのexp()は標準のCライブラリのexp()を呼び出しているみたいだね。どんなアルゴリズムかはCライブラリ次第かな。

    まなみ: でも、mathやnumpyを使わなくても、普通にeのべき乗を計算することもできるよね。
    さとる: そうだね。ただし、大きな数を計算する場合は桁あふれに注意しないといけないけど。
    たけし: でも、mathやnumpyは内部で最適なアルゴリズムが選ばれているから、基本的にはそれらを使うのが安心だよね。

    開誠: それにしても、計算の精度や速度に対して何か特定のケースで有利な手法があるかもしれないね。
    あやか: 例えば、特に小数の指数計算を高速に行う方法があれば便利だよね。