我使用泰勒级数来计算sin()
。罪恶的泰勒级数是:
我正在使用的实现如下所示:
float sine(float x, int j)
{
float val = 1;
for (int k = j - 1; k >= 0; --k)
val = 1 - x*x/(2*k+2)/(2*k+3)*val;
return x * val;
}
据我所知,该代码是多项式的 j
项的近似值(换句话说,该近似值是从零到 j
的总和,而不是从零到无穷大),公式中k
就是n
,当然x
就是x
。
我试图理解这个实现,即从上面的公式到代码的转换。我的目标是为 cos()
系列编写相同类型的实现。
你能帮我理解这一点吗?
最佳答案
它是一个 McLaurin 级数,但编写它是为了减少利用级数通用项的递推公式的计算次数。
余弦的版本如下(以及一个简单的测试工具):
#include <stdio.h>
#include <math.h>
float cosine(float x, int j)
{
float val = 1;
for (int k = j - 1; k >= 0; --k)
val = 1 - x*x/(2*k+2)/(2*k+1)*val;
return val;
}
int main( void )
{
for( double x = 0.0; x <= 1.57; x += 0.1 )
{
printf("%10g %10g %10g\n", x, cos(x), cosine(x, 5));
}
return 0;
}
编辑(用 LaTeX 创建的图像替换丑陋的数学文本)
为了理解这个技巧,让我们重点关注 sine
示例并回顾一下正弦函数的 McLaurin 展开式:
现在让我们展开直到第 5 项 (N=5),忽略余数 R 并执行一些涉及 x2 项因式分解的重写。结果步骤如下所述,其中重写的子表达式用方括号中的数字标记:
C 函数只是这种自下而上的递归重写的实现,即上述模式中最后一步出现的内容首先在 sine
函数中计算(该示例是相对于使用 j==4
进行调用,以便循环变量 k
以值 3
开始,并下降到 0
) .
关于c - "decode"sin泰勒级数的近似值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18805627/