В комментариях к моей статье про быстрое вычисление синуса был задан вопрос: "А чем не устроило разложение в ряд Тейлора?"
Краткий ответ таков: хоть приближение при помощи рядов Тейлора (точнее - рядами Маклорена) и даёт меньшую ошибку при том же количестве вычислений, но оно не позволяет разбить аргумент на произвольное количество интервалов и тем самым увеличить точность вычислений.
Теперь более подробно.
При приближении синуса (и не только) полиномами Чебышёва используют следующее выражение:
При этом коэффициенты А0, А1 и т.д. рассчитываются заранее для какого-то участка функции.
При помощи рядов Маклорена синус вычисляется по следующей формуле:
Для удобства вычислений можно вынести повторяющиеся фрагменты за скобки. Например, так:
или так:
Для примера найдём значения синуса на интервале от 0 до обоими методами, и постоим их графики вместе с графиком "настоящего" синуса.
Речь по прежнему идёт о скорости аппроксимации, поэтому оба метода будем сравнивать при примерно одинаковом количестве вычислений. То ест возьмём полином Чебышёва 2-й степени (с тремя членами), и с тем же количеством членов возьмём ряд Маклорена (получится степень 5):
![Картинка кликабельна Картинка кликабельна](https://habrastorage.org/getpro/habr/upload_files/948/0cc/18c/9480cc18ce3ea34d04f361ced897779e.png)
График многочлена Чебышёва представляет собой фрагмент параболы, и пересекает график синуса в трёх точках, являющимися корнями многочлена.
График ряда Маклорена, начиная с левого края, почти совпадает с графиком синуса, и расхождение с ним начинается заметно на глаз только в правой трети диаграммы.
Графики ошибок аппроксимации выглядят так:
![](https://habrastorage.org/getpro/habr/upload_files/b1e/0b2/188/b1e0b2188f5e009e8bd8b68f9d7b2d8a.png)
На них видно, что ошибка приближения полиномом Чебышёва в разы больше таковой у ряда Маклорена.
Теперь давайте посмотрим, как ошибки аппроксимации зависят от количества членов аппроксимирующей функции.
Графики ошибок аппроксимации рядами Маклорена разной длины выглядят так:
![](https://habrastorage.org/getpro/habr/upload_files/7ca/94c/5fd/7ca94c5fdedf151964c0740312ed81fd.png)
Графики ошибок аппроксимации полиномами Чебышёва имеют следующий вид:
![](https://habrastorage.org/getpro/habr/upload_files/ae3/a6d/bca/ae3a6dbca54c6a553a7845cad086e33d.png)
Графики ошибок выглядят по разному, но в обоих случаях величина ошибки падает с увеличением количества членов ряда. При этом точность полинома Чебышёва уже на порядки хуже таковой у рядов Маклорена.
На следующей диаграмме показана сравнительная точность аппроксимации обоими методами в зависимости от количества членов ряда (полинома). Точность выражена в "дробных битах", численно равных минус логарифму ошибки по основанию 2:
![](https://habrastorage.org/getpro/habr/upload_files/6f8/777/b10/6f8777b10c0a68e4764811cb6335f888.png)
Вычисления производились с использованием 80-битных числе с плавающей запятой (тип long double). Результаты аппроксимации сравнивались со значением синуса, полученными стандартной функцией sinl() из библиотеки С компилятора gcc.
Приближение при помощи рядов Маклорена (зелёная линия) даёт большую точность по сравнению с полиномами Чебышёва (синяя линия). Точность не растёт выше какого-то предела, это связано с ошибками округления при вычислениях.
Однако для аппроксимации полиномами Чебышёва полный период (от 0 до можно разбить не на 4, как это делалось до сих пор, а, например, на 512 равных интервалов. На диаграмме этот случай представлен серой линией. Точность в 53.94 бита уже при 6 членах (полином 5-й степени) превышает таковую у ряда Маклорена в 51.62 бита при 10 членах ряда.
Вместо вывода. Пока что не существует идеального способа вычисления синуса, иначе не было такого их разнообразия. Подходящий способ выбирается как компромисс, исходя из заданных условий.