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いわゆる unevaluation- または delay-quotes でラップすることです。

残念なことに、2D Math 入力モードでは、きれいに印刷された (シグマ) 合計記号が と の両方sumで同じように見えaddます。これにより、この間違いを検出するのがさらに難しくなります。

Maple の標準 GUI の「式」パレットから 2D 数学の総和を挿入したのではないかと思いますが、残念ながら、この種の新しいユーザー ミスは発生してsumいません。add

特別な評価ルールに関するヘルプページも参照してください。

エイサー

于 2011-03-07T23:07:34.093 に答える