簡體   English   中英

Python atan 或 atan2,我應該使用什么?

[英]Python atan or atan2, what should I use?

我的公式 f=arctan(ImZ/ReZ)

有兩種選擇:

選項 1(atan):

ImZ=-4.593172163003
ImR=-4.297336384845

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

選項 2 (atan2)

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

為什么這兩個結果不同?

Atan 采用單個參數,Atan2 采用兩個參數。使用兩個參數而不是一個參數的目的是收集有關輸入符號的信息,以便返回計算出的角度的適當象限,這對於單參數是不可能的曬黑

每個 x,y 的 atan2 結果

Atan2 結果總是在 -pi 和 pi 之間。

參考: https : //en.wikipedia.org/wiki/Atan2

math.atan 的文檔字符串:

atan(x) 返回 x 的反正切(以弧度為單位)。

math.atan2 的文檔字符串:

atan2(y, x) 返回 y/x 的反正切(以弧度為單位)。 與 atan(y/x) 不同,x 和 y 的符號都被考慮。

為了非常完整,以下是文檔對 atan2 的說明:

math.atan2(y, x) 以弧度為單位返回 atan(y / x)。 結果介於 -pi 和 pi 之間。 平面中從原點到點 (x, y) 的向量與正 X 軸形成這個角度。 atan2() 的要點是它知道兩個輸入的符號,因此它可以計算角度的正確象限。 例如,atan(1) 和 atan2(1, 1) 都是 pi/4,但 atan2(-1, -1) 是 -3*pi/4。

所以,這是很明確的:由於輸出的標志是不同的ImZImR atan不同, atan2返回適當的象限。

正如其他人所說,atan2 需要兩個參數才能正確確定輸出角度的象限......

但是,它仍然輸出[-pi,pi]之間的角度,這並不總是有用(第一和第二象限為正[0,pi] ;第三和第四象限為負[-pi,0] )。

正如 theodore panagos 所示,可以定義一個返回[0,2pi]的角度的atan函數。

改進 theodore panagos 的回答,這是一個使用 numpy 的 python 版本

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

輸出:

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

它不會准確地輸出 360,但它會一直到它,然后按預期循環

一個公式從 0 逆時針方向有一個角度,即 x 的正軸,

到 2pi 對於任何 x 和 y 值。 對於 x=y=0,結果未定義。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM