Come funzionano le funzioni trigonometriche?


102

Quindi nella matematica delle scuole superiori, e probabilmente all'università, ci viene insegnato come usare le funzioni trigonometriche, cosa fanno e che tipo di problemi risolvono. Ma mi sono sempre state presentate come una scatola nera. Se hai bisogno del seno o del coseno di qualcosa, premi il pulsante peccato o cos sulla tua calcolatrice e sei a posto. Che va bene.

Quello che mi chiedo è come vengono implementate tipicamente le funzioni trigonometriche.


Sei confuso su cosa sono le funzioni trigonometriche o su come vengono implementate?
Kyle Cronin

15
So cosa sono. So cosa fanno. So come determinare di cosa ho bisogno per quale scopo. Posso dirti tutto sulla relazione tra angoli e distanze. Quello che stavo cercando era più sulla falsariga della risposta di John D. Cook. E tutti gli altri che hanno menzionato gli algoritmi reali
Jurassic_C

Questa è una buona domanda. Ad esempio, seno, coseno e tangente sono funzioni trascendentali e quelle sono difficili da risolvere ... D'altra parte, possono essere definite utilizzando una semplice espansione in serie di Taylor che ti darà la risposta corretta fino a qualsiasi grado finito di precisione necessario.
Alex

Risposte:


144

Innanzitutto, devi fare una sorta di riduzione della portata. Le funzioni trigonometriche sono periodiche, quindi è necessario ridurre gli argomenti a un intervallo standard. Per cominciare, potresti ridurre gli angoli in modo che siano compresi tra 0 e 360 ​​gradi. Ma usando poche identità, ti rendi conto che potresti cavartela con meno. Se calcoli seno e coseno per angoli compresi tra 0 e 45 gradi, puoi eseguire il bootstrap per calcolare tutte le funzioni trigonometriche per tutti gli angoli.

Dopo aver ridotto il tuo argomento, la maggior parte dei chip utilizza un algoritmo CORDICO per calcolare i seni e i coseni. Potresti sentire persone dire che i computer usano la serie Taylor. Sembra ragionevole, ma non è vero. Gli algoritmi CORDIC sono molto più adatti a un'implementazione hardware efficiente . ( Software librerie possono utilizzare la serie Taylor, ad esempio su hardware che non supporta le funzioni trigonometriche.) Potrebbe esserci qualche elaborazione aggiuntiva, utilizzando l'algoritmo CORDIC per ottenere risposte abbastanza buone ma poi facendo qualcos'altro per migliorare la precisione.

Ci sono alcuni miglioramenti a quanto sopra. Ad esempio, per angoli molto piccoli theta (in radianti), sin (theta) = theta con tutta la precisione che hai, quindi è più efficiente restituire semplicemente theta piuttosto che usare qualche altro algoritmo. Quindi in pratica c'è molta logica del caso speciale per spremere tutte le prestazioni e la precisione possibili. I chip con mercati più piccoli potrebbero non essere coinvolti nello sforzo di ottimizzazione.


4
Ottima risposta - anche se CORDIC non necessita di una riduzione della portata di per sé (in effetti è essenzialmente un algoritmo di riduzione della portata a sé stante); funziona bene per angoli compresi tra -pi / 2 e + pi / 2, quindi devi solo eseguire una rotazione vettoriale di 180 gradi per angoli al di fuori di tale intervallo.
Jason S,

3
Le implementazioni che utilizzano un'approssimazione polinomiale possono spesso utilizzare le serie di Taylor, ma in genere dovrebbero utilizzare i coefficienti che sono stati determinati con l'algoritmo di Remez. lolengine.net/blog/2011/12/21/better-function-approximations
Pascal Cuoq

1
Si noti che la tabella dei valori utilizzata da CORDIC deve essere precalcolata. Quindi, Taylor potrebbe ancora essere utilizzato in "fase di compilazione".
Rabarbaro

2
Sembra che questa risposta contraddica la risposta accettata di alto livello a questa domanda simile: stackoverflow.com/questions/2284860/… . Questa risposta dice che la funzione sin () è per lo più implementata a livello di hardware, mentre l'altra dice in C.
Perry

48

modifica: Jack Ganssle ha una discreta discussione nel suo libro sui sistemi embedded, "The Firmware Handbook" .

FYI: se hai vincoli di precisione e prestazioni, le serie di Taylor non dovrebbero essere utilizzate per approssimare le funzioni a fini numerici. (Salvali per i tuoi corsi di calcolo.) Fanno uso del dell'analiticità di una funzione in un singolo punto , ad esempio il fatto che tutte le sue derivate esistono in quel punto. Non convergono necessariamente nell'intervallo di interesse. Spesso fanno un pessimo lavoro nel distribuire l'accuratezza dell'approssimazione della funzione per essere "perfette" proprio vicino al punto di valutazione; l'errore generalmente si ingrandisce verso l'alto man mano che ci si allontana. E se hai una funzione con qualsiasi derivata non continua (es. Onde quadre, onde triangolari e loro integrali), una serie di Taylor ti darà la risposta sbagliata.

La migliore soluzione "facile", quando si utilizza un polinomio di massimo grado N per approssimare una data funzione f (x) su un intervallo x0 <x <x1, è da Chebyshev ; vedi Ricette numeriche per una buona discussione. Nota che Tj (x) e Tk (x) nell'articolo di Wolfram a cui ho collegato utilizzavano il cos e il coseno inverso, questi sono polinomi e in pratica usi una formula di ricorrenza per ottenere i coefficienti. Di nuovo, vedi Ricette numeriche.

modifica: Wikipedia ha un articolo semi-decente sulla teoria dell'approssimazione . Una delle fonti che citano (Hart, "Computer Approximations") è esaurita (e le copie usate tendono ad essere costose) ma entra nei dettagli su cose come questa. (Jack Ganssle lo menziona nel numero 39 della sua newsletter The Embedded Muse .)

modifica 2: ecco alcune metriche di errore tangibili (vedi sotto) per Taylor vs.Chebyshev per sin (x). Alcuni punti importanti da notare:

  1. che l'errore massimo di un'approssimazione in serie di Taylor su un dato intervallo è molto maggiore dell'errore massimo di un'approssimazione di Chebyshev dello stesso grado. (Per circa lo stesso errore, puoi farla franca con un termine in meno con Chebyshev, il che significa prestazioni più veloci)
  2. La riduzione della portata è una grande vittoria. Questo perché il contributo dei polinomi di ordine superiore si riduce quando l'intervallo di approssimazione è minore.
  3. Se non riesci a farla franca con la riduzione della portata, i tuoi coefficienti devono essere memorizzati con maggiore precisione.

Non fraintendermi: la serie di Taylor funzionerà correttamente per seno / coseno (con una precisione ragionevole per l'intervallo da -pi / 2 a + pi / 2; tecnicamente, con termini sufficienti, puoi raggiungere qualsiasi precisione desiderata per tutti gli input reali, ma prova a calcolare cos (100) usando la serie di Taylor e non puoi farlo a meno che non usi l'aritmetica di precisione arbitraria). Se fossi bloccato su un'isola deserta con una calcolatrice non scientifica e avessi bisogno di calcolare seno e coseno, probabilmente userei le serie di Taylor poiché i coefficienti sono facili da ricordare. Ma le applicazioni del mondo reale per dover scrivere le proprie funzioni sin () o cos () sono abbastanza rare che sarebbe meglio utilizzare un'implementazione efficiente per raggiungere la precisione desiderata, cosa che la serie Taylor non è .

Intervallo = da -pi / 2 a + pi / 2, grado 5 (3 termini)

  • Taylor: errore max intorno 4.5E-3, f (x) = xx 3 /6 + x 5 /120
  • Chebyshev: errore massimo intorno a 7e-5, f (x) = 0.9996949x-0.1656700x 3 + 0.0075134x 5

Intervallo = da -pi / 2 a + pi / 2, grado 7 (4 termini)

  • Taylor: errore max circa 1.5e-4, f (x) = xx 3 /6 + x 5 /120 x 7 /5040
  • Chebyshev: errore massimo intorno a 6e-7, f (x) = 0.99999660x-0.16664824x 3 + 0.00830629x 5 -0.00018363x 7

Intervallo = da -pi / 4 a + pi / 4, grado 3 (2 termini)

  • Taylor: errore max intorno 2.5e-3, f (x) = xx 3 /6
  • Chebyshev: errore massimo intorno a 1.5e-4, f (x) = 0.999x-0.1603x 3

Intervallo = da -pi / 4 a + pi / 4, grado 5 (3 termini)

  • Taylor: errore max circa 3.5E-5, f (x) = xx 3 /6 + x 5
  • Chebyshev: errore massimo intorno a 6e-7, f (x) = 0.999995x-0.1666016x 3 + 0.0081215x 5

Intervallo = da -pi / 4 a + pi / 4, grado 7 (4 termini)

  • Taylor: errore max intorno 3e-7, f (x) = xx 3 /6 + x 5 /120 x 7 /5040
  • Chebyshev: errore massimo intorno a 1.2e-9, f (x) = 0.999999986x-0.166666367x 3 + 0.008331584x 5 -0.000194621x 7

2
Questo commento è sbagliato. C'è un tempo e un luogo per ogni approssimazione. Se non conosci abbastanza analisi per determinare la regione di convergenza per QUALSIASI approssimazione di serie, NON dovresti usarla. Questo vale per le serie Taylor, Chebyshev, Padé, ecc. Le serie di Taylor sono spesso abbastanza buone.
kquinn

4
: scrollata di spalle: non so voi ma non sono mai stato interessato a valutare una funzione in un piccolo quartiere intorno a un solo punto. Anche un rapido adattamento ai minimi quadrati su un intervallo è dannatamente facile da fare. Chiunque stia usando la serie Taylor sta perdendo il punto.
Jason S,

1
@kquinn: la regione di convergenza per le approssimazioni di Chebyshev non è un concetto utile poiché l'intervallo su cui vengono calcolate è un input esplicito al processo.
Jason S,

2
Upvoting perché il risponditore sapeva che Hart esiste. : smile: Hart è il classico riferimento qui, anche se era difficile da trovare quando ne acquistai una copia (in stampa) 25 anni fa. Vale ogni centesimo. La riduzione della portata, ove possibile, abbinata a un'approssimazione appropriata, sia Pade, Chebychev, persino le serie di Taylor a seconda dei casi, è un buon approccio. Le approssimazioni di Pade o Chebychev sono di solito la scelta migliore rispetto a una serie di Taylor.

3
??? In che modo è diverso? Le serie di Taylor fino al 17 ° grado per calcolare il peccato (x) da -2pi a + 2pi possono probabilmente essere battute da Chebyshev con un polinomio di 7 ° o 9 ° grado. Non avrei alcun problema a dichiarare: "Se hai vincoli di tempo quando abbatti gli alberi, non dovresti usare una sega a mano. Usa una motosega". Forse dovrei riformulare da "non dovrei" a qualcosa come "Non consiglierei di usare la serie Taylor". Certo, potresti usare la serie Taylor in alcuni casi, ma la tua precisione e le tue prestazioni saranno problematiche. Per prestazioni intendo il tempo di esecuzione della CPU.
Jason S

14

Credo che siano calcolati utilizzando Taylor Series o CORDIC . Alcune applicazioni che fanno un uso massiccio di funzioni trigonometriche (giochi, grafica) costruiscono tabelle trigonometriche all'avvio in modo che possano semplicemente cercare i valori piuttosto che ricalcolarli più e più volte.


6

Consulta l'articolo di Wikipedia sulle funzioni trigonometriche. Un buon posto per imparare a implementarli effettivamente nel codice è Numerical Recipes .

Non sono un gran matematico, ma la mia comprensione di dove sin, cos e tan "vengono da" è che sono, in un certo senso, osservati quando lavori con triangoli ad angolo retto. Se si misurano le lunghezze dei lati di un gruppo di triangoli ad angolo retto diversi e si tracciano i punti su un grafico, è possibile ricavarne sin, cos e tan. Come sottolinea Harper Shelby, le funzioni sono semplicemente definite come proprietà dei triangoli ad angolo retto.

Una comprensione più sofisticata si ottiene comprendendo come questi rapporti si relazionano alla geometria del cerchio, che porta ai radianti ea tutta quella bontà. È tutto lì nella voce di Wikipedia.


1

Più comunemente per i computer, la rappresentazione delle serie di potenze viene utilizzata per calcolare seno e coseno e questi vengono utilizzati per altre funzioni trigonometriche. L'espansione di queste serie a circa 8 termini calcola i valori necessari per una precisione vicina all'epsilon della macchina (il più piccolo numero in virgola mobile diverso da zero che può essere mantenuto).

Il metodo CORDIC è più veloce poiché è implementato su hardware, ma viene utilizzato principalmente per sistemi embedded e non per computer standard.


0

Vorrei estendere la risposta fornita da @Jason S. Utilizzando un metodo di suddivisione del dominio simile a quello descritto da @Jason S e utilizzando le approssimazioni della serie di Maclaurin, una velocità media (2-3) X su tan (), sin () Le funzioni, cos (), atan (), asin () e acos () integrate nel compilatore gcc con l'ottimizzazione -O3 sono state ottenute. Le migliori funzioni di approssimazione della serie Maclaurin descritte di seguito hanno ottenuto una precisione doppia.

Per le funzioni tan (), sin () e cos () e, per semplicità, un dominio sovrapposto da 0 a 2 pi + pi / 80 è stato diviso in 81 intervalli uguali con "punti di ancoraggio" a pi / 80, 3 pi / 80, ..., 161pi / 80. Quindi tan (), sin () e cos () di questi 81 punti di ancoraggio sono stati valutati e memorizzati. Con l'aiuto delle identità trigonometriche, è stata sviluppata un'unica funzione della serie Maclaurin per ciascuna funzione trigonometrica. Qualsiasi angolo compreso tra ± infinito può essere sottoposto alle funzioni di approssimazione trigonometrica perché le funzioni prima traducono l'angolo di input nel dominio da 0 a 2pi. Questo overhead di traduzione è incluso nel overhead di approssimazione.

Metodi simili sono stati sviluppati per le funzioni atan (), asin () e acos (), dove un dominio da -1,0 a 1,1 sovrapposto è stato diviso in 21 intervalli uguali con punti di ancoraggio a -19/20, -17/20, .. ., 19/20, 21/20. Quindi è stato memorizzato solo atan () di questi 21 punti di ancoraggio. Ancora una volta, con l'aiuto delle identità trigonometriche inverse, è stata sviluppata una singola funzione della serie di Maclaurin per la funzione atan (). I risultati della funzione atan () sono stati quindi utilizzati per approssimare asin () e acos ().

Poiché tutte le funzioni di approssimazione trigonometrica inversa sono basate sulla funzione di approssimazione atan (), è consentito qualsiasi valore di input di argomento a doppia precisione. Tuttavia, l'input dell'argomento per le funzioni di approssimazione asin () e acos () viene troncato al dominio ± 1 perché qualsiasi valore al di fuori di esso è privo di significato.

Per testare le funzioni di approssimazione, è stato costretto a valutare un miliardo di valutazioni di funzioni casuali (ovvero, al compilatore di ottimizzazione -O3 non è stato permesso di ignorare la valutazione di qualcosa perché alcuni risultati calcolati non sarebbero stati utilizzati.) Per rimuovere il bias di valutare un miliardo numeri casuali e l'elaborazione dei risultati, è stato eseguito per primo il costo di una corsa senza valutare alcuna funzione trigonometrica o inversa. Questo bias è stato quindi sottratto da ogni test per ottenere un'approssimazione più rappresentativa del tempo di valutazione della funzione effettiva.

Tabella 2. Tempo impiegato in secondi per eseguire la funzione o le funzioni indicate un miliardo di volte. Le stime si ottengono sottraendo il costo in termini di tempo per la valutazione di un miliardo di numeri casuali mostrato nella prima riga della Tabella 1 dalle righe rimanenti nella Tabella 1.

Tempo trascorso in abbronzatura (): 18.0515 18.2545

Tempo trascorso in TAN3 (): 5.93853 6.02349

Tempo trascorso in TAN4 (): 6.72216 6.99134

Tempo trascorso in sin () e cos (): 19.4052 19.4311

Tempo trascorso in SINCOS3 (): 7.85564 7.92844

Tempo trascorso in SINCOS4 (): 9.36672 9.57946

Tempo trascorso in atan (): 15.7160 15.6599

Tempo trascorso in ATAN1 (): 6.47800 6.55230

Tempo trascorso in ATAN2 (): 7.26730 7.24885

Tempo trascorso in ATAN3 (): 8.15299 8.21284

Tempo trascorso in asin () e acos (): 36.8833 36.9496

Tempo trascorso in ASINCOS1 (): 10.1655 9.78479

Tempo trascorso in ASINCOS2 (): 10.6236 10.6000

Tempo trascorso in ASINCOS3 (): 12.8430 12.0707

(Nell'interesse del risparmio di spazio, la tabella 1 non è mostrata). La tabella 2 mostra i risultati di due cicli separati di un miliardo di valutazioni di ciascuna funzione di approssimazione. La prima colonna è la prima esecuzione e la seconda colonna è la seconda esecuzione. I numeri "1", "2", "3" o "4" nei nomi delle funzioni indicano il numero di termini utilizzati nella funzione della serie di Maclaurin per valutare l'approssimazione di trigonometria particolare o inversa. SINCOS # () significa che sia sin che cos sono stati valutati allo stesso tempo. Allo stesso modo, ASINCOS # () significa che sia asin che acos sono stati valutati allo stesso tempo. C'è un piccolo sovraccarico aggiuntivo nella valutazione simultanea di entrambe le quantità.

I risultati mostrano che l'aumento del numero di termini aumenta leggermente il tempo di esecuzione come ci si aspetterebbe. Anche il più piccolo numero di termini dava ovunque una precisione di circa 12-14 cifre tranne che per l'approssimazione tan () vicino a dove il suo valore si avvicina a ± infinito. Ci si aspetterebbe che anche la funzione tan () abbia problemi lì.

Risultati simili sono stati ottenuti su un laptop MacBook Pro di fascia alta in Unix e su un computer desktop di fascia alta in Linux.


-5

Se stai chiedendo una spiegazione più fisica del peccato, del cos e dell'abbronzatura considera come si relazionano ai triangoli ad angolo retto. Il valore numerico effettivo di cos (lambda) può essere trovato formando un triangolo ad angolo retto con uno degli angoli lambda e dividendo la lunghezza del lato dei triangoli adiacente a lambda per la lunghezza dell'ipotenusa. Allo stesso modo per il peccato usa il lato opposto diviso per l'ipotenusa. Per la tangente utilizzare il lato opposto diviso per il lato adiacente. Il classico memonico per ricordare questo è SOHCAHTOA (pronunciato socatoa).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.