悩んだこと
タンジェント(以降tan)の逆関数にアークタンジェント(以降arctan)がある
逆関数の定義から以下が成り立つと考えていた
import math
theta = math.pi / 4
theta == math.atan(math.tan(theta)) # True
実際に上スクリプトの3行目はTrueになる
しかし、以下の場合は3行目はFalseとなる
import math
theta = (math.pi * 3) / 4
theta == math.atan(math.tan(theta)) # False
これでしばらく悩んでいた
原因
原因を説明するためtanおよびarctanのグラフを以下に描く
なおスクリプトを短くするためにmath.tanおよびmath.atanの代わりにnumpy.tanとnumpy.arctanを使用する
tanのグラフ
tanのグラフは次のようになる
import numpy as np
import matplotlib.pyplot as plt
from math import pi
x = np.arange(-2*pi, 2*pi, 0.1)
y = np.tan(x)
plt.xlim(-2*pi, 2*pi)
plt.ylim(-4, 4)
plt.xticks([-2*pi,-pi,0,pi,2*pi],["-2pi","-pi","0","pi","2pi"])
plt.yticks([-4,-2,0,2,4],["-4","-2","0","2","4"])
plt.grid(True)
plt.scatter(x, y, s=5)
plt.show()
arctanのグラフ
続いてarctanのグラフを描く
import numpy as np
import matplotlib.pyplot as plt
from math import pi
x = np.arange(-10, 10, 0.1)
y = np.arctan(x)
plt.xlim(-4, 4)
plt.ylim(-2*pi, 2*pi)
plt.xticks([-4,-2,0,2,4],["-4","-2","0","2","4"])
plt.yticks([-2*pi,-pi,0,pi,2*pi],["-2pi","-pi","0","pi","2pi"])
plt.grid(True)
plt.scatter(x, y, s=5)
plt.show()
比較
tanとarctanのグラフを比較する
tanのグラフは逆S字状の曲線が繰り返し描画されている
対してarctanのグラフは一つのS字状の曲線が描画されている
そしてarctanが取りうる値は $-\pi/2$ から $\pi/2$ の範囲に限定されることがわかる
その条件を無視して $(3\pi)/4$ $(>\pi/2)$ の値をarctanが出力することを期待してしまったのが私の間違いだった
得たこと
値が取りうる範囲を意識する必要があることを学んだ