0

我定义了一个简单的函数:

c(n) = 2 * floor((n mod 24) / 12)

我想用 Maple 计算总和 c(0) + c(1) + ... + c(n),但 Maple 计算的总和是错误的。这是一个示例的屏幕截图,显示了一个明显错误的总和:http: //i.stack.imgur.com/BpmB2.png

我不知道我在这里错过了什么......

感谢您的时间

4

1 回答 1

2

这类问题被称为过早评估。发生的情况是sum使用 Maple 通常的评估模型,其中包括在实际在过程主体中进行计算之前评估过程调用的参数。

特别看看下面简单调用的结果creneau(i)。在您的示例中,该结果就是sum其论点。换句话说,mod操作过早地发生了,因为对的调用creneau(i)过早地进行了评估。

creneau := n -> (2*floor((n mod 24)/12)):

creneau(38);

                           2

oops := creneau(i);

                            /1   \
                     2 floor|-- i|
                            \12  /

eval(oops, i=38);

                           6


add(oops, i=38..38);

                           6

sum(oops, i=38..38);

                           6

sum(creneau(i), i=38..38);

                           6

sum('creneau(i)', i=38..38);

                           2

add(creneau(i), i=38..38);

                           2

解决此问题的常用方法是使用add而不是sum(因为add有所谓的“特殊评估规则”)或sum使用所谓的取消评估或延迟引用包装第一个参数。

不幸的是,在 2D 数学输入模式下,漂亮打印的 (Sigma) 求和符号对于sum和看起来是一样的add。这使得这个错误更难被发现。

I would even guess that you had inserted the 2D Math summation from the Maple's Standard GUI's "Expression" palette, which unfortunately has sum but not add leading to more new user mistakes of this sort.

See also the help-page on special evaluation rules.

acer

于 2011-03-07T23:07:34.093 回答