0

私は置換ルールを使用しています:

最初に、SetDelayed を使用していくつかの簡単な数式を定義しました。

a:=b+c
d:=a/e

次の式を評価すると、期待どおりの結果が得られます。

In[20]:= (d^2 + something)/(d - 1)
Out[20]= ((b+c)^2/e^2+something)/((b+c)/e-1)

しかし、「d」を別の用語、たとえば「tmp」に置き換えたい場合は、次のようになります。

In[26]:= (d^2+something)/(d-1)//.d->tmp
Out[26]= ((b+c)^2/e^2+something)/(tmp-1)

変数「d」は、「Power」のような関数で囲まれていない場合にのみ置き換えられるようです。したがって、この用語d^2は に置き換えられませんtmp

dでは、評価の段階で毎回交換したい場合、何が間違っているのでしょうか?

4

2 に答える 2

0

あなたの評価者は、 (あなたが書いた)がそれを見る前に、あなたが確立したルールに従ってIn[26]書き直しました。 dReplaceRepeated//.

Mathematica のエバリュエータは非常に貪欲で、//.優先順位がかなり低いため、//.inの左側の式は次のようIn[26]に書き直されました。

((b+c)^2/e^2+something)/(tmp-1)

置換ルールが実行される前に。この式には何も含まれていないためd、置換ルールd->tmpは適用されません。

いくつかの選択肢があります。

da) asd:=tmpまたはd=tmpwhich case 評価するための新しい式を書くことができます

(d^2+something)/(d-1)

生産します

(something + tmp^2)/(-1 + tmp)

b)を含む式を変換したいときはいつでも、d評価によって作成されたの定義を削除し、単純に置換規則を使用できます。d:=a/ed

Hold[]c)やなどの関数の定義と使用法、HoldFirst[]および Mathematica の通常の評価プロセスとその変更方法の両方をカバーするドキュメントの部分を調べることができます。

d) Mathematica の場合と同様に、目的を達成する方法は他にもあります。最適な選択は、何をしようとしているのかによって異なります。

あなたの特定の質問に答えるために、評価のステップ中に発生するたびに d を置き換えたい場合、私は何を間違っていますか? : 書き換えルールを定義d:=a/eし、セッションでその後評価される式の評価中に試行される一連のルールにそれを入れています。

コメントに応じて編集

d:=a/eは一時的な置き換えではなく、削除または置き換えられるか、セッションを閉じるまで存続する定義です。一般に、ルールを使用します(あなたの などd->tmp。もちろん、 Mathematica は変数にルールを割り当てることができるものです。

rule1 = d->a/e

明白な方法でそれらを使用します

expression /. rule1

ルールのリストを定義できます

rule_list = {d->tmp, e->tmp2, f-> tmp3}

等々。

于 2013-05-02T22:28:19.277 に答える