Как работают тригонометрические функции?

Итак, в средней школе и, вероятно, в колледже, нас учат тому, как использовать триггерные функции, что они делают и какие проблемы решаются. Но они всегда были представлены мне как черный ящик. Если вам нужен синус или косинус чего-то, вы нажмете кнопку sin или cos на свой калькулятор, и вы настроены. Что хорошо.

Мне интересно, как обычно реализуются тригонометрические функции.

Ответ 1

Во-первых, вам нужно сделать какое-то уменьшение диапазона. Функции Trig являются периодическими, поэтому вам необходимо уменьшить аргументы до стандартного интервала. Для начала вы можете уменьшить углы между 0 и 360 градусами. Но, используя несколько идентичностей, вы понимаете, что можете справиться с меньшими затратами. Если вы вычисляете синусы и косинусы для углов между 0 и 45 градусами, вы можете загружать свой путь для вычисления всех функций триггера для всех углов.

Как только вы уменьшите свой аргумент, большинство чипов используют алгоритм CORDIC для вычисления синусов и косинусов. Вы можете услышать, как люди говорят, что компьютеры используют серии Тейлора. Это звучит разумно, но это неправда. Алгоритмы CORDIC намного лучше подходят для эффективной аппаратной реализации. (Библиотеки программного обеспечения могут использовать серии Taylor, скажем, на аппаратном обеспечении, которое не поддерживает функции триггера.) Может быть некоторая дополнительная обработка, используя алгоритм CORDIC, чтобы получить достаточно хорошие ответы, но затем сделать что-то еще для повышения точности.

Есть некоторые уточнения выше. Например, для очень малых углов theta (в радианах), sin (theta) = theta для всей точности, которую вы имеете, поэтому более эффективно просто возвращать theta, чем использовать какой-либо другой алгоритм. Поэтому на практике существует множество специальных логических схем, позволяющих выжать всю производительность и точность. Чипы с меньшими рынками могут не пойти на столько усилий по оптимизации.

Ответ 2

edit: У Джека Гансля есть достойная дискуссия в его книге о встроенных системах, "Руководство по прошивке" .

FYI: Если у вас есть ограничения точности и производительности, серия Taylor должна не использоваться для приближения функций для численных целей. (Сохраните их для курсов Calculus.) Они используют аналитичность в одной точке, например. тот факт, что все его производные существуют в этой точке. Они не обязательно сходятся в интересующем интервале. Часто они делают паршивую работу по распределению точности аппроксимации функции, чтобы быть "идеальной" прямо возле точки оценки; ошибка обычно увеличивается вверх, когда вы уходите от нее. И если у вас есть функция с любой непрерывной производной (например, прямоугольные волны, треугольные волны и их интегралы), серия Тейлора даст вам неправильный ответ.

Лучшее "легкое" решение при использовании полинома максимальной степени N для аппроксимации заданной функции f (x) на интервале x0 < x < x1, из Чебышевское приближение; см. "Численные рецепты" для хорошего обсуждения. Заметим, что Tj (x) и Tk (x) в статье я Wolfram связаны с использованием cos и обратного косинуса, это полиномы, и на практике вы используете формулу рекуррентности для получения коэффициентов. Опять же, см. "Численные рецепты".

edit: Wikipedia имеет полуприличную статью о теории приближений. Один из источников, которые они цитируют (Харт, "Компьютерные аппроксимации" ) выходит из печати (и использованные копии имеют тенденцию быть дорогими), но в деталях рассказывается о таких вещах. (Джек Гансль упоминает об этом в выпуске 39 своего информационного бюллетеня The Embedded Muse.)

edit 2: Здесь некоторые осязаемые метрики ошибки (см. ниже) для Тейлора против Чебышева для sin (x). Некоторые важные моменты:

  • что максимальная ошибка приближения рядов Тейлора в заданном диапазоне намного больше максимальной погрешности чебышевского приближения той же степени. (Примерно по той же ошибке вы можете уйти с меньшим сроком с Чебышевым, что означает более высокую производительность)
  • Дальнейшее сокращение - огромная победа. Это связано с тем, что вклад полиномов более высокого порядка сжимается, когда интервал приближения меньше.
  • Если вы не можете уйти с уменьшением диапазона, ваши коэффициенты нужно хранить с большей точностью.

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

Диапазон = -pi/2 до + pi/2, степень 5 (3 члена)

  • Тейлор: максимальная ошибка вокруг 4.5e-3, f (x) = x-x 3/6 + x 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) = xx 3/6 + x 5/120-x 7/5040
  • Чебышев: максимальная погрешность около 6е-7, f (x) = 0,99999660x-0,16664824x 3 + 0,00830629x 5 -0.00018363x 7

Диапазон = -pi/4 до + pi/4, степень 3 (2 члена)

  • Тейлор: максимальная ошибка около 2,5е-3, f (x) = x-x 3/6
  • Чебышев: максимальная ошибка около 1.5e-4, f (x) = 0.999x-0.1603x 3

Диапазон = -pi/4 до + pi/4, степень 5 (3 члена)

  • Тейлор: максимальная ошибка около 3,5e-5, f (x) = x-x 3/6 + x 5
  • Чебышев: максимальная ошибка вокруг 6e-7, f (x) = 0.999995x-0.1666016x 3 + 0.0081215x 5

Диапазон = -pi/4 до + pi/4, степень 7 (4 члена)

  • Тейлор: максимальная ошибка вокруг 3e-7, f (x) = xx 3/6 + x 5/120-x 7/5040
  • Чебышев: максимальная ошибка около 1,2e-9, f (x) = 0.999999986x-0.166666367x 3 + 0,008331584x 5 -0.000194621x 7

Ответ 3

Я считаю, что они рассчитаны с использованием серии Тейлора или CORDIC. Некоторые приложения, которые активно используют триггерные функции (игры, графики), создают триггеры при их запуске, поэтому они могут просто искать значения, а не перерасчитывать их снова и снова.

Ответ 4

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

Я не математик, но мое понимание того, где грех, cos и tan "исходят", это то, что они в некотором смысле наблюдаются, когда вы работаете с прямоугольными треугольниками. Если вы будете измерять длины сторон пучка разных прямоугольных треугольников и начертить точки на графике, вы можете получить из этого значения sin, cos и tan. Как указывает Харпер Шелби, функции просто определяются как свойства прямоугольных треугольников.

Более сложное понимание достигается путем понимания того, как эти отношения связаны с геометрией круга, что приводит к радианам и всей этой доброте. Все это в записи в Википедии.

Ответ 5

Чаще всего для компьютеров, представление силовых рядов используется для вычисления синусов и косинусов, и они используются для других функций триггера. Развертывание этих рядов примерно до 8 членов вычисляет значения, необходимые для точности, близкой к epsilon машины (наименьшее ненулевое число с плавающей запятой, которое может удерживаться).

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

Ответ 6

Если вы попросите более физическое объяснение греха, cos и tan, рассмотрите, как они относятся к прямоугольным треугольникам. Фактическое числовое значение cos (лямбда) можно найти, образуя прямоугольный треугольник с одним из углов лямбда и разделяющим длину стороны треугольников, смежной с лямбдой, на длину гипотенузы. Аналогично для греха используют противоположную сторону, деленную на гипотенузу. Для касательной используйте противоположную сторону, разделенную на соседнюю сторону. Классическим мемуаром, чтобы запомнить это, является SOHCAHTOA (произносится socatoa).