Обратный косинус в Python - PullRequest
34 голосов
/ 19 июля 2011

Извините, если это прямо, но я не нашел никакой помощи в руководстве по питону или в Google.

Я пытаюсь найти обратный косинус для значения, используя python.

т.е. cos-1 (x)

Кто-нибудь знает, как это сделать?

Спасибо

Ответы [ 6 ]

46 голосов
/ 19 июля 2011

У нас есть функция acos , которая возвращает угол в радианах.

>>> import math
>>> math.acos(0)
1.5707963267948966
>>> _ * 2 - math.pi
0.0
8 голосов
/ 19 июля 2011

Чтобы дополнить правильные ответы для использования math.acos, также стоит знать, что в cmath имеются математические функции, подходящие для комплексных чисел:

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

Придерживайтесь math.acos, если вас интересуют только реальные цифры,

3 голосов
/ 19 июля 2011

Вы ищете функцию math.acos().

2 голосов
/ 13 сентября 2015

В ответ на использование обратного косинуса для нахождения углов возврата с помощью math.acos, все нормально и прекрасно, если угол равен <= 90 *, как только вы пройдете этот путь, у питона не будет способа определить, какой угол вы хотели . </p>

Обратите внимание.

>>> math.cos(5)
0.28366218546322625

Вверху я попросил питона вывести мне косинус угла 5 радиан, и он дал мне .28 ~ Отлично, ниже я попрошу питона дать мне радиан с косинусом .28 ~. Должно быть 5, верно? Буквально только что сказал мне, что это было.

>>> math.acos(0.28366218546322625)
1.2831853071795865

Неправильно! Python возвращает 1,28 радиана. Причина очевидна при визуальном изображении, 1.28rad имеет тот же косинус, что и 5rad, это обратные углы. Каждый угол имеет один и тот же синус с другим углом (и -синус с двумя другими). т. е. 5/175 * имеют эквивалентный синус. Они имеют обратно пропорциональные косинусы .99 ~ / -. 99 соответственно. Их двоюродные братья по синусам будут 185 и 355. Здесь мем меморандума о том, что все эти углы имеют одинаковое угловое отклонение от горизонтальной оси. 5 *.

Причина, по которой Python возвращает 1.28, а не 5, состоит в том, что все компьютеры / калькуляторы основаны на абакусоподобной таблице данных угла / радиана, его синуса, cos, tan и т. Д. И т. Д. Так что, когда я math.acos (x) , python просит ядро ​​просмотреть эту таблицу данных на предмет того, какой угол имеет косинус x, и когда он находит его, он возвращает первую запись, с которой он появляется. а потом питон дает мне этот угол.

Из-за этой общей пропорциональной симметрии отношения 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 синусы / касательные.

0 голосов
/ 01 июня 2018

Вы также можете использовать arccos из модуля numpy

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

ПРЕДУПРЕЖДЕНИЕ : Для скаляров функция numpy.arccos() намного медленнее (~ 10x), чем math.acos. Смотрите пост здесь

Тем не менее, 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
0 голосов
/ 19 июля 2011

или просто напишите собственную функцию для расширения Тейлора из cos ^ {- 1}

, это займет больше времени (и, возможно, будет медленнее), ноболее общий подход

...