【问题标题】:Taylor Series in CC大调泰勒级数
【发布时间】:2011-11-04 22:40:14
【问题描述】:

我正在尝试编写一个程序来使用泰勒级数计算 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),但它没有用,我只是不断获得接近无限的值,任何帮助将不胜感激。

【问题讨论】:

  • 你的意思不是 90 度,对吗?泰勒级数仅在您使用弧度时才有效。即便如此,它们也只能在更接近开发点(在你的情况下为零)时工作得更好。

标签: c math taylor-series


【解决方案1】:

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

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

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

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

最重要的是,您将 cos 近似为 0,但将其称为 pi/2。这样做你会得到非常高的错误。

【讨论】:

  • 我真的很感谢你的帮助......现在很愚蠢。非常感谢!
【解决方案2】:

泰勒级数用于数学余弦函数,其参数以弧度为单位。所以 90 可能并不像您认为的那样。

此外,参数从 0 开始越长,该系列需要的术语越多。通常,术语的数量需要与参数的大小相当,然后您才能开始看到连续的术语变得更小,并且远远超过那是为了得到收敛。 20 是用于 x=90 的少得可怜的术语。

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

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

之类的公式从前一项推导出它
nextTerm = - prevTerm * x * x / (2*i-1) / (2*i);

【讨论】:

    猜你喜欢
    • 2014-04-03
    • 1970-01-01
    • 2017-09-27
    • 2017-08-21
    • 2017-12-02
    • 2014-02-23
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    相关资源
    最近更新 更多