1

Subscript[w, j] で微分された Subscript[w, i] が KroneckerDelta[i, j] であることを Mathematica に教えたい。

私は試した

Unprotect[D]; D[Subscript[x_, i_], Subscript[x_, j_]] := 
                                            KroneckerDelta[i, j]; Protect[D]

これは D[Subscript[w, i], Subscript[w, j]] では機能しますが、より複雑な式、たとえば D[Times[k, Subscript[w, i]], Subscript[w, j]] では機能しません。

この質問への答えから、Mathematica で D と交換する関数を定義する方法は理解できますが、Mathematicaは私のルールに一致しませんが、その理由はわかりません。Mathematica が積規則を使用せずに、私の規則を呼び出さないのはなぜですか?

4

3 に答える 3

1

今何が起こっているのかがわかったと思います。

Mathematica はチェーンルールを使って D 演算子を再帰的に定義しません.おそらくこれは遅すぎるからです. 微分変数が含まれているかどうかを確認するために部分式にパターン マッチングを行い、含まれていない部分式は定数として扱われます。したがって、私の D のパターンは適用されません。

これを回避する方法は、Mathematica に次のことを明示的に伝えることです。

Subscript[w, i]

定数ではありません。

私のパターンは今このように見えます

Unprotect[D]; 
D[Subscript[x_, i_], Subscript[x_, j_], 
    NonConstants -> {___, Subscript[x_, i_], ___} ] := KroneckerDelta[i, j]; 
Protect[D]   

そして、私はそれをこのように適用する必要があります:

D[k * Subscript[w, i], Subscript[w, j], NonConstants -> Subscript[w, i]]
于 2013-09-23T00:50:43.607 に答える
0

まず第一に、通常、MathematicaUnprotectで記号にを追加するのは悪い考えです。Bill が示した理由に加えて、通常の作業を行う前に、与えられた引数がパターンと一致しないことを確認する必要があります。これにより、システムの速度が低下する可能性があります。DownValuesD

多くの場合、の代わりにUpValues(via ) を使用して回避できます。それはあなたを必要とせず、ルールが適用される場合にのみルールが起動します。UpSetDelayedDownValuesUnprotect

ただし、この場合、上にカスタムの差別化要因が必要だと思いますD

myD[f_, Subscript[x_, i_]] := 
  With[{vars = DeleteDuplicates[Cases[f, Subscript[x, _], {0, Infinity}]]}, 
    Sum[D[f, v]*KroneckerDelta[i, v[[2]]], {v, vars}]
  ]

(私が何か重要なものを見逃していなければ。)

于 2013-09-22T22:04:14.423 に答える