【发布时间】:2011-07-19 10:05:28
【问题描述】:
抱歉,如果这是直截了当的,但我在 python 手册或谷歌中没有找到任何帮助。
我正在尝试使用 python 找到一个值的反余弦。
即cos⁻¹(x)
有人知道怎么做吗?
谢谢
【问题讨论】:
标签: python math trigonometry
抱歉,如果这是直截了当的,但我在 python 手册或谷歌中没有找到任何帮助。
我正在尝试使用 python 找到一个值的反余弦。
即cos⁻¹(x)
有人知道怎么做吗?
谢谢
【问题讨论】:
标签: python math trigonometry
我们有acos function,它以弧度返回角度。
>>> import math
>>> math.acos(0)
1.5707963267948966
>>> _ * 2 - math.pi
0.0
【讨论】:
math.degrees 函数。例如,math.degrees(math.acos(0)) 将返回 90.0。
acos (arc cosine) 被定义为一个数学函数,它是余弦函数的倒数
为了增加使用math.acos 的正确答案,还值得知道cmath 中有适用于复数的数学函数:
>>> import cmath
>>> cmath.acos(1j)
(1.5707963267948966-0.88137358701954294j)
如果您只对实数感兴趣,请坚持使用math.acos,
【讨论】:
cmath。我一直在为复数和重写运算符编写自己的类。
math.acos() 的结果以弧度表示。所以你需要把它转换成度数。
你可以这样做:
import math
res = math.degrees (math.acos (value))
【讨论】:
响应使用反余弦通过 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 逻辑比较正弦/切线。
【讨论】:
math.atan2 在 Python 中)。它完全为您处理象限选择逻辑,可能比大多数人都更快更好。
您正在寻找math.acos() 函数。
【讨论】:
您也可以使用模块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
【讨论】:
【讨论】: