LoginSignup
1
2

More than 5 years have passed since last update.

tanとarctanが取りうる値の差異によるミス

Last updated at Posted at 2018-11-28

悩んだこと 

タンジェント(以降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()

tan.png

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()

atan.png

比較

tanとarctanのグラフを比較する
tanのグラフは逆S字状の曲線が繰り返し描画されている
対してarctanのグラフは一つのS字状の曲線が描画されている
そしてarctanが取りうる値は $-\pi/2$ から $\pi/2$ の範囲に限定されることがわかる
その条件を無視して $(3\pi)/4$ $(>\pi/2)$ の値をarctanが出力することを期待してしまったのが私の間違いだった

得たこと

値が取りうる範囲を意識する必要があることを学んだ

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2