基于C的sin(x)、cos(x)等三角函数以及exp(x)、ln(x)等指数对数函数的实现

**

实现方法

**
我们可以通过泰勒展开式方便的实现这些函数。(感谢伟大的泰勒!)

首先介绍一下泰勒公式。
泰勒公式是将一个在x=x0处具有n阶导数的函数f(x)利用关于(x-x0)的n次多项式来逼近函数的方法。
若函数f(x)在包含x0的某个闭区间[a,b]上具有n阶导数,且在开区间(a,b)上具有(n+1)阶导数,则对闭区间[a,b]上任意一点x,成立下式:
在这里插入图片描述

通过在x0处N阶求导展开(常在x = 0处展开),并将前n项相加,我们可以得到f(x)的近似值。
由此,我们可以通过泰勒公式获取一个n阶可导的函数在其定义域内任一点x的值。

常用的泰勒展开式如下:
在这里插入图片描述

只有我们知道函数的泰勒展开式,原则上我们均能求出f(x)的大小。

下面分享一下sin(x)、cos(x)以及exp(x)的C代码,感兴趣的读者可以根据以上的泰勒展开式实现其中的任何一个函数。

代码实现

为了实现泰勒,先定义阶乘和乘方~

乘方:

double mypow(double x,unsigned n)
{
    /*简化版乘方*/
    double s = 1;
    int i = n;
    while(i > 0)
    {
        s*=x;
        i--;
    }
    return s;
}

阶乘:

int myfactorial(unsigned n)
{
    int s = 1;
    if(n == 0)// 0的阶乘为1
        return 1;
    else
    {
        while(n > 0)
        {
            s *= n;
            n--;
        }
    }
    return s;
}

有了阶乘和乘方,我们可以编写更加简练的代码~
现在实现sin(x)、cos(x)、exp(x)

sin(x)

double sin(double x)
{/*取sin(x) 在x = 0 时的泰勒展开式,取前6项
即sin(x) = x - (1/3!)*x^3+(1/5!)*x^5-(1/7!)*x^7+(1/9!)*x^9-(1/11!)*x^11*/
    int i = 1;
    while(x < -3.1415926 || x > 3.1415926)//x取值为-pi ~ pi
    {
        if(x > 3.1415926) x = x - 2*3.1415926;
        if(x < -3.1415926) x = x + 2*3.1415926;
    }
    double sum = 0;
    while(i <= 6)
    {
        sum += mypow(-1,i+1)*mypow(x,2*i-1)/myfactorial(2*i-1);
        i++;
    }
    return sum;
}

cos(x)

double cos(double x)
{/*取cos(x) 在x = 0 时的泰勒展开式,取前6项
即cos(x) = 1 - (1/2!)*x^2+(1/4!)*x^4-(1/6!)*x^6+(1/8!)*x^8-(1/10!)*x^10*/
    int i = 1;
    while(x < -3.1415926 || x > 3.1415926)//x取值为-pi ~ pi
    {
        if(x > 3.1415926) x = x - 2*3.1415926;
        if(x < -3.1415926) x = x + 2*3.1415926;
    }
    double sum = 0;
    while(i <= 6)
    {
        sum += mypow(-1,i+1)*mypow(x,2*i-2)/myfactorial(2*i-2);
        i++;
    }
    return sum;
}

exp(x)

double exp(double x)
{/*计算e的x次方,采用泰勒公式*/
    double sum = 0;
    int i = 0;
    while( i <= 12)
    {
        sum += mypow(x,i)/myfactorial(i);
        i++;
    }
    return sum;
}

参考资料:
泰勒公式_百度百科:https://baike.baidu.com/item/泰勒公式/7681487?fr=aladdin

猜你喜欢

转载自blog.csdn.net/jiao_gis/article/details/84700941