我正在使用泰勒系列来计算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
而不是从零到∞),{公式中{1}}为k
,当然n
为x
。
我正在尝试理解该实现,即从上面的公式到代码的转换。我的目标是为x
系列编写相同类型的实现。
你能帮我理解一下吗?
答案 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扩展:
现在让我们执行扩展到第5个项(N = 5),忽略余数R并执行一些涉及x 2 项的因式分解的重写。下面描述了生成的步骤,其中重写的子表达式用方括号中的数字标记:
C函数只是从下到上执行这种递归重写,即在sine
函数中首先计算出上述模式中的最后一步(该示例与调用相关) j==4
,以便循环变量k
的值以3
开头并下降到0
。)