Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

悩んだこと 

タンジェント(以降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が出力することを期待してしまったのが私の間違いだった

得たこと

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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away