atan2について感謝と疑問と注意点


:cherry_blossom::cherry_blossom::cherry_blossom: **ページ末に貴重なコメントを沢山いただいております。そちらもご覧ください。** :cherry_blossom::cherry_blossom::cherry_blossom:
### atan2とは

　Qiita内で今さら言うことでもないでしょうが、プログラミング言語には逆三角関数の $\tan^{\\!\scriptsize{-1}}$ を計算するための atan というコマンドがあります。この atan は１変数関数ですが、atan2 はこの機能をさらに拡張した２変数関数で、現在ではどの言語にも備えられている便利なコマンドです。

　下図の赤色のメッシュが atan、青色のメッシュが atan2 から出力される角度 $\theta$ です。両図の原点どうしの間隔が60～65mm になるようにブラウザの横幅を調整したうえ、垂直に立てた画面を上から見下ろすような位置関係で見ると不快感が減ります。
 
![atan_atan2_stereo01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/932484/0c4295dc-420a-7380-a4fb-2d057f9c6ff4.png)

### 感謝　

　私が使っていた昔の FORTRAN や BASIC には、atan はあっても atan2 はなかったように思います。

　atan(y/x) から得られる答 $\theta$ の範囲は $-\pi/2 \leq\theta\leq\pi/2$ だけなので、機能的に十分とは言えません。この範囲外も含めた４象限全体の答（ $-\pi\\ {\lt}\\ \theta\\ {\leq}\\ \pi$ ）が必要なときには、わざわざ場合分けしながら、図からも分かるように、次のように記述する必要がありました。（ $\tan^{\\!\scriptsize{-1}}\(\frac{y}{x}\)\equiv$ atan(y/x) ）

$x\geq 0$ のとき
　$\theta=\tan^{\\!\scriptsize{-1}}\(\frac{y}{x}\)$
　（$x{=}0,\\ y{=}0$ のときにはエラーなどになる）
$x\lt 0$ のとき
　$y\geq 0$ のとき
　　$\theta\\ {=}\\ \tan^{\\!\scriptsize{-1}}\(\frac{y}{x}\)+\pi$
　$y\lt 0$ のとき
　　$\theta\\ {=}\\ \tan^{\\!\scriptsize{-1}}\(\frac{y}{x}\)-\pi$
　
　コピペが自由にできる現代のエンジニアの方々には、そこまで大袈裟な問題ではないと感じられるかもしれません。しかし、紙のコーディングシートに、消しゴムで修正を加えながら、鉛筆でコードを手書きしていくのはなかなか面倒な作業でした。

　それが今では、atan2(y,x) という超簡単な記述をするだけで済んでしまうのですから感謝しかありません。しかも、鉛筆も消しゴムも必要ありません。（老害の本音「**今の若いもんは苦労が足りん！**」）

### 疑問

　プログラミング言語の方が先行してしまって、数学界が追い付けていないのか？ **atan と atan2 を明確に識別できるような数学表記は見たことがありません**。適切な表記方法がないと、高邁な先生の理論を十分に理解できないままにプログラミングせざるを得ないようなとき、どちらのコマンドを使えば良いのか迷ってしまいます。

　「$\log_{}$」は、それ単独では色々な解釈ができる曖昧な記号でしかないのに、「$\log_{\scriptsize{10}}$」や「$\log_e$」（「$\ln$」） の簡略記号として当然のことのように使われています。読者や聴き手に対し、分野や状況を勘案して本来の意味を適正に判断するように求められます。取り違えるようなことがあれば「雑巾掛けから出直して来い！」などと罵られかねません。

　「$\tan^{\\!\scriptsize{-1}}$」も、今では「$\log_{}$」と同様な扱いになっているのでしょうか？　$\tan^{\\!\scriptsize{-1}}\frac{y}{x}$ と書いてある場合、
　
　　$\tan^{\\!\scriptsize{-1}}\(\frac{y}{x}\)$ と判断するのか？
　　$\tan^{\\!\scriptsize{-1}}\frac{(y)}{(x)}$ （atan2の私的暫定表記）と判断するのか？
　　
エンジニアとしての技量が試されるところなのでしょうか。

　しかし、一般には、今でもやはり $\tan^{\\!\scriptsize{-1}}\(\frac{y}{x}\)$ と解釈するのが正しそうです。高校生(*補足参照)ではなく、技術系社会人を対象とした公式集でも、三角関数の合成公式の表現は次のようになっています。明らかに $\tan^{\\!\scriptsize{-1}}\(\frac{y}{x}\)\equiv$ atan(y/x) を前提にしています。　

$$
\begin{align}
a\sin\theta+b\cos\theta=\sqrt{a^2+b^2}\\,\sin(\theta+\varphi)
\end{align}
$$
　この式の中の $\varphi$ については、atan2 を意識して表せば、次式のように１行だけで済んでしまいます。

$$
\begin{align}
&\varphi=\tan^{\\!\scriptsize{-1}}\frac{(\hspace{0.1em}b\hspace{0.1em})}{(\hspace{0.05em}a\hspace{0.05em})}
\end{align}
$$
ところが、手元にある公式集では次のように表現されています。

***ケース１***（ atan では曖昧と判断して逆三角関数を使用しない ）
$$
\begin{align}
\sin\varphi=\frac{b}{\sqrt{a^2+b^2}}\ ,\quad\cos\varphi=\frac{a}{\sqrt{a^2+b^2}}
\end{align}
$$
***ケース２***（ atan を使って atan2 を表現 ）

$$
\begin{align}
\varphi=
\begin{cases}
\tan^{\\!\scriptsize{-1}}\frac{b}{a}&(a\geq 0)\\\\
\tan^{\\!\scriptsize{-1}}\frac{b}{a}+\pi&(a\lt 0)
\end{cases}
\end{align}
$$
（注：　ここでは、$\varphi$ は 三角関数の引数にそのまま加算して使われるだけなので、$\pm 2\pi$ の差異があっても問題はなく、$b$（前記の $y$ に相当）の符号による場合分けは不要となる）

　ケース２の場合、著者は当然 $\tan^{\\!\scriptsize{-1}}\frac{b}{a}\equiv$ atan(b/a)を意図しています。**気を利かせたつもりで** $\tan^{\\!\scriptsize{-1}}\frac{b}{a}\equiv$ atan2(b,a) **などとプログラミングしてしまうと、とんでもないことになります。**

　結論：　**数学界の方々には、早く、atan2 を表現する明確な数学記法を決めていただきたいものです**。

### 注意点

　atan2 は便利なコマンドですが、**言語によって呼び出し方法が異なるので注意が必要です。下記のように、atan2(y,x) とするものもあれば、逆順に atan2(x,y) とするものもあります。**（ネット上にある各種言語のマニュアルから拾い出したものです。自分の使用経験から確証が持てるのはほんの一部だけなので、参考程度にお願いします。）

　残念ながら、この違いはすぐには統一されそうにはありません。それにしても、利用人口がもっとも多そうな Excel が、マイナーなグループに属しているのは気になります。

**atan2(y,x)方式**
　Java,　C,　Python( math.atan2 ),　PHP,　Javascript( Math.atan2 ), 　Perl,　Ruby,　R,　MATLAB,　Octave,　Scilab( 2引数を持つatan ),　Fortran,　Maple( 2引数を持つarctan ),　Maxima,　Julia( 2引数を持つatan )


**atan2(x,y)方式**
　Excel,　Excel VBA( WorksheetFunction.Atan2 ),　Mathematica( ArcTan )


### 補足

　(*)　私の学生時代には、逆三角関数は高校で習ったように記憶していますが、今では高校でも教えていないようです。しかし、三角関数の合成公式は令和３年発行の数学$\mathrm{I\\!I}$でも出てきます。そこでの $\varphi$ は上記のケース１と同様に表現されていますが、逆三角関数を教えていないのですから atan2 以前の問題です。