0

我想用枫泰勒级数写余弦函数。这是我的代码:

better_cos := proc (x) options operator, arrow; sum((-1)^n*x^(2*n)/factorial(2*n), n = 0 .. 20) end proc;

better_cos(0) 返回 0 而不是 1 (cos(0) == 1)。这可能是因为 x^(2*n) 总是返回 0 而不是 1。例如:

fun_sum := proc (x) options operator, arrow; sum(x^(2*n), n = 0 .. 0) end proc

对于 x == 1 返回 0。

这很奇怪,因为 0^0 返回 1。你知道如何正确实现 cosinus 的泰勒级数吗?

4

2 回答 2

5

您应该能够通过使用add而不是sum在您的better_cos运营商中获得您想要的东西。

使用add通常更适合将数字序列的有限数量的项相加,并且还要注意addMaple 所谓的特殊评估规则。

如果您打算获取固定数量的项的总和(即 n 从 0 到 20),那么您不应该编写一个计算每个输入参数(即每个值x)的阶乘的过程。相反,只生成一次截断序列,然后用于unapply生成运算符。这种方法也恰好可以处理您的原始问题,因为 x^0 术语成为1因为使用了符号x

您还可以重新排列多项式(截断序列),使其为霍纳形式,以便在随后对 x 的各种数值进行评估时尝试并最小化算术步骤。

例如,为了简洁起见,使用 5 个术语而不是 20 个,

convert(add((-1)^n*x^(2*n)/factorial(2*n), n = 0 .. 5),horner);

     /  1   /1    /   1    /  1        1     2\  2\  2\  2\  2
 1 + |- - + |-- + |- --- + |----- - ------- x | x | x | x | x 
     \  2   \24   \  720   \40320   3628800   /   /   /   /   

bc := unapply(%,x):

您现在bc可以使用符号或数字参数随心所欲地应用该过程。

expand(bc(x));

       1  2   1   4    1   6     1    8      1     10
   1 - - x  + -- x  - --- x  + ----- x  - ------- x  
       2      24      720      40320      3628800    

bc(0);
                           1

bc(1.2);
                      0.3623577360

如果您希望您的过程better_cos采用一对参数,以便术语的数量是可变的,那么您仍然可以考虑使用add来处理您的原始问题。例如,

bc := (x,N)->add((-1)^n*x^(2*n)/(2*n)!, n = 0 .. N):

我想这是一个家庭作业,并且您意识到您也可以使用现有的系统命令taylorseries获得相同的结果,即。

convert(series(cos(x),x=0,10),polynom);

              1  2   1   4    1   6     1    8
          1 - - x  + -- x  - --- x  + ----- x 
              2      24      720      40320   

convert(taylor(cos(x),x=0,10),polynom);

              1  2   1   4    1   6     1    8
          1 - - x  + -- x  - --- x  + ----- x 
              2      24      720      40320   
于 2013-10-28T04:27:58.950 回答
2

这是泰勒级数的定义:

在此处输入图像描述

不要从零开始循环;以一初始化并从二开始。

阶乘也是低效的。

于 2013-10-27T23:31:12.667 回答