Inverse cosinus in Python

Excuses als dit ongecompliceerd is, maar ik heb geen hulp gevonden in de Python-handleiding of Google.

Ik probeer de inverse cosinus voor een waarde te vinden met python.

d.w.z. cos⁻¹(x)

Weet iemand hoe dit moet?

Bedankt


Antwoord 1, autoriteit 100%

We hebben de acos-functie, waarmee de hoek in radialen wordt geretourneerd.

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

Antwoord 2, autoriteit 14%

Om de juiste antwoorden te vergroten om math.acoste gebruiken, is het ook de moeite waard om te weten dat er wiskundige functies zijn die geschikt zijn voor complexe getallen in cmath:

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

Blijf bij math.acosals je alleen geïnteresseerd bent in echte getallen,


Antwoord 3, autoriteit 8%

Het resultaat van math.acos()is in radialen. Dus je moet dat omrekenen naar graden.

Zo kunt u het volgende doen:

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

Antwoord 4, autoriteit 6%

Als reactie op het gebruik van inverse cosinus om retourhoeken te vinden via math.acos, is het allemaal goed en wel, zolang de hoek <=90* is, als je daar eenmaal voorbij bent, kan python niet onderscheiden welke hoek je gezocht.

Waarnemen.

>>> math.cos(5)
0.28366218546322625

Hierboven vroeg ik python om de cosinus van een hoek van 5 radiaal te halen, en het gaf me .28~ Geweldig, hieronder vraag ik python om me de radiaal te geven met een cosinus van .28~. Moet 5 zijn, toch? Het vertelde me letterlijk dat het zo was.

>>> math.acos(0.28366218546322625)
1.2831853071795865

Fout! Python geeft 1,28~ radialen terug. De reden is duidelijk wanneer visueel uitgezet, 1.28rad heeft dezelfde cosinus als 5rad, het zijn inverse hoeken. Elke hoek deelt dezelfde sinus met een andere hoek (en -sinus met twee andere).
d.w.z. 5/175* delen een equivalente sinus. Ze delen omgekeerd evenredige cosinus .99~/-.99 respectievelijk. Hun neven-sinus zou 185 en 355 zijn. De verwante meme hier is dat al deze hoeken dezelfde hoekafbuiging van de horizontale as delen. 5*.

De reden dat python 1,28 en niet 5 retourneert, is dat alle computers/rekenmachines zijn gebaseerd op een abacus-achtige gegevenstabel van een hoek/radiaal, de sinus, cos, tan enz. Dus als ik math.acos(x) , vraagt python de kernal om door die gegevenstabel te kijken voor welke hoek dan ook een cosinus van x, en wanneer het deze vindt, retourneert het de eerste invoer waarmee het verschijnt. en dan geeft python mij die hoek.

Vanwege deze gedeelde, proportionele symmetrie worden de sin/cos-verhoudingen vaak herhaald. En u zult waarschijnlijk dezelfde figuur meerdere keren zien. Python, of het besturingssysteem, kan op geen enkele manier het verschil bepalen tussen welke van de twee hoeken je eigenlijk nodig hebt zonder extra logica te doen die rekening houdt met de -/+ waarde van de sinus van de hoek. Of de raaklijn van de hoek.

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

of, Cartesisch bekeken,

                      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)

Dus als ik, om welke reden dan ook, 5 radialen moet kiezen (bijvoorbeeld voor een vectortekening of spel om de verschillende vectoren te bepalen die vijanden van de speler zijn), zou ik een soort van als/dan-logica moeten vergelijken de sinussen/raaklijnen.


Antwoord 5, autoriteit 5%

U zoekt de functie math.acos().


Antwoord 6

U kunt ook arccosgebruiken uit de module numpy

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

WAARSCHUWING: voor scalaire waarden is de functie numpy.arccos()veel langzamer (~ 10x) dan math.acos. Bekijk bericht hier

Desalniettemin is de numpy.arccos()geschikt voor reeksen, terwijl math.acosdat niet is. 🙂

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

maar

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

Antwoord 7

of schrijf gewoon een eigen functie voor de taylor-uitbreidingvan cos^{ -1 }

dit zou meer tijd kosten (en misschien langzamer om uit te voeren), maar is de meer algemene benadering

Other episodes