**
实现方法
**
我们可以通过泰勒展开式方便的实现这些函数。(感谢伟大的泰勒!)
首先介绍一下泰勒公式。
泰勒公式是将一个在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