双曲線関数(sinh, cosh, tanh)と逆双曲線関数|Python
双曲線関数は三角関数と似た性質を持ちながら、指数関数で定義される関数群だ。物理学では特殊相対性理論や懸垂線(カテナリー)の記述に登場し、機械学習では活性化関数として使われる。Python の math モジュールで計算できる。
双曲線関数の定義
双曲線正弦 、双曲線余弦 、双曲線正接 は次のように定義される。
import math
x = 1
print(math.sinh(x)) # 1.1752011936438014
print(math.cosh(x)) # 1.5430806348152437
print(math.tanh(x)) # 0.7615941559557649
# 定義式で確認
print((math.e**x - math.e**(-x)) / 2) # 1.1752011936438014(sinh と一致)三角関数との類似点と相違点
三角関数と双曲線関数は多くの公式が似ている。ただし、符号が異なる場合がある。
三角関数
(ピタゴラスの定理)。単位円 上の点を表す。
双曲線関数
。双曲線 上の点を表す。
import math
x = 2
# 三角関数の恒等式
print(math.sin(x)**2 + math.cos(x)**2) # 1.0
# 双曲線関数の恒等式
print(math.cosh(x)**2 - math.sinh(x)**2) # 1.0000000000000002(≈ 1)関数の形状
sinh は奇関数で原点を通り、 で急激に増加する。cosh は偶関数で最小値 ()を持つ。tanh は から の範囲に収まり、S 字型のカーブを描く。
import math
# sinh は奇関数
print(math.sinh(-2)) # -3.6268604078470186
print(math.sinh(2)) # 3.626860407847019
# cosh は偶関数、最小値 1
print(math.cosh(0)) # 1.0
print(math.cosh(-2)) # 3.7621956910836314
print(math.cosh(2)) # 3.7621956910836314
# tanh は -1 ~ 1 に収まる
print(math.tanh(-10)) # -0.9999999958776927
print(math.tanh(0)) # 0.0
print(math.tanh(10)) # 0.9999999958776927逆双曲線関数
逆双曲線関数は asinh、acosh、atanh で計算する。
import math
# asinh: 定義域は全実数
print(math.asinh(0)) # 0.0
print(math.asinh(1)) # 0.8813735870195429
# acosh: 定義域は x ≥ 1
print(math.acosh(1)) # 0.0
print(math.acosh(2)) # 1.3169578969248166
# atanh: 定義域は -1 < x < 1
print(math.atanh(0)) # 0.0
print(math.atanh(0.5)) # 0.5493061443340548acosh は でのみ定義され、atanh は の開区間でのみ定義される。範囲外の値を渡すと ValueError になる。
import math
# acosh(0.5) は定義されない
# math.acosh(0.5) # ValueError: math domain error
# atanh(1) も定義されない
# math.atanh(1) # ValueError: math domain error対数による表現
逆双曲線関数は対数で表現できる。
import math
x = 2
# asinh を対数で計算
asinh_log = math.log(x + math.sqrt(x**2 + 1))
print(asinh_log) # 1.4436354751788103
print(math.asinh(x)) # 1.4436354751788103(一致)応用例:懸垂線(カテナリー)
両端を固定した鎖やケーブルが重力で垂れ下がる曲線は「懸垂線」と呼ばれ、 で表される。
import math
def catenary(x, a=1):
"""懸垂線の方程式"""
return a * math.cosh(x / a)
# x = 0 で最小値
print(catenary(0)) # 1.0
print(catenary(1)) # 1.5430806348152437
print(catenary(-1)) # 1.5430806348152437(対称)吊り橋のケーブルや送電線の形状を計算するときに使われる。
応用例:機械学習の活性化関数
tanh はニューラルネットワークの活性化関数として使われる。出力が から に正規化され、勾配消失問題がシグモイド関数より軽減される。
import math
def tanh_activation(inputs):
"""tanh 活性化関数を適用"""
return [math.tanh(x) for x in inputs]
inputs = [-2, -1, 0, 1, 2]
outputs = tanh_activation(inputs)
print(outputs)
# [-0.964..., -0.761..., 0.0, 0.761..., 0.964...]現在では ReLU 系の活性化関数が主流だが、LSTM や GRU などの RNN では今でも tanh が使われている。
その他の双曲線関数
math モジュールには含まれていないが、双曲線余割 、双曲線正割 、双曲線余接 も定義できる。
import math
def csch(x):
return 1 / math.sinh(x)
def sech(x):
return 1 / math.cosh(x)
def coth(x):
return math.cosh(x) / math.sinh(x)
print(sech(0)) # 1.0(cosh(0) = 1 の逆数)
print(coth(1)) # 1.3130352854993312これらは信号処理やソリトン理論など、特殊な分野で登場する。



