Python atan或atan2,我应该使用什么?
我的公式 f=arctan(ImZ/ReZ) 有两种选择: 选项1(atan): 方案2(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的反正切(以弧度为单
为什么这两个结果不同?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.]