Come funzionano le funzioni trigonometriche?

Quindi nella matematica delle scuole superiori, e probabilmente all’università, ci viene insegnato come usare le funzioni trigonometriche, cosa fanno e quali tipi di problemi risolvono. Ma loro mi sono sempre stati presentati come una scatola nera. Se hai bisogno del seno o del coseno di qualcosa, premi il tasto sin o cos sulla calcolatrice e sei pronto. Che va bene

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

Innanzitutto, devi fare una sorta di riduzione del raggio d’azione. Le funzioni di Trig sono periodiche, quindi è necessario ridurre gli argomenti fino a un intervallo standard. Per i principianti, è ansible ridurre gli angoli tra 0 e 360 ​​gradi. Ma usando alcune identity framework, ti rendi conto che potresti cavarcanvas con meno. Se si calcolano seni e coseni per angoli tra 0 e 45 gradi, è ansible eseguire il bootstrap per calcolare tutte le funzioni trigonometriche per tutti gli angoli.

Una volta ridotto l’argomento, la maggior parte dei chip utilizza un algoritmo CORDIC per calcolare i seni e i coseni. Potresti sentire le persone dire che i computer usano la serie di Taylor. Sembra ragionevole, ma non è vero. Gli algoritmi CORDIC sono molto più adatti all’implementazione hardware efficiente. ( Le librerie software possono utilizzare la serie di Taylor, ad esempio su hardware che non supporta le funzioni trigonometriche.) Potrebbero esserci ulteriori elaborazioni, usando l’algoritmo CORDIC per ottenere risposte abbastanza buone ma poi fare qualcos’altro per migliorare la precisione.

Ci sono alcuni perfezionamenti a quanto sopra. Ad esempio, per angoli molto piccoli theta (in radianti), sin (theta) = theta per tutta la precisione che hai, quindi è più efficiente restituire semplicemente theta piuttosto che usare un altro algoritmo. Quindi in pratica c’è un sacco di logiche di casi speciali per spremere tutte le prestazioni e la precisione possibili. I chip con mercati più piccoli potrebbero non andare allo stesso sforzo di ottimizzazione.

modifica: Jack Ganssle ha una discussione decente nel suo libro sui sistemi embedded, “The Firmware Handbook” .

Nota: se si dispone di vincoli di accuratezza e prestazioni, le serie di Taylor non devono essere utilizzate per approssimare le funzioni a fini numerici. (Salvali per i tuoi corsi di Calcolo.) Usano l’ analiticità di una funzione in un singolo punto , ad esempio il fatto che tutti i suoi derivati ​​esistono in quel punto. Non convergono necessariamente nell’intervallo di interesse. Spesso fanno un pessimo compito di distribuire l’accuratezza della approssimazione della funzione per essere “perfetti” proprio vicino al punto di valutazione; l’errore generalmente zooma verso l’alto man mano che ci si allontana da esso. 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 usa un polinomio di massimo grado N per approssimare una data funzione f (x) su un intervallo x0

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 in molti dettagli su cose come questa. (Jack Ganssle menziona questo nel numero 39 della sua newsletter The Embedded Muse .)

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

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

Non fraintendetemi: la serie Taylor funzionerà correttamente per seno / coseno (con una ragionevole precisione per l’intervallo da -pi / 2 a + pi / 2, tecnicamente, con termini sufficienti, è ansible raggiungere qualsiasi precisione desiderata per tutti gli ingressi 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 stato bloccato su un’isola deserta con un calcolatore non scientifico 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 rari che sarebbe meglio usare un’implementazione efficiente per raggiungere l’accuratezza desiderata, che non è la serie di Taylor.

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

  • Taylor: errore massimo intorno a 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 = -pi / 2 a + pi / 2, grado 7 (4 termini)

  • Taylor: errore massimo intorno a 1.5e-4, f (x) = xx 3/6 + x 5 /120-x 7/5040
  • Chebyshev: errore massimo intorno a 6e-7, f (x) = 0,9999660x-0,16664824x 3 + 0,00830629x 5 -0,00018363x 7

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

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

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

  • Taylor: errore massimo intorno a 3.5e-5, f (x) = xx 3/6 + x 5
  • Chebyshev: errore massimo intorno a 6e-7, f (x) = 0,99995x-0,1666016x 3 + 0,0081215x 5

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

  • Taylor: errore massimo intorno a 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

Credo che siano stati calcolati usando Taylor Series o CORDIC . Alcune applicazioni che fanno un uso pesante delle funzioni trigonometriche (giochi, grafica) costruiscono tabelle trigonometro all’avvio, in modo che possano semplicemente cercare i valori piuttosto che ricalcolarli più e più volte.

Controlla l’articolo di Wikipedia sulle funzioni trigonometriche. Un buon posto per imparare a metterli in pratica nel codice è Ricette numeriche .

Non sono molto matematico, ma la mia comprensione di dove il peccato, il cos e l’abbronzatura “provengono” è che essi sono, in un certo senso, osservati quando si lavora con triangoli ad angolo retto. Se si misurano le lunghezze dei lati di un gruppo di triangoli rettangolari diversi e si tracciano i punti su un grafico, si può ottenere il peccato, il cos e l’abbronzatura. 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 riferiscono alla geometria del cerchio, che conduce ai radianti ea tutta quella bontà. È tutto lì nella voce di Wikipedia.

Più comunemente per i computer, la rappresentazione delle serie di potenza viene utilizzata per calcolare seni e coseni e questi vengono utilizzati per altre funzioni trigonometriche. L’espansione di queste serie fino a circa 8 termini calcola i valori necessari per una precisione vicino al epsilon della macchina (il più piccolo numero in virgola mobile non zero che può essere tenuto).

Il metodo CORDIC è più veloce poiché è implementato sull’hardware, ma viene principalmente utilizzato per i sistemi incorporati e non per i computer standard.

Se chiedi una spiegazione più fisica del peccato, del cos e dell’abbronzatura, considera come si relazionano con i 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. Analogamente per il peccato usa il lato opposto diviso per l’ipotenusa. Per uso tangente il lato opposto diviso per il lato adiacente. Il memonico classico da ricordare è SOHCAHTOA (pronunciato socatoa).