【问题标题】:Inverse Cosine in PythonPython中的反余弦
【发布时间】:2011-07-19 10:05:28
【问题描述】:

抱歉,如果这是直截了当的,但我在 python 手册或谷歌中没有找到任何帮助。

我正在尝试使用 python 找到一个值的反余弦。

即cos⁻¹(x)

有人知道怎么做吗?

谢谢

【问题讨论】:

    标签: python math trigonometry


    【解决方案1】:

    我们有acos function,它以弧度返回角度。

    >>> import math
    >>> math.acos(0)
    1.5707963267948966
    >>> _ * 2 - math.pi
    0.0
    

    【讨论】:

    • 啊,arccos和inverse cos一样吗?我已经很多年没有做过任何事情了!!!
    • 我知道这个问题有点老了,但是有没有办法返回角度的角度?
    • @DorianDore 是的!您可以使用math.degrees 函数。例如,math.degrees(math.acos(0)) 将返回 90.0
    • 谢谢!我会试试这个。
    • @SheikYerbouti:你完全正确。函数acos (arc cosine) 被定义为一个数学函数,它是余弦函数的倒数
    【解决方案2】:

    为了增加使用math.acos 的正确答案,还值得知道cmath 中有适用于复数的数学函数:

    >>> import cmath
    >>> cmath.acos(1j)
    (1.5707963267948966-0.88137358701954294j)
    

    如果您只对实数感兴趣,请坚持使用math.acos

    【讨论】:

    • 感谢您提供有关复数的信息,了解cmath。我一直在为复数和重写运算符编写自己的类。
    【解决方案3】:

    math.acos() 的结果以弧度表示。所以你需要把它转换成度数。

    你可以这样做:

    import math
    res = math.degrees (math.acos (value))
    

    【讨论】:

      【解决方案4】:

      响应使用反余弦通过 math.acos 找到返回角度,只要角度

      观察。

      >>> math.cos(5)
      0.28366218546322625
      

      上面,我让 python 给我取一个 5 弧度角的余弦,它给了我 0.28~ 很好,下面我将让 python 给我一个 0.28~ 余弦的弧度。应该是5吧?它实际上只是告诉我它是。

      >>> math.acos(0.28366218546322625)
      1.2831853071795865
      

      错了! Python 返回 1.28~ 弧度。原因在视觉上很明显,1.28rad 与 5rad 具有相同的余弦,它们是反角。每个角度都与另一个角度共享相同的正弦(并且 -sine 与另外两个角度共享)。 即 5/175* 共享一个等效的正弦。它们分别共享反比余弦 0.99~/-.99。它们的正弦表亲将是 185 和 355。这里的关系模因是所有这些角度共享与水平轴的相同角度偏转。 5*。

      python 返回 1.28 而不是 5 的原因是所有计算机/计算器都基于角度/弧度、其正弦、余弦、tan 等的类算盘数据表。所以当我 math.acos(x) ,python 要求内核在该数据表中查看具有 x 余弦的任何角度,当它找到它时,它会返回它出现的第一个条目。然后python给了我这个角度。

      由于这种共享的比例对称性,sin/cos 比率经常重复。您可能会多次看到同一个数字。如果不考虑角度正弦的 -/+ 值的额外逻辑,python 或操作系统无法确定您实际需要的两个角度中的哪一个的差异。或者,角度的切线。

      1.28 Rad has  x cosine, y sine, z tan  (72*)
      1.88 Rad has -x cosine, y sine, -z tan (108*)
      4.39 Rad has -x cosine, -y sine, z tan (252*)
         5 Rad has  x cosine, -y sine, -z tan (288*)
      

      或者,从笛卡尔角度来看,

                             negX,posY | posX,posY
                                  -----+-----
                             negX,negY |  posX,negY
      
      1.88 Rad has -x cosine, y sine (108) | 1.28 Rad has  x cosine, y sine (72*)
                                      -----+-----
      4.39 Rad has -x cosine, -y sine (252)|    5 Rad has  x cosine, -y sine (288)
      

      因此,如果出于某种原因,我需要选择 5 个弧度(例如,用于矢量图或游戏来确定敌人来自玩家的各种矢量),我将不得不进行某种类型的 if/then 逻辑比较正弦/切线。

      【讨论】:

      • 如果您需要根据正弦和余弦确定角度,则需要使用atan2(y, x) 函数(存在于任何语言中;math.atan2 在 Python 中)。它完全为您处理象限选择逻辑,可能比大多数人都更快更好。
      【解决方案5】:

      您正在寻找math.acos() 函数。

      【讨论】:

        【解决方案6】:

        您也可以使用模块numpy中的arccos

        >>> import numpy
        >>> numpy.arccos(0.5)
        1.0471975511965979
        

        警告:对于标量,numpy.arccos() 函数比math.acos 慢得多(~ 10 倍)。 See post here

        不过,numpy.arccos() 适用于序列,而 math.acos 则不适用。 :)

        >>> numpy.arccos([0.5, 0.3])
        array([ 1.04719755,  1.26610367])
        

        但是

        >>> math.acos([0.5, 0.3])
        Traceback (most recent call last):
          File "<stdin>", line 1, in <module>
        TypeError: a float is required
        

        【讨论】:

          【解决方案7】:

          或者只是为 cos^{-1}

          taylor expansion 写一个你自己的函数

          这会更耗时(运行速度可能会更慢),但这是更通用的方法

          【讨论】:

          • 嗯,我不得不说,使用一个非常好的预先存在的库函数是更通用的方法。
          猜你喜欢
          • 2014-12-30
          • 1970-01-01
          • 2017-10-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-21
          • 2018-08-03
          • 2017-12-12
          相关资源
          最近更新 更多