Jak działają funkcje trygonometryczne?

Więc w szkole średniej matematyki, a prawdopodobnie college, uczymy się jak używać funkcji Tryg, co robią i jakie problemy rozwiązują. Ale zawsze przedstawiano mi je jako czarną skrzynkę. Jeśli potrzebujesz sinus lub Cosinus czegoś, naciśnij przycisk sin lub cos na kalkulatorze i jesteś ustawiony. Co jest w porządku.

Zastanawiam się, jak funkcje trygonometryczne są zazwyczaj implementowane.

Author: Eric Wilson, 2008-12-05

6 answers

Najpierw musisz zrobić jakąś redukcję zasięgu. Funkcje Tryg są okresowe, więc musisz zredukować argumenty do standardowego interwału. Na początek możesz zmniejszyć kąty do 0-360 stopni. Ale używając kilku tożsamości, zdajesz sobie sprawę, że możesz przetrwać z mniejszą ilością. Jeśli obliczysz sinusy i cosines dla kątów od 0 do 45 stopni, możesz rozpocząć obliczanie wszystkich funkcji Tryg dla wszystkich kątów.

Gdy już zmniejszysz swój argument, większość układy wykorzystują algorytm CORDIC do obliczania sinusów i cosinusów. Możesz usłyszeć, że ludzie mówią, że komputery używają serii Taylora. Brzmi rozsądnie, ale to nieprawda. Algorytmy CORDIC są znacznie lepiej dostosowane do wydajnej implementacji sprzętowej . (Oprogramowanie biblioteki mogą używać szeregów Taylora, powiedzmy na sprzęcie, który nie obsługuje funkcji Tryg.) Może być jakieś dodatkowe przetwarzanie, używając algorytmu CORDIC, aby uzyskać dość dobre odpowiedzi, ale potem robi coś inaczej, aby poprawić dokładność.

Istnieje kilka udoskonaleń do powyższego. Na przykład, dla bardzo małych kątów theta (w radianach), sin (theta) = theta z całą dokładnością, więc bardziej wydajne jest po prostu zwrócenie theta niż użycie innego algorytmu. Tak więc w praktyce istnieje wiele specjalnej logiki przypadków, aby wycisnąć całą możliwą wydajność i dokładność. Żetony na mniejszych rynkach mogą nie iść do tak dużo wysiłku optymalizacji.

 136
Author: John D. Cook,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-05 21:09:58

Edit: Jack Ganssle ma przyzwoitą dyskusję w swojej książce o systemach wbudowanych, "The Firmware Handbook" .

FYI: jeśli masz ograniczenia dokładności i wydajności, szereg Taylora powinien Nie być używany do przybliżania funkcji do celów numerycznych. (Zapisz je na kursy rachunku.) Wykorzystują analityczność funkcji w jednym punkcie , np. fakt, że w tym punkcie istnieją wszystkie jej pochodne. Niekoniecznie zbiegają się w interwał zainteresowania. Często robią kiepską robotę rozkładając dokładność aproksymacji funkcji, aby była "doskonała" tuż przy punkcie oceny; błąd zazwyczaj powiększa się w górę, gdy od niego uciekasz. A jeśli masz funkcję z dowolną pochodną nieciągłą (np. fale kwadratowe, fale trójkątne i ich całki), seria Taylora da ci błędną odpowiedź.

Najlepsze "łatwe" rozwiązanie, przy użyciu wielomianu o maksymalnym stopniu n do przybliżenia danego funkcja f (x) w przedziale x0 przybliżenia Czebyszewa ; Zobacz Numeryczne Przepisy dla dobrej dyskusji. Zauważ, że TJ(x) i Tk (x) w artykule Wolframa, do którego podlinkowałem, użyły cos I cosinusa odwrotnego, są to wielomiany i w praktyce używasz wzoru powtarzania, aby uzyskać współczynniki. Ponownie patrz przepisy liczbowe.

Edit: Wikipedia ma pół przyzwoity artykuł na temat teorii aproksymacji . Jednym ze źródeł, które przytaczają (Hart, " komputer Approximations") jest niedostępny (i używane kopie wydają się być drogie), ale zawiera wiele szczegółów na temat takich rzeczy. (Jack Ganssle wspomina o tym w numerze 39 swojego biuletynu The Embedded Muse .)

Edit 2: Oto kilka namacalnych wskaźników błędów (patrz poniżej) dla Taylor vs. Chebyshev dla sin (x). Niektóre ważne punkty do odnotowania:

  1. że maksymalny błąd przybliżenia szeregów Taylora w danym zakresie jest znacznie większy niż maksymalny błąd Czebyszewa przybliżenie tego samego stopnia. (Dla mniej więcej tego samego błędu można ujść o jeden termin mniej z Czebyszewem, co oznacza szybszą wydajność)
  2. Redukcja zasięgu to ogromna wygrana. Wynika to z faktu, że udział wielomianów wyższego rzędu zmniejsza się, gdy przedział aproksymacji jest mniejszy.
  3. Jeśli nie możesz uciec od redukcji zakresu, Twoje współczynniki muszą być przechowywane z większą precyzją.

Nie zrozum mnie źle: Seria Taylora będzie działać poprawnie dla Sinus / Cosinus (z rozsądną precyzją dla zakresu-pi/2 do +pi/2; technicznie, z wystarczającą ilością terminów, można osiągnąć dowolną wymaganą precyzję dla wszystkich rzeczywistych wejść, ale spróbuj obliczyć cos (100) używając szeregów Taylora i nie możesz tego zrobić, chyba że użyjesz arytmetyki o arbitralnej precyzji). Gdybym utknął na bezludnej wyspie z niesnaukowym kalkulatorem, i potrzebowałbym obliczyć sinus i cosinus, prawdopodobnie użyłbym serii Taylora, ponieważ współczynniki są łatwe do zapamiętania. Ale prawdziwy świat aplikacje do pisania własnych funkcji sin() lub cos () są na tyle rzadkie, że najlepiej byłoby użyć wydajnej implementacji, aby osiągnąć pożądaną dokładność-której szereg Taylora to , a nie.

Zakres = - pi / 2 do +pi / 2, stopień 5 (3 terminy)

  • Taylor: max błąd około 4.5 e-3, f (x) = x-x3/6+x5/120
  • Czebyszew: max błąd wokół 7e-5, f (x) = 0.9996949 x-0.1656700 x3+0.0075134 x5

Zakres = - pi / 2 do +pi / 2, stopień 7 (4 terminy)

  • Taylor: max błąd około 1.5 e-4, f (x) = x-x3/6+x5/120-x7/5040
  • Czebyszew: max błąd wokół 6e-7, f (x) = 0.99999660 x-0.16664824 x3+0.00830629 x5-0.00018363 x7

Zakres = - pi / 4 do +pi / 4, stopień 3 (2 terminy)

  • Taylor: max błąd około 2.5 e-3, f (x) = x-x3/6
  • Chebyshev: max błąd wokół 1.5 e-4, f (x) = 0.999 x-0.1603 x 3

Zakres = - pi / 4 do +pi / 4, stopień 5 (3 terminy)

  • Taylor: max błąd około 3.5 e-5, f (x) = x-x3/6+x5
  • Czebyszew: max błąd wokół 6e-7, f (x) = 0.999995 x-0.1666016 x3+0.0081215 x5

Zakres = - pi / 4 do +pi / 4, stopień 7 (4 terminy)

  • Taylor: max błąd około 3e-7, f (x) = x-x3/6+x5/120-x7/5040
  • Czebyszew: max błąd wokół 1.2 e-9, f (x) = 0.999999986 x-0.166666367 x3+0.008331584 x5-0.000194621 x7
 45
Author: Jason S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-09 21:08:22

Myślę, że są one obliczane za pomocą szereg Taylora lub CORDIC . Niektóre aplikacje, które intensywnie wykorzystują funkcje trywialne (gry, grafika), konstruują tabele trywialne po uruchomieniu, dzięki czemu mogą po prostu wyszukać wartości, a nie przeliczać je w kółko.

 14
Author: Jon Galloway,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-05 20:58:33

Sprawdź Artykuł w Wikipedii na temat funkcji Tryg. Dobrym miejscem do zapoznania się z rzeczywistą implementacją ich w kodzie są Numeryczne receptury .

Nie jestem zbytnio matematykiem, ale moje zrozumienie, skąd "sin, cos I tan" pochodzą, jest takie, że są one w pewnym sensie obserwowane, gdy pracujesz z trójkątami kątowymi. Jeśli weźmiesz pomiary długości boków kilku różnych trójkątów kątowych i wykreślisz punkty na wykresie, możesz uzyskać sin, Bo, I tan z tego. Jak wskazuje Harper Shelby, funkcje są po prostu zdefiniowane jako właściwości trójkątów kątowych.

Bardziej wyrafinowane zrozumienie uzyskuje się poprzez zrozumienie, w jaki sposób te współczynniki odnoszą się do geometrii okręgu, co prowadzi do radianów i całej tej dobroci. Wszystko jest we wpisie w Wikipedii.

 6
Author: Parappa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-05 21:03:52

Najczęściej dla komputerów, reprezentacja szeregów mocy jest używana do obliczania sinusów i cosinusów, a te są używane dla innych funkcji Tryg. Rozszerzenie tych szeregów na około 8 terminów oblicza wartości potrzebne z dokładnością zbliżoną do maszyny epsilon (najmniejsza niezerowa Liczba zmiennoprzecinkowa, która może być przechowywana).

Metoda CORDIC jest szybsza, ponieważ jest zaimplementowana na sprzęcie, ale jest używana głównie w systemach wbudowanych, a nie standardowych komputerach.

 1
Author: Joshua Howard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-19 03:51:54

Jeśli prosisz o bardziej fizyczne Wyjaśnienie grzechu, cos I tan zastanów się, w jaki sposób odnoszą się one do trójkątów kątowych. Rzeczywistą wartość liczbową cos (lambda) można znaleźć, tworząc trójkąt prostokątny z jednym z kątów lambda i dzieląc długość trójkąta bocznego przylegającego do lambda przez długość przeciwprostokątnej. Podobnie dla grzechu użyj przeciwnej strony podzielonej przez przeciwprostokątną. Dla stycznej użyj przeciwnej strony podzielonej przez sąsiednią stronę. Klasyka memonic to remember this is SOHCAHTOA (wymawiane socatoa).

 -5
Author: jeffD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-29 06:09:26