2013-09-14 2 views
2

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

sin taylor series

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

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; 
} 

Насколько я понимаю, что код является aproximation из j членов полинома (Другими словами, аппроксимация является суммирующей с нуля до j, а не от нуля до & # x221e;), k - n в формуле, и, конечно, x - x.

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

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

+0

Рассмотрите соотношение двух последовательных терминов. –

+0

Это может быть [Чебышевское приближение] (http://en.wikipedia.org/wiki/Chebyshev_polynomial), а не Тейлор. –

ответ

4

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

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

#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 примере и вспомнить расширение McLaurin синусоидальной функции:

McLaurin expansion of sine function

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

rewriting steps

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

+0

Не могли бы я объяснить процесс перезаписи шаг за шагом? Большое спасибо. – Manu343726

+0

Извините за уродливую математическую нотацию. Я очень скучаю по поддержке LaTeX здесь! :-) –

+0

Спасибо. Да, я тоже скучаю по латексу, вот почему я разместил изображение с формулой – Manu343726

Смежные вопросы