Як працюють тригонометричні функції?


102

Тож у середній школі з математики та, ймовірно, у коледжі нас навчають, як використовувати функції тригерів, що вони роблять та які проблеми вирішують. Але вони мені завжди подавалися як чорна скринька. Якщо вам потрібен синус або косинус чогось, ви натискаєте кнопку гріх чи соро на своєму калькуляторі, і ви налаштовані. Що добре.

Мені цікаво, як типово реалізуються тригонометричні функції.


Ви плутаєтесь, що таке триггерні функції чи як вони реалізуються?
Кайл Кронін

15
Я знаю, які вони. Я знаю, що вони роблять. Я знаю, як визначити, що мені потрібно з якою метою. Я можу вам розповісти все про співвідношення між кутами та відстанями. Те, що я шукав, більше відповідало відповіді Джона Д. Кука. І всі, хто згадав фактичні алгоритми
Jurassic_C

Це гарне запитання. Наприклад, синус, косинус і дотична - це трансцендентні функції, і їх важко вирішити ... З іншого боку, їх можна визначити, використовуючи просте розширення серії Тейлора, яке дасть правильну відповідь до будь-якої обмеженої ступеня точності вимагається.
Олексій

Відповіді:


144

По-перше, ви повинні зробити якесь скорочення діапазону. Функції Trig періодичні, тому вам потрібно зменшити аргументи до стандартного інтервалу. Для початку ви можете зменшити кути між 0 і 360 градусами. Але, скориставшись декількома особами, ти зрозумієш, що ти можеш обійтись менше. Якщо ви обчислюєте синуси та косинуси для кутів між 0 і 45 градусами, ви можете завантажувати свій шлях до обчислення всіх триггерних функцій для всіх кутів.

Після того як ви зменшили аргумент, більшість чіпів використовують алгоритм CORDIC для обчислення синусів та косинусів. Ви можете почути, як люди кажуть, що комп’ютери використовують серію Тейлор. Це звучить розумно, але це неправда. Алгоритми CORDIC набагато краще підходять для ефективної апаратної реалізації. ( Бібліотеки програмного забезпечення можуть використовувати серію Taylor, скажімо, про обладнання, яке не підтримує функції триггеру.) Можливо, буде додаткова обробка, використовуючи алгоритм CORDIC, щоб отримати досить хороші відповіді, але потім зробити щось інше для підвищення точності.

Існує кілька уточнень до вищезазначеного. Наприклад, для дуже малих кутів theta (в радіанах), sin (theta) = theta з усією точністю, яку ви маєте, тому ефективніше просто повернути тету, ніж використовувати якийсь інший алгоритм. Тож на практиці існує маса особливих логік випадку, щоб видавити всі можливі показники та точність. Чіпи з меншими ринками можуть не докласти великих зусиль з оптимізації.


4
Чудова відповідь - хоча CORDIC насправді не потребує зменшення діапазону як такої (адже це, власне, алгоритм зменшення діапазону); він чудово працює для кутів між -pi / 2 та + pi / 2, тому вам просто потрібно здійснити поворот вектора на 180 градусів для кутів поза цим діапазоном.
Jason S

3
Реалізації, які використовують поліноміальне наближення, часто можуть використовувати ряд Тейлора, але вони, як правило, повинні використовувати коефіцієнти, визначені алгоритмом Remez. lolengine.net/blog/2011/12/21/better-function-approximations
Паскаль Куок

1
Зауважте, що таблицю значень, використану CORDIC, слід попередньо обчислити. Отже, Тейлор все ще може бути використаний у "час компіляції".
Ревінь

2
Схоже, що ця відповідь суперечить високо оціненій прийнятій відповіді на подібне запитання: stackoverflow.com/questions/2284860/… . Ця відповідь говорить про те, що функція sin () здебільшого реалізовується на апаратному рівні, тоді як інша говорить у C.
Perry

48

редагувати: Джек Гансл гідно обговорив у своїй книзі про вбудовані системи "Посібник з прошивкою" .

FYI: Якщо у вас є обмеження точності та продуктивності, серії Taylor не слід використовувати для наближення функцій для числових цілей. (Збережіть їх для курсів обчислення.) Вони використовують аналітичність функції в одній точці , наприклад, факт існування всіх її похідних у цій точці. Вони не обов'язково сходяться в інтервалі інтересів. Часто вони виконують хитру роботу з розподілу точності наближення функції, щоб бути "ідеальним" прямо біля точки оцінки; помилка, як правило, збільшується вгору, коли ви відходите від неї. І якщо у вас є функція з будь-яким безперервним похідним (наприклад, квадратними хвилями, трикутними хвилями та їх інтегралами), ряд Тейлора дасть вам неправильну відповідь.

Найкраще "легке" рішення при використанні многочлена максимального ступеня N для наближення заданої функції f (x) протягом інтервалу x0 <x <x1 - це наближення Чебишева ; див. числові рецепти для гарного обговорення. Зауважимо, що Tj (x) і Tk (x) у статті Вольфрама, яку я пов’язував із використовуваним cos і зворотним косинусом, це поліноми і на практиці ви використовуєте формулу рецидиву для отримання коефіцієнтів. Знову див. Числові рецепти.

редагувати: У Вікіпедії є напівпристойна стаття про теорію наближення . Одне з джерел, яке вони цитують (Харт, "Комп'ютерні наближення"), не надруковано (і використані копії, як правило, коштують дорого), але детально описують подібні речі. (Джек Гансл згадує про це у випуску 39 свого бюлетеня "Вбудована муза" .)

редагувати 2: Ось деякі відчутні показники помилок (див. нижче) для Тейлора проти Чебишева за гріх (х). Деякі важливі моменти, які слід зазначити:

  1. що максимальна похибка наближення ряду Тейлора в заданому діапазоні набагато більша, ніж максимальна похибка наближення Чебишева того ж ступеня. (Приблизно за тією ж помилкою ви можете піти з одним меншим терміном з Чебишевим, що означає більш швидку продуктивність)
  2. Скорочення дальності - це величезна виграш. Це тому, що внесок поліномів вищого порядку скорочується, коли інтервал наближення менший.
  3. Якщо ви не можете уникнути зменшення дальності, ваші коефіцієнти потрібно зберігати з більшою точністю.

Не зрозумійте мене неправильно: серія Тейлора буде працювати належним чином для синуса / косинуса (з розумною точністю для діапазону від -pi / 2 до + pi / 2; технічно, за достатньої кількості термінів, ви можете досягти будь-якої бажаної точності для всіх реальних даних, але спробуйте обчислити cos (100), використовуючи ряд Тейлора, і ви не можете цього зробити, якщо ви не використовуєте арифметику довільної точності). Якби я застряг на безлюдному острові з ненауковим калькулятором, і мені потрібно було обчислити синус і косинус, я, мабуть, використовував би ряд Тейлора, оскільки коефіцієнти легко запам'ятовуються. Але реальні додатки для написання власних функцій sin () або cos () досить рідкісні, що вам найкраще використовувати ефективну реалізацію, щоб досягти бажаної точності - чого серія Тейлора не є .

Діапазон = -pi / 2 до + pi / 2, ступінь 5 (3 терміни)

  • Тейлор: макс помилка навколо 4.5e-3, F (X) = хх 3 /6 + х 5 /120
  • Чебишев: максимальна похибка близько 7e-5, f (x) = 0,9996949x-0,1656700x 3 + 0,0075134x 5

Діапазон = -pi / 2 до + pi / 2, ступінь 7 (4 терміни)

  • Тейлор: макс помилка навколо 1.5e-4, F (X) = хх 3 /6 + х 5 /120-х 7 /5040
  • Чебишев: максимальна похибка близько 6e-7, f (x) = 0,99999660x-0,16664824x 3 + 0,00830629x 5 -0,00018363x 7

Діапазон = -pi / 4 до + pi / 4, ступінь 3 (2 терміни)

  • Тейлор: макс помилка навколо 2.5E-3, F (X) = хх 3 /6
  • Чебишев: максимальна похибка близько 1,5e-4, f (x) = 0,999x-0,1603x 3

Діапазон = -pi / 4 до + pi / 4, ступінь 5 (3 терміни)

  • Тейлор: макс помилка навколо 3.5E-5, F (X) = хх 3 /6 + х 5
  • Чебишев: максимальна похибка навколо 6e-7, f (x) = 0,999995x-0,1666016x 3 + 0,0081215x 5

Діапазон = -pi / 4 до + pi / 4, ступінь 7 (4 терміни)

  • Тейлор: макс помилка навколо ого-7, F (X) = хе 3 /6 + х 5 /120-х 7 /5040
  • Чебишев: максимальна похибка близько 1,2e-9, f (x) = 0,999999986x-0,166666367x 3 + 0,008331584x 5 -0,000194621x 7

2
Цей коментар невірний. Для кожного наближення є час і місце. Якщо ви не знаєте достатнього аналізу для визначення області конвергенції для наближення будь-якого ряду, НЕ слід використовувати його. Це стосується серій Тейлор, Чебишев, Паде тощо. Серії Тейлора часто хороші.
kquinn

4
: shrug: Я не знаю про вас, але мені ніколи не було цікаво оцінювати функцію в невеликому мікрорайоні, що займає лише один момент. Навіть швидкі найменші квадрати, розміщені за інтервал, досить чортово легко зробити. Той, хто використовує серію Тейлор, просто не вистачає сенсу.
Jason S

1
@kquinn: область конвергенції для наближень Чебишева не є корисною концепцією, оскільки інтервал, протягом якого вони обчислюються, є явним входом у процес.
Jason S

2
Оголошення, оскільки відповідач знав, що Харт існує. : smile: Харт - це класична довідка, навіть якщо це було важко знайти, коли я купив копію (друком) 25 років тому. Варто кожної копійки. Скорочення діапазону, де це можливо, у поєднанні з відповідним наближенням - будь то серія Пайд, Чебичев, навіть Тейлор, якщо це доречно, є хорошим підходом. Наближення Пайда чи Чебичева зазвичай є кращим вибором для серії Тейлора.

3
??? Чим це відрізняється? Серія Тейлора з 17-го ступеня для обчислення sin (x) від -2pi до + 2pi може бути переможена Чебишевим з поліномом 7-го або 9-го ступеня. У мене не виникне жодних проблем із висловленням заяви: "Якщо у вас є обмеження в часі при вирубанні дерев, не слід використовувати ручну пилу. Використовуйте бензопилу". Можливо, я повинен переробити слово з "не слід" на щось на кшталт "я б не рекомендував використовувати серію" Тейлор ". Звичайно, ви можете використовувати серію Taylor в деяких випадках, але ваша точність та продуктивність будуть проблематичними. Під продуктивністю я маю на увазі час виконання процесора.
Джейсон S

14

Я вважаю, що вони розраховані за допомогою серії Taylor або CORDIC . Деякі додатки, які активно використовують триггерні функції (ігри, графіка), створюють тригерні таблиці при їх запуску, щоб вони могли просто шукати значення, а не перераховувати їх знову і знову.


6

Перегляньте статтю Вікіпедії про функції триггеру. Хорошим місцем для того, щоб дізнатись про те, як насправді реалізувати їх у коді, - Числові рецепти .

Я не дуже математик, але моє розуміння того, звідки "походять гріх, cos і загар", полягає в тому, що вони, в деякому сенсі, спостерігаються під час роботи з прямокутними трикутниками. Якщо взяти вимірювання довжин сторін згустку різних прямокутних трикутників і побудувати точки на графіку, ви можете отримати гріх, cos і загар. Як вказує Харпер Шелбі, функції просто визначаються як властивості прямокутних трикутників.

Більш складне розуміння досягається розумінням того, як ці співвідношення співвідносяться з геометрією кола, що призводить до радіанів і всього цього добра. Це все є у записі Вікіпедії.


1

Найчастіше для комп'ютерів представлення рядів потужності використовується для обчислення синусів і косинусів, і вони використовуються для інших функцій триггеру. Розширюючи ці серії на приблизно 8 доданків, обчислюються необхідні значення для точності, близької до епсилону машини (найменший ненульовий номер з плаваючою точкою, який можна утримувати).

Метод CORDIC є більш швидким, оскільки він реалізований на апаратному забезпеченні, але в основному він використовується для вбудованих систем, а не для стандартних комп'ютерів.


0

Я хотів би розширити відповідь, надану @Jason S. Використовуючи метод підрозділу домену, аналогічний описаному @Jason S та використовуючи наближення ряду Maclaurin, середнє (2-3) прискорення X через tan (), sin () , досягнуто функцій cos (), atan (), asin () та acos (), вбудованих у компілятор gcc з оптимізацією -O3. Найкращі описані нижче функції Maclaurin з наближенням досягали подвійної точності.

Для функцій tan (), sin () та cos (), а для простоти домен, що перекривається 0 до 2pi + pi / 80, ділився на 81 рівний інтервал з "точками прив'язки" в pi / 80, 3pi / 80, ..., 161пі / 80. Тоді tan (), sin () і cos () з цих 81 опорних точок були оцінені та збережені. За допомогою ідентифікацій тригерів була розроблена єдина функція серії Maclaurin для кожної функції триггера. Будь-який кут між ± нескінченністю може бути поданий до функцій наближення трійки, оскільки функції спочатку переводять кут введення в область 0 до 2пі. Цей переклад накладних витрат включений у наближення накладних витрат.

Аналогічні методи були розроблені для функцій atan (), asin () та acos (), де домен, що перекривається від -1,0 до 1,1, був розділений на 21 рівний інтервал з точками прив’язки при -19/20, -17/20, .. ., 19/20, 21/20. Тоді зберігався лише atan () з цих 21 опорних точок. Знову ж таки, за допомогою зворотних тотожних ідентичностей була розроблена єдина функція серії Маклауріна для функції atan (). Результати функції atan () потім використовувались для апроксимації asin () та acos ().

Оскільки всі функції зворотного наближення триггеру базуються на функції наближення atan (), будь-яке вхідне значення аргументу подвійної точності допускається. Однак введення аргументів для функцій апроксимування asin () та acos () прирізається до області ± 1, оскільки будь-яке значення поза ним є безглуздим.

Для перевірки апроксимуючих функцій мільярд оцінок випадкових функцій були змушені оцінювати (тобто компілятору оптимізації -O3 не було дозволено обходити щось оцінювання, оскільки якийсь обчислений результат не буде використаний.) Щоб усунути упередженість оцінки мільярда випадкових чисел та обробки результатів, вартість пробігу без оцінки будь-якої триггерної або зворотної триггерної функції була виконана спочатку. Потім цей ухил віднімався від кожного тесту для отримання більш репрезентативного наближення фактичного часу оцінки функції.

Таблиця 2. Час, витрачений в секундах на виконання зазначеної функції або функцій один мільярд разів. Оцінки отримують шляхом віднімання часових витрат на оцінку мільярда випадкових чисел, показаних у першому рядку таблиці 1, з решти рядків таблиці 1.

Час, проведений в засмазі (): 18.0515 18.2545

Час, проведений у TAN3 (): 5.93853 6.02349

Час, проведений у TAN4 (): 6.72216 6.99134

Час, витрачений у гріху () та cos (): 19.4052 19.4311

Час, проведений у SINCOS3 (): 7.85564 7.92844

Час, проведений у SINCOS4 (): 9.36672 9.57946

Час, проведений в атані (): 15,7160 15,6599

Час, проведений в ATAN1 (): 6.47800 6.55230

Час, проведений в ATAN2 (): 7.26730 7.24885

Час, проведений в ATAN3 (): 8.15299 8.21284

Час, проведений в asin () та acos (): 36.8833 36.9496

Час, проведений в ASINCOS1 (): 10.1655 9.78479

Час, проведений в ASINCOS2 (): 10.6236 10.6000

Час, проведений в ASINCOS3 (): 12,8430 12,0707

(В інтересах економії місця Таблиця 1 не показана.) У таблиці 2 наведені результати двох окремих прогонів на мільярд оцінок кожної функції наближення. Перший стовпець - це перший запуск, а другий - другий. Числа '1', '2', '3' або '4' у назвах функцій вказують на кількість термінів, які використовуються у функції серії Maclaurin для оцінки конкретного тригового або зворотного наближення тригерів. SINCOS # () означає, що і sin, і cos були оцінені одночасно. Аналогічно, ASINCOS # () означає, що і asin, і acos були оцінені одночасно. Мало зайвих накладних витрат при оцінці обох кількостей одночасно.

Результати показують, що збільшення кількості термінів трохи збільшує час виконання, як і слід було очікувати. Навіть найменша кількість термінів давала приблизно 12-14 знаків точності скрізь, за винятком наближення tan () поблизу, де його значення наближається до нескінченності. Можна було б очікувати, що навіть у функції tan () виникнуть проблеми.

Подібні результати були отримані на висококласному ноутбуці MacBook Pro в Unix та на настільному комп’ютері високого класу в Linux.


-5

Якщо ви вимагаєте більш фізичного пояснення гріха, cos і загару, подумайте, як вони відносяться до прямокутних трикутників. Дійсне числове значення cos (лямбда) можна дізнатися, утворюючи прямокутний трикутник, причому один з кутів є лямбда, і розділивши довжину сторони трикутників, що прилягає до лямбда, на довжину гіпотенузи. Аналогічно для гріха використовують протилежну сторону, розділену гіпотенузою. Для дотичної використовуйте протилежну сторону, розділену на сусідню сторону. Класична пам’ятка для пам’яті цього - SOHCAHTOA (вимовляється сокатоа).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.