“解码”sin泰勒系列的近似值

时间:2013-09-14 19:34:21

标签: c sin taylor-series

我正在使用泰勒系列来计算sin()。泰勒的罪恶系列是:

sin taylor series

我正在使用的实现如下:

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而不是从零到∞),{公式中{1}}为k,当然nx

我正在尝试理解该实现,即从上面的公式到代码的转换。我的目标是为x系列编写相同类型的实现。

你能帮我理解一下吗?

1 个答案:

答案 0 :(得分: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 expansion of sine function

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

rewriting steps

C函数只是从下到上执行这种递归重写,即在sine函数中首先计算出上述模式中的最后一步(该示例与调用相关) j==4,以便循环变量k的值以3开头并下降到0。)