atan2
En trigonométrie, la fonction atan2 à deux arguments est une variante de la fonction arc tangente. Pour tous arguments réels x et y non nuls, est l'angle en radians entre la partie positive de l'axe des abscisses d'un plan, et le point de ce plan de coordonnées (x, y). Cet angle est positif pour les angles dans le sens anti-horaire dit sens trigonométrique (demi-plan supérieur, y > 0) et négatif dans l'autre (demi-plan inférieur, y < 0).
La fonction atan2 fut d'abord introduite dans les langages de programmation informatique, mais elle est désormais aussi couramment utilisée dans d'autres domaines de la science et de l'ingénierie. Elle est au moins aussi ancienne que le langage de programmation Fortran et on la trouve maintenant dans la plupart des autres langages.
En termes mathématiques, atan2 retourne la détermination principale de la fonction argument appliquée au nombre complexe . Soit . Le résultat pourrait varier de 2π sans aucun impact sur l'angle, mais pour garantir son unicité, on utilise la valeur principale dans l'intervalle ]–π ,π], soit .
La fonction atan2 est utilisée dans beaucoup d'applications impliquant des vecteurs de l'espace euclidien, comme pour trouver la direction d'un point à un autre en navigation ou pour effectuer une transformation de coordonnées en astronomie. Une des utilisations principales est la conversion des matrices de rotation en angles d'Euler, pour faire pivoter des représentations graphiques informatiques.
Dans certains langages informatiques, l'ordre des paramètres est inversé, ou bien la fonction est dénommée différemment. Sur les calculatrices scientifiques, le résultat de la fonction est souvent issu de la conversion des coordonnées rectangulaires (x, y) en coordonnées polaires.
Motivation
modifierLa fonction arc tangente à un seul argument ne fait pas la différence entre des directions diamétralement opposées[1]. Par exemple, l'angle anti-horaire à partir de l'axe des x jusqu'au vecteur (1, 1), calculé de la façon habituelle comme arctan(1/1), donne π/4 (radians), ou 45°. De la même façon, l'angle entre l'axe des x jusqu'au vecteur (-1, -1), avec la même méthode arctan(-1/-1), donne encore π/4, alors que la réponse clairement attendue serait plutôt −3π/4, ou −135°.
La fonction "atan2" prend en compte le signe des deux composantes du vecteur, et place l'angle dans le bon quadrant. Ainsi, et .
De plus, la méthode habituelle ne fonctionne pas dans le cas d'un angle de ± π/2 (radians) ou ± 90°. Par exemple, une tentative pour trouver l'angle entre l'axe des x et le vecteur (0, 1) nécessite l'évaluation de arctan(1/0), qui échoue à cause de la division par zéro, alors que atan2(1, 0) donne la bonne réponse π/2.
Quand les calculs sont effectués à la main, les corrections de quadrant nécessaires et la gestion des exceptions peuvent être faites par observation, mais dans un programme informatique, il est extrêmement utile de disposer d'une fonction unique qui délivre toujours un résultat correct non ambigu.
Définition
modifierPour y ≠ 0 :
où φ est l'angle compris dans [0,π/2[ tel que et sgn est la fonction signe.
Et :
Notes :
- l'expression suivante dérivée de la formule de la tangente de l'arc moitié peut aussi être utilisée pour définir atan2 :
- .
Cependant, cette expression devrait être plus adaptée à un usage symbolique que la définition précédente, et est néanmoins totalement inadaptée à l'utilisation en virgule flottante; la division provoque un débordement au voisinage de la partie négative de l'axe des x, et donne un NaN ou une erreur pour atan2(0,0).
- Cela donne des résultats compris dans ]-π, π], qui peuvent être translatés dans [0,2π[ en ajoutant 2π aux valeurs négatives.
- Traditionnellement, atan2(0,0) est non défini.
- La fonction C, et la plupart des autres implémentations informatiques, sont conçues pour les efforts de transformations des coordonnées cartésiennes en polaires, et donc définissent toujours atan2(0,0). Dans les implémentations sans zéro signé, ou lorsque sont donnés des arguments zéro positif, le résultat est normalement défini à 0. La valeur rendue sera toujours comprise dans ]-π,π] plutôt que de sortir en erreur ou de retourner NaN ("Not a Number", cad "Pas un Nombre").
- Les systèmes gérant les mathématiques symboliques devraient normalement retourner une valeur non définie pour atan2(0,0) ou bien signaler qu'une anomalie s'est produite.
- Pour les systèmes comme la virgule flottante IEEE 754 qui savent gérer le zéro signé, les infinis ou NaN, il est habituel d'implémenter des extensions capables d'étendre les résultats possibles pour inclure -π et -0. Ces dernières pourraient aussi retourner NaN ou lever une exception lorsqu'un des arguments reçus est un NaN.
La bibliothèque mathématique libre FDLIBM disponible dans netlib montre dans son code source comment implémenter atan2 avec une gestion de valeurs spéciales IEEE.
Pour les systèmes ne disposant pas d'un multiplicateur matériel, la fonction atan2
peut être implémentée numériquement d'une manière fiable avec la méthode CORDIC. Dans ce genre de cas, il sera surement préférable de calculer atan(y)
par atan2(y,1)
.
Dérivée
modifierComme la fonction atan2 est fonction de 2 variables, elle possède deux dérivées partielles. Aux points où ces dérivées existent, atan2 est, à une constante près, égale à arctan(y/x).
Pour x > 0 ou y ≠ 0,
Donc le gradient de atan2 est donné par :
Illustrations
modifierLe diagramme ci-dessous présente les valeurs prises par atan2 sur des points remarquables du cercle trigonométrique. Les valeurs, en radians, sont inscrites en bleu à l'intérieur du cercle. Les quatre points (1,0), (0,1), (-1,0), et (0,-1) sont notés à l'extérieur du cercle. On notera que l'ordre des arguments x, y est inversé ; la fonction atan2(y,x) donne l'angle correspondant au point (x,y).
Le schéma suivant montre les valeurs prises par atan2 pour les points du cercle trigonométrique. Sur l'axe des x, on a les arguments des points. Ils partent de 0 (point (1, 0)) et vont dans le sens trigonométrique en passant par les points :
- (0, 1) qui a pour argument π/2 en radians,
- (–1, 0) qui a pour argument π,
- (0, –1) qui a pour argument 3π/2,
jusqu'à (1, 0) qui a pour argument 0 = 2π modulo 2π.
Sur ce schéma, on peut voir clairement apparaitre la discontinuité de la fonction atan2. Quand un point z traverse la partie négative de l'axe réel — par exemple va de (0, 1) à (0, –1) en passant par (–1, 0) — son argument devrait aller de π/2 à 3π/2 en passant par π. Mais la valeur de la fonction atan2 (valeur principale de l'argument) va de π/2 à π, puis saute à –π (discontinuité), pour aller vers –π/2.
Ci-dessous une vue 3D montrant la différence entre atan2(y, x) et arctan(y/x).
Référence
modifier- L'ensemble de ses valeurs est l'intervalle et non pas l'intervalle
Liens externes
modifier- (en) Java 1.6 SE JavaDoc
- (en) C++ Programmer's Reference
- (en) MATLAB Function Reference
- (en) Mathematica Function Reference (note argument order is reversed)
- (en) atan2 at Everything2
- (en) PicBasic Pro solution atan2 for a PIC18F
- (en) Bearing Between Two Points
- (en) Arctan and Polar Coordinates
- (en) What's 'Arccos'?