我想写一下Maple Taylor系列中的cosinus函数。这是我的代码:
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的泰勒系列?
答案 0 :(得分:5)
您应该能够在add
运算符中使用sum
代替better_cos
来获得所需内容。
使用add
通常更适合于添加数字序列的有限数量的项,并且还注意add
具有Maple所谓的特殊评估规则。
如果你打算取一个固定数量的项的总和(即n从0到20)那么你就不应该编写一个程序来计算每个输入参数的阶乘(即。{{1}的每个值}})。相反,只生成一次截断系列,然后使用x
生成一个运算符。这种方法也恰好处理了您的原始问题,因为x ^ 0项变为unapply
,因为使用了符号1
。
您还可以重新排列多项式(截断系列),使其处于Horner形式,以便在随后在x的各种数值处进行评估时尝试最小化算术步骤。
例如,使用5个术语表示简洁而不是20个,
x
您现在可以根据需要应用过程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
答案 1 :(得分:2)
以下是泰勒系列的定义:
不要以零开始循环;用一个初始化,从两个开始。
因素也是低效的。