2

我正在尝试编写一个程序来使用泰勒级数计算 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;

}

对于我的示例,我使用角度 = 90 和重复次数 = 20 来计算 cos(90),但它没有用,我只是不断获得接近无限的值,任何帮助将不胜感激。

4

2 回答 2

3

一方面,角度以弧度为单位,因此对于 90 度角,您需要通过M_PI/2.

此外,对于像阶乘这样微不足道的东西,您应该避免使用递归函数,迭代地编写它需要 1/4 的努力,而且它的性能会好得多。您实际上甚至不需要它,您可以将阶乘保存在一个临时变量中,并2*i*(2*i-1)在每一步将其乘以。请记住,在此步骤中,您将很快遇到可表示性/精确度的墙壁。

您也不需要实际调用pow-1 的幂i,一个简单的i%2?1:-1就足够了。这样它会更快,并且不会随着你的增加而失去精度i

哦,不要做i float,它是一个整数,让它成为一个整数。你泄漏了很多精确度,为什么让它变得更糟..

最重要的是,您近似于cos0,但将其调用为pi/2. 这样做你会得到非常高的错误。

于 2011-08-27T02:35:09.690 回答
0

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

此外,参数从 0 开始越长,该系列需要的术语越多。通常,术语的数量需要与参数的大小相当,然后您才能开始看到连续的术语变得更小,并且比顺序要多得多得到收敛。对于 x=90,20 是非常少的术语。

另一个问题是您将阶乘计算为int. 阶乘函数增长得非常快——已经有 13 个了!一个普通的 C int(在 32 位机器上)会溢出,所以你的术语超出第六个无论如何都是完全错误的。

事实上,阶乘和 90 的幂很快就变得太大而无法表示为doubles。如果您希望有机会看到级数收敛,则不能从头开始计算每个项,而是使用公式从前一项推导出它

nextTerm = - prevTerm * x * x / (2*i-1) / (2*i);
于 2011-08-27T02:38:20.383 回答