декодировать аппроксимацию ряда синуса Тейлора

Я использую ряд Тейлора для вычисления sin(). Ряд Тейлора для греха:

Серия грехов Тейлор

Реализация, которую я использую, выглядит следующим образом:

float sine(float x, int j)
{
    float val = 1;

    for (int k = j - 1; k >= 0; --k)
        val = 1 - x*x/(2*k+2)/(2*k+3)*val;

    return x * val;
}

Насколько я понимаю, этот код представляет собой аппроксимацию j членов полинома (другими словами, аппроксимация представляет собой суммирование от нуля до j, а не от нуля до ∞), k равно n в формуле, и, конечно, x равно x.

Я пытаюсь понять эту реализацию, то есть преобразование формулы выше в код. Моя цель — написать такую ​​же реализацию для серии cos().

Не могли бы вы помочь мне понять это?


person Manu343726    schedule 14.09.2013    source источник
comment
Рассмотрим отношение двух последовательных членов.   -  person Kerrek SB    schedule 14.09.2013
comment
Это может быть аппроксимация Чебышева, а не Тейлора.   -  person Basile Starynkevitch    schedule 14.09.2013


Ответы (1)


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

Версия для косинуса следующая (вместе с простой проверкой):

#include <stdio.h>
#include <math.h>

float cosine(float x, int j)
{
    float val = 1;
    for (int k = j - 1; k >= 0; --k)
        val = 1 - x*x/(2*k+2)/(2*k+1)*val;
    return val;
}

int main( void )
{
    for( double x = 0.0; x <= 1.57; x += 0.1 )
    {
        printf("%10g    %10g    %10g\n", x, cos(x), cosine(x, 5));
    }
    return 0;
}

EDIT (уродливая текстовая математика заменена изображениями, созданными с помощью LaTeX)

Чтобы понять хитрость, давайте сосредоточимся на примере sine и вспомним расширение Маклаурина функции синуса:

Маклауринское расширение синусоидальной функции

Теперь давайте выполним разложение до 5-го члена (N=5), пренебрежем остатком R и выполним некоторую переписывание, включающее факторизацию членов x2. Результирующие шаги описаны ниже, где переписанные подвыражения отмечены числом в квадратных скобках:

переписывание шагов

Функция C является просто реализацией этой рекурсивной перезаписи снизу вверх, то есть то, что появляется как последний шаг в приведенной выше схеме, сначала вычисляется в функции sine (пример относится к вызову с j==4, так что переменная цикла k начинается со значения 3 и опускается до 0) .

person Lorenzo Donati -- Codidact.com    schedule 14.09.2013
comment
Не могли бы вы объяснить мне процесс перезаписи шаг за шагом? Большое спасибо. - person Manu343726; 15.09.2013
comment
Извините за некрасивую математическую запись. Мне очень не хватает поддержки LaTeX здесь! :-) - person Lorenzo Donati -- Codidact.com; 15.09.2013
comment
Спасибо. Да, я тоже скучаю по латексу, поэтому я разместил изображение с формулой - person Manu343726; 15.09.2013
comment
Наконец я нашел время, чтобы заменить эту уродливую математику более красивыми изображениями. - person Lorenzo Donati -- Codidact.com; 22.09.2013
comment
Спасибо! Это значительно улучшает ответ! - person Manu343726; 22.09.2013
comment
Эта группировка терминов — уловка, которую уже использовал Ньютон. Сегодня ее чаще всего (и ошибочно) называют схемой Горнера (полиномиальной оценки). - person Lutz Lehmann; 14.03.2021