Как работают тригонометрические функции?
Итак, в математике средней школы и, вероятно, в колледже нас учат, как использовать тригонометрические функции, что они делают и какие проблемы они решают. Но они всегда были представлены мне как черный ящик. Если вам нужен синус или Косинус чего-то, вы нажимаете кнопку sin или cos на своем калькуляторе, и вы настроены. И это прекрасно.
Мне интересно, как обычно реализуются тригонометрические функции.
6 ответов:
во-первых, вы должны сделать какое-то сокращение диапазона. Тригонометрические функции являются периодическими, поэтому вам нужно уменьшить аргументы до стандартного интервала. Для начала, вы можете уменьшить углы, чтобы быть между 0 и 360 градусов. Но, используя несколько личностей, Вы понимаете, что можете обойтись и меньшим. Если вы вычисляете синусы и косинусы для углов от 0 до 45 градусов, вы можете загрузить свой способ вычисления всех тригонометрических функций для всех углов.
Как только вы уменьшили свой аргумент, большинство чипов используют CORDIC алгоритм вычисления синусов и косинусов. Вы можете услышать, как люди говорят, что компьютеры используют серию Тейлора. Это звучит разумно, но это не так. Алгоритмы CORDIC гораздо лучше подходят для эффективной оборудование реализация. (программа библиотеки могут использовать ряд Тейлора, скажем, на оборудовании, которое не поддерживает тригонометрические функции.) Там может быть некоторая дополнительная обработка, используя алгоритм CORDIC, чтобы получить довольно хорошие ответы но затем делать что-то еще, чтобы улучшить точность.
есть некоторые уточнения к вышесказанному. Например, для очень малых углов тета (в радианах), sin(тета) = тета со всей точностью, которую вы имеете, поэтому более эффективно просто вернуть тета, чем использовать какой-либо другой алгоритм. Поэтому на практике существует много специальной логики случая, чтобы выжать всю возможную производительность и точность. Чипы с меньшими рынками могут не пойти на такие большие усилия по оптимизации.
изменить: Джек Ganssle имеет достойный обсуждения в своей книге о встраиваемых системах, "Руководство По Прошивке".
FYI: если у вас есть ограничения по точности и производительности, серия Тейлора должна не используется для аппроксимации функций в численных целях. (Сохраните их для ваших курсов исчисления.) Они используют аналитичности функции в одной точке, например, тот факт, что все ее производные существуют в этой точке. Они не обязательно сходятся в интервале интереса. Часто они делают паршивую работу по распределению точности аппроксимации функции, чтобы быть "совершенными" прямо возле точки оценки; ошибка обычно увеличивается вверх, когда вы уходите от нее. И если у вас есть функция с любой непрерывной производной (например, квадратные волны, треугольные волны и их интегралы), ряд Тейлора даст вам неправильный ответ.
лучшее "легкое" решение, при использовании многочлена максимальная степень N для аппроксимации заданной функции f (x) через интервал x0 Чебышева аппроксимация; см. численные рецепты для хорошего обсуждения. Обратите внимание, что Tj(x) и Tk(x) в статье Wolfram I, связанной с использованием cos и обратного Косинуса, являются полиномами, и на практике вы используете рекуррентную формулу для получения коэффициентов. Опять же, смотрите числовые рецепты.
edit: Wikipedia имеет полу-приличную статью о приближение теория. Один из источников, которые они цитируют (Hart, "компьютерные приближения"), не печатается (и используемые копии, как правило, дороги), но вдается в множество деталей о таких вещах. (Джек Ganssle упоминает об этом в выпуске 39 его бюллетень Встроенная Муза.)
edit 2: Вот некоторые ощутимые показатели ошибок (см. ниже) для Тейлора против Чебышева для sin(x). Некоторые важные моменты, чтобы отметить:
- что максимальная ошибка ряда Тейлора аппроксимация в заданном диапазоне значительно больше, чем максимальная погрешность чебышевского приближения той же степени. (Примерно за ту же ошибку вы можете уйти с одним меньшим термином с Чебышевым, что означает более высокую производительность)
- сокращение диапазона-это огромная победа. Это связано с тем, что вклад полиномов более высокого порядка уменьшается, когда интервал аппроксимации меньше.
- если вы не можете уйти с уменьшением диапазона, ваши коэффициенты должны быть хранится с большей точностью.
Не поймите меня неправильно: серия Тейлора будет работать правильно для синуса/Косинуса (с разумной точностью для диапазона-pi/2 до +pi/2; технически, с достаточным количеством терминов, вы можете достичь любой желаемой точности для всех реальных входов, но попробуйте вычислить cos(100) с помощью серии Тейлора, и вы не можете этого сделать, если не используете арифметику произвольной точности). Если бы я застрял на необитаемом острове с ненаучным калькулятором, и мне нужно было вычислить синус и косинус, Я бы, вероятно, использовал ряд Тейлора, так как коэффициенты легко запомнить. Но реальные приложения для того, чтобы писать свои собственные функции sin() или cos() достаточно редки, что вам лучше всего использовать эффективную реализацию для достижения желаемой точности-что серия Тейлора не.
диапазон = - pi / 2 до +pi / 2, степень 5 (3 условия)
- Тейлор: максимальная ошибка около 4.5 e-3, f (x) = x-x3 / 6+x5/120
- Чебышев: максимальная ошибка около 7e-5, f (x) = 0.9996949 x-0.1656700 x3+0.0075134 x5
диапазон = - pi / 2 до +pi / 2, степень 7 (4 условия)
- Тейлор: максимальная ошибка около 1.5 e-4, f (x) = x-x3 / 6+x5 / 120-x7/5040
- Чебышев: максимальная ошибка около 6e-7, f (x) = 0.99999660 x-0.16664824 x3+0.00830629 x5-0.00018363 x7
диапазон = - pi / 4 до +pi / 4, степень 3 (2 условия)
- Тейлор: максимальная ошибка около 2.5 e-3, f (x) = x-x3/6
- Чебышев: максимальная ошибка около 1.5 e-4, f (x) = 0.999 x-0.1603 x3
диапазон = - pi / 4 до +pi / 4, степень 5 (3 условия)
- Тейлор: максимальная ошибка около 3.5 e-5, f (x) = x-x3 / 6+x5
- Чебышев: максимальная ошибка около 6e-7, f (x) = 0.999995 x-0.1666016 x3+0.0081215 x5
диапазон = - pi / 4 до +pi/ 4, степень 7 (4 условия)
- Taylor: максимальная ошибка вокруг 3e-7, f (x) = x-x3 / 6+x5 / 120-x7/5040
- Чебышев: максимальная ошибка около 1.2 e-9, f (x) = 0.999999986 x-0.166666367 x3+0.008331584 x5-0.000194621 x7
Я считаю, что они рассчитываются с помощью Ряд Тейлора или CORDIC. Некоторые приложения, которые интенсивно используют тригонометрические функции (игры, графика), создают тригонометрические таблицы при запуске, чтобы они могли просто искать значения, а не пересчитывать их снова и снова.
проверить статьи в Википедии о тригонометрических функциях. Хорошее место, чтобы узнать о фактической реализации их в коде является Численные Рецепты.
Я не очень математик, но мое понимание того, откуда "приходят" грех, cos и tan, заключается в том, что они в некотором смысле наблюдаются, когда вы работаете с прямоугольными треугольниками. Если вы производите измерения длин сторон пучка различных прямоугольных треугольников и строите точки На a граф, вы можете получить грех, cos и загар из этого. Как указывает Харпер Шелби, функции просто определяются как свойства прямоугольных треугольников.
более сложное понимание достигается путем понимания того, как эти соотношения относятся к геометрии круга, что приводит к радианам и всему этому благу. Все это есть в Википедии.
чаще всего для компьютеров представление степенных рядов используется для вычисления синусов и косинусов, и они используются для других тригонометрических функций. Расширение этих рядов примерно до 8 членов вычисляет значения, необходимые для точности, близкой к машине epsilon (наименьшее ненулевое число с плавающей запятой, которое может быть удержано).
метод CORDIC быстрее, так как он реализован на аппаратном обеспечении, но он в основном используется для встроенных систем, а не стандартных компьютеров.
Если вы просите более физическое объяснение греха, cos и tan рассмотрим, как они относятся к прямоугольным треугольникам. Фактическое числовое значение cos (лямбда) может быть найдено путем формирования прямоугольного треугольника с одним из углов, являющихся лямбда, и деления длины стороны треугольников, прилегающей к лямбде, на длину гипотенузы. Аналогично для греха используют противоположную сторону, разделенную гипотенузой. Для касательной используют противоположную сторону, разделенную смежной стороной. Классик memonic, чтобы помнить, что это SOHCAHTOA (произносится socatoa).