泰勒系列在C.

时间:2011-08-27 02:25:01

标签: c math taylor-series

我正在尝试使用泰勒系列制作一个计算cos(x)函数的程序到目前为止我已经得到了这个:

int factorial(int a){

if(a < 0)
    return 0;
else if(a==0 || a==1)
    return 1;
else
    return a*(factorial(a-1));
}

double Tserie(float angle, int repetitions){
    double series = 0.0;
    float i;

for(i = 0.0; i < repeticiones; i++){
    series += (pow(-1, i) * pow(angle, 2*i))/factorial(2*i);
    printf("%f\n", (pow(-1, i) * pow(angle, 2*i))/factorial(2*i));
}
return series;

}

对于我的例子,我使用angle = 90,重复= 20,来计算cos(90),但它没用,我只是让值接近无限值,任何帮助都将非常感激。

2 个答案:

答案 0 :(得分:3)

首先,角度是弧度,因此对于90度角,你需要通过M_PI/2

此外,你应该避免像阶乘一样微不足道的递归函数,它需要花费1/4的努力来迭代地编写它并且它会表现得更好。您实际上甚至不需要它,您可以将阶乘保留在临时变量中,并在每一步将其乘以2*i*(2*i-1)。请记住,在此步骤中,您将很快达到可表示性/精确度墙。

你也不需要实际调用pow -1来获得i的力量,简单的i%2?1:-1就足够了。这样,它会更快,并且在您增加i时不会失去精确度。

哦,不要让i float,它是一个整数,使它成为一个整数。你的精确度很高,为什么会让它变得更糟......

最重要的是,你在{0}附近接近cos,但正在为pi/2调用它。这样做你会得到很高的错误。

答案 1 :(得分:0)

泰勒级数用于数学余弦函数,其参数以弧度为单位。所以90可能并不意味着你在这里的意思。

此外,该系列需要更多的术语,参数从0开始的时间越长。一般来说,在您开始看到连续的术语变得更小之前,术语的数量需要与参数的大小相当,并且还要超过那是为了获得收敛。对于x = 90,可用的术语很少。

另一个问题是您将阶乘计算为int。阶乘函数增长非常快 - 已经为13!一个普通的C int(在32位机器上)会溢出,所以你的条件超过第六个将完全错误。

事实上,90的阶乘和幂很快变得太大而不能表示为double。如果您希望有机会看到系列会聚,则不得从头开始计算每个术语,而是使用公式(例如

)从前一个术语中计算出来。
nextTerm = - prevTerm * x * x / (2*i-1) / (2*i);