我使用泰勒级数来计算< 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()
系列编写相同类型的实现。
你能帮我理解一下吗?
这是一个麦克劳林级数,但它的编写是为了减少使用级数一般项的递推公式进行计算的次数。
余弦的版本如下(连同简单的测试线束):
#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定义,所以我不知道该怎么做。 谢谢