webentwicklung-frage-antwort-db.com.de

Python atan oder atan2, was soll ich verwenden?

Meine Formel F = arctan (ImZ/ReZ)

Es gibt zwei Möglichkeiten:

Option 1 (atan):

ImZ=-4.593172163003
ImR=-4.297336384845

>>> z=y/x
>>> f1=math.atan(z)
>>> f1
0.8186613519278327

Option 2 (atan2)

>>> f=math.atan2(y,x)
>>> f
-2.3229313016619604

Warum unterscheiden sich diese beiden Ergebnisse?

7
Richard Rublev

Atan akzeptiert ein einzelnes Argument, und Atan2 verwendet zwei Argumente. Der Zweck der Verwendung von zwei Argumenten anstelle von einem Argument besteht darin, Informationen über die Vorzeichen der Eingaben zu sammeln, um den entsprechenden Quadranten des berechneten Winkels zurückzugeben, was für das einzelne Argument nicht möglich ist Eine Lohe

 enter image description here

Atan2-Ergebnis liegt immer zwischen -pi und pi.

Referenz: https://en.wikipedia.org/wiki/Atan2

22
Abdul Rauf

docstring für math.atan:

atan (x) Gibt den Arkustangens (in Bogenmaß) von x zurück.

docstring für math.atan2:

atan2 (y, x) Gibt den Arkustangens (in Bogenmaß) von y/x zurück. Im Gegensatz zu atan (y/x) ist Die Vorzeichen von x und y werden berücksichtigt.

Um ganz vollständig zu sein, hier ist, was das Dokument über atan2 sagt:

math.atan2 (y, x) Gibt atan (y/x) im Bogenmaß zurück. Das Ergebnis liegt zwischen -pi und pi. Der Vektor in der Ebene vom Ursprung zum Punkt (x, y) macht diesen Winkel mit der positiven X-Achse. Der Punkt von atan2 () ist dass die Vorzeichen beider Eingänge ihm bekannt sind, so dass er die .__ berechnen kann. korrekter Quadrant für den Winkel. Zum Beispiel atan (1) und atan2 (1, 1) sind beide pi/4, aber atan2 (-1, -1) ist -3 * pi/4.

Es ist also ziemlich klar: Die Ausgaben unterscheiden sich aufgrund der Vorzeichen von ImZ und ImR. Im Gegensatz zu atan gibt atan2 den entsprechenden Quadranten zurück.

7
DevShark

Eine Formel, die einen Winkel von 0 gegen den Uhrzeigersinn hat, dh die positive Achse von x

auf 2pi für einen beliebigen Wert von x und y. Für x = y = 0 ist das Ergebnis undefiniert.

f(x,y)=pi()-pi()/2*(1+sign(x))* (1-sign(y^2))-pi()/4*(2+sign(x))*sign(y)

    -sign(x*y)*atan((abs(x)-abs(y))/(abs(x)+abs(y)))
0