【问题标题】:Python atan or atan2, what should I use?Python atan 或 atan2,我应该使用什么?
【发布时间】:2016-03-02 13:57:29
【问题描述】:

我的公式 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

为什么这两个结果不同?

【问题讨论】:

  • Read the docsatan2 实际上为您的角度提供了关于单位圆的正确象限。
  • @DonkeyKong 是的,我明白了!
  • @Georg Scholly 错了——它是关于 Python 的。这是关于正确选择计算机语言功能(适用于所有提供它的语言)。
  • 由于您使用的是复数,因此还有这个选项:cmath.phase(z)

标签: python math


【解决方案1】:

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

Atan2 结果总是介于 -pi 和 pi 之间。

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

【讨论】:

    【解决方案2】:

    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 的符号,输出是不同的。 atan2 返回相应的象限,与 atan 不同。

    【讨论】:

      【解决方案3】:

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

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

      可以定义一个 atan 函数,该函数返回 [0,2pi] 中的角度,如 theodore panagos 所示。

      改进 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,但它会一直到它,然后它会按预期循环

      【讨论】:

        【解决方案4】:

        一个公式从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)))
        

        【讨论】:

          猜你喜欢
          • 2010-09-21
          • 1970-01-01
          • 1970-01-01
          • 2022-12-05
          • 2014-11-05
          • 1970-01-01
          • 2011-02-03
          • 2014-10-25
          • 2014-11-29
          相关资源
          最近更新 更多