Python atan或atan2,我应该使用什么?

Python atan或atan2,我应该使用什么?,python,math,Python,Math,我的公式 f=arctan(ImZ/ReZ) 有两种选择: 选项1(atan): 方案2(atan2) 为什么这两个结果不同?Atan采用单参数,Atan2采用两个参数。使用两个参数而不是一个参数的目的是收集输入符号的信息,以便返回计算角度的适当象限,这对于单参数Atan是不可能的 Atan2结果始终介于-pi和pi之间 参考: math.atan的文档字符串: 阿坦(x) 返回x的反正切(以弧度为单位) math.atan2的文档字符串: atan2(y,x) 返回y/x的反正切(以弧度为单

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

有两种选择:

选项1(atan):

方案2(atan2)


为什么这两个结果不同?

Atan采用单参数,Atan2采用两个参数。使用两个参数而不是一个参数的目的是收集输入符号的信息,以便返回计算角度的适当象限,这对于单参数Atan是不可能的

Atan2结果始终介于-pi和pi之间

参考:

math.atan的文档字符串:

阿坦(x) 返回x的反正切(以弧度为单位)

math.atan2的文档字符串:

atan2(y,x) 返回y/x的反正切(以弧度为单位)。与atan(y/x)不同, 同时考虑x和y的符号

完整地说,以下是医生对atan2的看法:

math.atan2(y,x)返回atan(y/x),单位为弧度。结果介于两者之间 -圆周率和圆周率。平面中从原点到点(x,y)的矢量与正x轴形成此角度。atan2()的要点是 它知道两个输入的符号,因此可以计算 角度的正确象限。例如,atan(1)和atan2(1,1) 都是pi/4,但atan2(-1,-1)是-3*pi/4


所以很明显:输出是不同的,因为
ImZ
ImR
的符号
atan2
返回适当的象限,与
atan

不同的是,公式的角度是从0开始的逆时针方向,即x的正轴

对于x和y的任何值,都是2pi。对于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)))

正如其他人所说,atan2需要两个参数才能正确确定输出角度的象限

但是,它仍然在
[-pi,pi]
之间输出一个角度,这并不总是有用的(第一和第二象限为正
[0,pi]
;第三和第四象限为负
[-pi,0]

可以定义一个
atan
函数,该函数返回
[0,2pi]
中的角度,如西奥多·帕纳戈斯所示

在TheodorePanagos的答案的基础上进行改进,下面是一个使用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,但它一直到360,然后循环,正如预期的那样

atan2
实际上为你的角度提供了关于单位圆的正确象限。@DonkeyKong是的,我知道了@Georg Scholly错了——这是关于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.]