web-dev-qa-db-fra.com

Cosinus Inverse en Python

Toutes mes excuses si cela est simple, mais je n’ai trouvé aucune aide dans le manuel Python ou dans Google.

J'essaie de trouver le cosinus inverse d'une valeur en utilisant python.

c'est-à-dire cos-1 (x)

Est-ce que quelqu'un sait comment faire ça?

Merci

27
Sheik Yerbouti

Nous avons la fonction acos , qui renvoie l'angle en radians.

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

Pour augmenter les réponses correctes afin d'utiliser math.acos, il est également utile de savoir qu'il existe des fonctions mathématiques adaptées aux nombres complexes dans cmath:

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

Tenez-vous-en à math.acos si vous ne vous intéressez qu'aux nombres réels, 

8
Michael J. Barber

Vous recherchez la fonction math.acos().

3
neil

En réponse à l'utilisation du cosinus inverse pour trouver des angles de retour via math.acos, tout est parfait tant que l'angle est <= 90 * une fois passé cela, python n'aura aucun moyen de différencier l'angle souhaité.

Observer. 

>>> math.cos(5)
0.28366218546322625

Ci-dessus, j'ai demandé à python de me chercher le cosinus d'un angle de 5 radians et il m'a donné 0,28 ~ génial, en dessous je demanderai à python de me donner le radian qui a un cosinus de 0,28. Devrait être 5, non? Il m'a littéralement dit que c'était le cas.

>>> math.acos(0.28366218546322625)
1.2831853071795865

Faux! Python renvoie 1,28 ~ radian. La raison en est évidente lorsque tracé visuellement, 1.28rad a le même cosinus que 5rad, ce sont des angles inverses. Chaque angle partage le même sinus avec un autre angle (et-sinus avec deux autres) . 5/175 * partagent un sinus équivalent. Ils partagent des cosinus inversement proportionnels, 99 ~/-. 99 respectivement. Leurs cousins ​​d'origine seraient 185 et 355. La relation ici est que tous ces angles partagent la même déviation angulaire par rapport à l'axe horizontal. 5 *.

La raison pour laquelle python retourne 1,28 et non 5, c’est que tous les ordinateurs/calculatrices sont basés sur une table de données de type abaque d’un angle/radian, son sinus, cos, tan, etc. le kernal à regarder dans cette table de données quel que soit l'angle qui a un cosinus de x, et quand il le trouve, il retourne la première entrée avec laquelle il apparaît. et puis python me donne cet angle.

En raison de cette symétrie proportionnelle partagée, les rapports sin/cos se répètent fréquemment. Et vous êtes susceptible de voir le même chiffre, plusieurs fois. Python, ou le système d'exploitation, n'a aucun moyen de déterminer la différence entre les deux angles dont vous avez réellement besoin sans faire appel à une logique supplémentaire prenant en compte la valeur -/+ du sinus de l'angle. Ou l'angle est tangent.

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*)

ou, vu cartésienement,

                       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)

Donc, si, pour une raison quelconque, j'ai besoin de 5 radians pour être choisi (par exemple pour un dessin vectoriel ou un jeu pour déterminer les différents vecteurs que les ennemis sont du joueur), je devrais faire une sorte de logique if/then comparant les sinus tangentes.

2
Matt McCarthy

Vous pouvez également utiliser arccos du module numpy

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

WARNING: pour les scalaires, la fonction numpy.arccos() est beaucoup plus lente (~ 10x) que math.acos. Voir l'article ici

Néanmoins, numpy.arccos() convient aux séquences, alors que math.acos ne l’est pas. :)

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

mais

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