Python Atan of Atan2, wat moet ik gebruiken?

mijn formule
F = ARCTAN (IMZ / REZ)

Er zijn twee opties:

Optie 1 (Atan):

ImZ=-4.593172163003
ImR=-4.297336384845
>>> z=y/x
>>> f1=math.atan(z)
>>> f1
0.8186613519278327

Optie 2 (ATAN2)

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

Waarom verschillen deze twee resultaten?


Antwoord 1, Autoriteit 100%

ATAN EIGEN Eén argument en ATAN2 duurt twee argumenten. Het doel van het gebruik van twee argumenten in plaats van één is om informatie over de tekenen van de ingangen te verzamelen om het geschikte kwadrant van de berekende hoek te retourneren, wat niet mogelijk is voor de Single-Argument Atan

ATAN2-resultaat is altijd tussen -Pi en PI.

Referentie:
https://en.wikipedia.org/wiki/atan2


Antwoord 2, Autoriteit 16%

DOCSTRING VOOR MATH.ATAN:

ATAN (X)
Retourneer de ARC-tangens (gemeten in radialen) van x.

DOCSTRING VOOR MATH.ATAN2:

ATAN2 (Y, X)
Retourneer de ARC-tangent (gemeten in radialen) van Y / X. In tegenstelling tot Atan (Y / X),
de tekenen van zowel x als y worden overwogen.

Om het zeer compleet te zijn, hier is wat de DOC zegt over Atan2:

Math.atan2 (Y, X) Retourneer Atan (Y / X), in Radians. Het resultaat is tussen
-pi en pi. De vector in het vlak van oorsprong naar punt (x, y) maakt deze hoek met de positieve X-as. Het punt van atan2() is
dat de tekens van beide ingangen hem bekend zijn, zodat hij de kan berekenen
juiste kwadrant voor de hoek. Bijvoorbeeld atan(1) en atan2(1, 1)
zijn beide pi/4, maar atan2(-1, -1) is -3*pi/4.

Het is dus vrij duidelijk: de outputs zijn verschillend vanwege de tekens van ImZen ImR. atan2retourneert het juiste kwadrant, in tegenstelling tot atan.


Antwoord 3, autoriteit 2%

Zoals anderen al zeiden, heeft de atan2 twee argumenten nodig om het kwadrant van de uitvoerhoek goed te kunnen bepalen…

Het geeft echter nog steeds een hoek weer tussen [-pi,pi], wat niet altijd nuttig is (positief [0,pi]voor 1e en 2e kwadrant; en negatief [-pi,0]voor 3e en 4e).

Het is mogelijk om een atan-functie te definiëren die een hoek retourneert in [0,2pi], zoals Theodore Panagos liet zien.

Verbetering van het antwoord van theodore panagos, hier is een pythonversie met numpy

import numpy
# defining the atan function
myatan = lambda x,y: numpy.pi*(1.0-0.5*(1+numpy.sign(x))*(1-numpy.sign(y**2))\
         -0.25*(2+numpy.sign(x))*numpy.sign(y))\
         -numpy.sign(x*y)*numpy.arctan((numpy.abs(x)-numpy.abs(y))/(numpy.abs(x)+numpy.abs(y)))
#testing
u = numpy.array([[numpy.sqrt(3.0)/2.0,0.5],   # expected: 30
                 [0.5,numpy.sqrt(3.0)/2.0],   # expected: 60
                 [0.0,1.0],                   # expected: 90
                 [-0.5,numpy.sqrt(3.0)/2.0],  # expected: 120
                 [-numpy.sqrt(3.0)/2.0,0.5],  # expected: 150
                 [-1.0,0.0],                  # expected: 180
                 [-numpy.sqrt(3.0)/2.0,-0.5], # expected: 210
                 [-0.5,-numpy.sqrt(3.0)/2.0], # expected: 240
                 [0.0,-1.0],                  # expected: 270
                 [0.5,-numpy.sqrt(3.0)/2.0],  # expected: 300
                 [numpy.sqrt(3.0)/2.0,-0.5],  # expected: 330
                 [1.0,0.0]])                  # expected: 0 or 360
theta = myatan(u[:,0],u[:,1])
print(theta * 180.0/numpy.pi) # converting to degrees

uitvoer:

[ 30.  60.  90. 120. 150. 180. 210. 240. 270. 300. 330.   0.]

het voert niet exact 360 uit, maar het gaat erdoorheen, en dan fietst het, zoals verwacht


Antwoord 4

Een formule om een hoek tegen de klok in te hebben vanaf 0, dat is de positieve as van x,

tot 2pi voor elke waarde van x en y. Voor x=y=0 is het resultaat niet gedefinieerd.

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)))

Other episodes