atan2,の不思議

アークタンジェント,一般的に使われる関数ですが,適応範囲が決まっています.

\( \Large \displaystyle \frac{- \pi}{2} \ \sim \ \theta \ \sim \ \frac{ \pi}{2}\)

つまり,ー90度から90度の範囲です.

θ=30, 150, 210, 330度,で考えてみると,

θ(degree)

θ(radian)

\( \Large x : 2 \ cos \ \theta \) \( \Large y : 2 \ sin \ \theta \) atan(rad) atan(degree)
30 0.5236 \( \sqrt{3}\) 1 0.5236 30
150 2.618 \( -\sqrt{3}\) 1 -0.5236 -30
210 3.665 \( -\sqrt{3}\) -1 0.5236 30
330 5.760 \( \sqrt{3}\) -1 -0.5236 -30

この計算からわかるように,0~360度の計算においても,ー90度から90度の範囲で表示します.

 

そこで,登場?したのが,atan2,です.

これは,x,yの値を指定することで,0~360度を計算してくれます(ラジアンですが)

θ(degree)

θ(radian)

\( \Large x : 2 \ cos \ \theta \) \( \Large y : 2 \ sin \ \theta \) atan(rad) atan(degree) atan2(y,x)

θ(degree)

30 0.5236 \( \sqrt{3}\) 1 0.5236 30 0.5236 30
150 2.618 \( -\sqrt{3}\) 1 -0.5236 -30 2.618 150
210 3.665 \( -\sqrt{3}\) -1 0.5236 30 -2.618 -150
330 5.760 \( \sqrt{3}\) -1 -0.5236 -30 -0.5236 -30

第3,4象限は,マイナスの値となるので,実際には,0~360度,ではなく,-180~180度,ですが,まあそれほど問題ではないでしょう.

 

問題なのは.....上の表では,

atan2(y,x)

と記したのですが,ソフトウェアによっては,異なる場合があるのです....

atan2(x,y) : エクセル,GoogleSheets, Numbers, Kyplot

atan2(y,x) : Python, R, Labview

などです.エクセル互換性のあるソフトは,エクセルに準じているようです.

 

Rにおいては,

x=sqrt(3)
y=1
atan2(y,x)
atan2(x,y)

で,

> atan2(y,x) [1] 0.5235988
> atan2(x,y) [1] 1.047198

となり,y,x,の順番であることがわかります.

 

Python(Google Colab)においては,

import math
x=math.sqrt(3)
y=1
xy=math.atan2(x,y)
yx=math.atan2(y,x)
print(yx)
print(xy)

で,

0.5235987755982989
1.0471975511965976

となり,y,x,の順番であることがわかります.

 

なぜこんな混乱があるかは,よく知りませんが,それぞれのソフトに適した使い方をしていかなくてはならないですね.

Copilot,に聞いてみると,

atan2(x,y) : ベクトル (x, y) をそのまま渡したい文化

atan2(y,x) : 数学の y/x に従った標準的定義

さらには,古いFORTRAN,等による歴史的理由があるようです.

使う方から考えると,統一してもらいたいところです.

 

 

 

t