我定义了一个简单的函数:
c(n) = 2 * floor((n mod 24) / 12)
我想用Maple计算和c(0)+ c(1)+ ... + c(n),但Maple计算的总和是错误的。以下是显示明显错误总和的示例的屏幕截图:http://i.stack.imgur.com/BpmB2.png
我不知道我在这里失踪了什么...
感谢您的时间
答案 0 :(得分: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
具有所谓的“特殊评估规则”)或将第一个参数包装为{ {1}}带有所谓的无评估或延迟报价。
不幸的是,在2D数学输入模式下,sum
和sum
的漂亮打印(Sigma)求和符号看起来相同。这使得这个错误更难以发现。
我甚至猜测你已经从Maple的标准GUI的“表达式”调色板中插入了2D数学求和,不幸的是add
而不是sum
导致了更多这种新的用户错误。
另请参阅special evaluation rules上的帮助页面。
宏基