Аппроксимация синуса: полиномы Чебышёва vs. ряды Маклорена

в 12:35, , рубрики: C, Алгоритмы, аппроксимация, математика

В комментариях к моей статье про быстрое вычисление синуса был задан вопрос: "А чем не устроило разложение в ряд Тейлора?"

Краткий ответ таков: хоть приближение при помощи рядов Тейлора (точнее - рядами Маклорена) и даёт меньшую ошибку при том же количестве вычислений, но оно не позволяет разбить аргумент на произвольное количество интервалов и тем самым увеличить точность вычислений.

Теперь более подробно.

При приближении синуса (и не только) полиномами Чебышёва используют следующее выражение:

y(x) approx A_{0} + A_{1}cdot x + A_{2}cdot x^{2} + A_{3}cdot x^{3} + cdots

При этом коэффициенты А0, А1 и т.д. рассчитываются заранее для какого-то участка функции.

При помощи рядов Маклорена синус вычисляется по следующей формуле:

sin(x) approx x - frac{x^{3}}{3!} + frac{x^{5}}{5!} - frac{x^{7}}{7!} + frac{x^{9}}{9!} - frac{x^{11}}{11!} + cdots

Для удобства вычислений можно вынести повторяющиеся фрагменты за скобки. Например, так:

sin(x) approx x left (1-frac{x^{2}}{2cdot3}cdot left(1-frac{x^{2}}{4cdot5} cdot left(1-frac{x^{2}}{6cdot7}cdot left(cdots right) right) right) right)

или так:

sin(x)approx x cdot left ( 1  + x^2cdotleft ( - frac{1}{3!} + x^2cdotleft ( frac{1}{5!} + x^2 cdot left ( - frac{1}{7!}  + cdots  right ) right ) right ) right )

Для примера найдём значения синуса на интервале от 0 до pi /2обоими методами, и постоим их графики вместе с графиком "настоящего" синуса. Возьмём полином Чебышёва 2-й степени (с тремя членами), и с тем же количеством членов возьмём ряд Маклорена:

Картинка кликабельна
Картинка кликабельна

График многочлена Чебышёва представляет собой фрагмент параболы, и пересекает график синуса в трёх точках, являющимися корнями многочлена.

График ряда Маклорена, начиная с левого края, почти совпадает с графиком синуса, и расхождение с ним начинается заметно на глаз только в правой трети диаграммы.

Графики ошибок аппроксимации выглядят так:

Аппроксимация синуса: полиномы Чебышёва vs. ряды Маклорена - 7

На них видно, что ошибка приближения полиномом Чебышёва в разы больше таковой у ряда Маклорена.

Теперь давайте посмотрим, как ошибки аппроксимации зависят от количества членов аппроксимирующей функции.

Графики ошибок аппроксимации рядами Маклорена разной длины выглядят так:

Аппроксимация синуса: полиномы Чебышёва vs. ряды Маклорена - 8

Графики ошибок аппроксимации полиномами Чебышёва имеют следующий вид:

Аппроксимация синуса: полиномы Чебышёва vs. ряды Маклорена - 9

Графики ошибок выглядят по разному, но в обоих случаях величина ошибки падает с увеличением количества членов ряда. При этом точность полинома Чебышёва уже на порядки хуже таковой у рядов Маклорена.

На следующей диаграмме показана сравнительная точность аппроксимации обоими методами в зависимости от количества членов ряда (полинома). Точность выражена в "дробных битах", численно равных минус логарифму ошибки по основанию 2:

Аппроксимация синуса: полиномы Чебышёва vs. ряды Маклорена - 10

Вычисления производились с использованием 80-битных числе с плавающей запятой (тип long double). Результаты аппроксимации сравнивались со значением синуса, полученными стандартной функцией sinl() из библиотеки С компилятора gcc.

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

Однако для аппроксимации полиномами Чебышёва полный период (от 0 до 2 piможно разбить не на 4, как это делалось до сих пор, а, например, на 512 равных интервалов. На диаграмме этот случай представлен серой линией. Точность в 53.94 бита уже при 6 членах (полином 5-й степени) превышает таковую у ряда Маклорена в 51.62 бита при 10 членах ряда.

Вместо вывода. Пока что не существует идеального способа вычисления синуса, иначе не было такого их разнообразия. Подходящий способ выбирается как компромисс, исходя из заданных условий.

Автор: Виктор

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js