2

我正在使用泰勒级数来计算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而不是从零到∞的求和),kn公式中,当然xx

我试图理解那个实现,也就是从上面的公式到代码的转换。我的目标是为该cos()系列编写相同类型的实现。

你能帮我理解吗?

4

1 回答 1

4

这是一个 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 展开:

正弦函数的 McLaurin 展开

现在让我们执行到第 5 项 (N=5) 的扩展,忽略余数 R 并执行一些涉及 x 2项分解的重写。生成的步骤如下所述,其中重写的子表达式用方括号中的数字标记:

重写步骤

C 函数只是这种自下而上的递归重写的实现,即在上述模式中显示为最后一步的内容首先在sine函数中计算(该示例与使用 的调用相关j==4,因此循环变量k以的值3和 下降到0) 。

于 2013-09-14T22:06:31.680 回答