当前位置: 首页 > 知识库问答 >
问题:

“解码”正弦泰勒级数近似值

赫连琦
2023-03-14

我使用泰勒级数来计算< code>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

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

你能帮我理解一下吗?

共有1个答案

阎德宇
2023-03-14

这是一个麦克劳林级数,但它的编写是为了减少使用级数一般项的递推公式进行计算的次数。

余弦的版本如下(连同简单的测试线束):

#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;
}

EDIT(用LaTeX创建的图像替换丑陋的文本数学)

为了理解这个技巧,让我们把重点放在< code>sine的例子上,回忆一下正弦函数的McLaurin展开式:

现在让我们展开到第5项(N=5),忽略余数R,进行一些重写,包括x2项的因式分解。下面描述了产生的步骤,其中重写的子表达式用方括号中的数字标记:

C函数只是这种自下而上的递归重写的实现,也就是说,在上述模式中作为最后一步出现的内容首先在< code>sine函数中进行计算(该示例与< code>j==4的调用相关,因此循环变量< code>k从值< code>3开始,一直到< code>0)。

 类似资料:
  • 我需要对我的递归方法的一些洞察力来计算辛泰勒级数,它不能正常工作。该方法调用了另外两个递归方法,即递归pow方法和递归阶乘方法。我将我的发现与迭代罪方法进行了比较,给了我正确的解决方案。我的递归罪方法中缺少什么? sin(x)= x - x^3/3的近似值!x^5/5!-x^7/7!...

  • 这是我的代码: 但它不起作用并显示此错误:

  • 在数学中,泰勒级数对于用低次多项式逼近函数是很重要的。 我想看看这样的近似如何有帮助,例如为了加快计算速度。让我们使用著名的泰勒级数: 从道德上讲,计算2次多项式的值应该比计算快得多。 因此,一个测试代码: 为什么多项式法比实际测井慢10倍?我期待的正好相反。 PS:这个问题可能在SO和math.SE.

  • 我正在做一个项目,用最小二乘法找到正弦函数的近似值。我也可以用我自己选择的12个值。由于我不知道如何求解,我想到用泰勒级数来求解正弦,然后用5阶多项式来求解。下面是我的代码: 然后在matlab中得到这个结果

  • 我有一个作业,教授要我们用泰勒级数计算sin(x)。他希望我们在两个连续分数之间的差小于10^-6时停止迭代。 最后,我说,例如x^5/5!与(x^3/3!)*相同(x^2/4*5),所有分数都是如此。所以我可以保留之前计算的分数,并在下一次迭代中使用。问题是,我最终得到的数字与它的实际罪过有点偏差,我不知道为什么。提前谢谢。这是我的代码:

  • 我试着做x正弦的泰勒展开,但是如果x大于150度,函数就会发散。 这是我的代码: 在这里,我将自治领绑定为[0,2pi]。 这里,我定义了一个阶乘函数 这是sin(x)的Taylor(Maclaurin)级数展开式 } 问题是它必须在[0,2pi]中为x定义,所以我不知道该怎么做。 谢谢