您应该能够通过使用add
而不是sum
在您的better_cos
运营商中获得您想要的东西。
使用add
通常更适合将数字序列的有限数量的项相加,并且还要注意add
Maple 所谓的特殊评估规则。
如果您打算获取固定数量的项的总和(即 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):
我想这是一个家庭作业,并且您意识到您也可以使用现有的系统命令taylor
或series
获得相同的结果,即。
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