在C中做泰勒系列的替代方法

时间:2017-06-28 16:51:21

标签: c taylor-series

在我班上,我的教授希望我们使用函数来解决sinX,cosX和expX的泰勒级数。

我解决它的速度相对较快,但是当我转向它时,他说他希望我先使用除法而不是乘法,基本上结合我的powerfact函数。我不知道他为什么要这样做,因为我得到了正确的答案,但他不会接受任务,直到我这样做。

我曾多次尝试解决这个问题,但我不是Comp Sci专业,并且在6年多的时间里没有学过数学,所以它在我的大脑中变得非常困难。任何帮助将不胜感激。

double power(double x, int n)
{
    int     i = 0;
    double  prod = 1.;

    for ( ; i++ < n; )
        prod = prod * x;

    return prod;
}

double fact (int n)
{
    int     i;
    double prod = 1.;

    for (i = 1; i <= n; i++)
        prod = prod * i;

    return prod;
}

double mySin(double x)
{
    int     i, sign;
    double  sum = 0;

    for (i = 0, sign = 1; i < 21; i++, sign = -sign)
        sum = sum + sign * power(x, 2 * i + 1)/ fact(2 * i + 1);
    return sum;
}

double myCos(double x)
{
    int     i, sign;
    double  sum = 0;

    for(i = 0, sign = 1; i < 21; i++, sign = -sign)
        sum = sum + sign *power(x,2 * i)/ fact(2 * i);
    return sum;
}

double myExp(double x)
{
    int     i, sign;
    double  sum = 0;

    for(i = 0, sign = 1; i < 21; i++, sign = sign)
        sum = sum + sign * power(x, i)/ fact(i);
    return sum;
 }

1 个答案:

答案 0 :(得分:4)

使用幂和阶乘函数效率低下。对于每个术语,您每次都要计算同一组产品。您还在构建可能导致精度损失的大数字。

看一下每个系列的定义(这里^表示幂,!表示阶乘):

e^x = 1 + x + x^2/2! + x^3/3! + x^4/4! + ...
sin(x) = x - x^3/3! + x^5/5! - + x^7/7! + ...
cos(x) = 1 - x^2/2! + x^4/4! - + x^6/6! + ...

对于e^x,每个字词是最后一个字段的x/n倍,其中n是字词编号。同样,对于sin(x)cos(x),每个字词都是最后一个字段的- x^2/((2n-1)*2n)倍。使用它来代替幂函数和阶乘函数来计算每个连续项。

这也是一个很好的技巧,它涉及一个数学上没有意义的比较但是有效,因为浮点数的精度有限,知道何时停止计算项。看看你是否能搞清楚。