`Dot`を` Dot`や `NonCommutativeMultiply`と同じようにユーザー定義のシンボルに連鎖律を適用させる方法



How Make D Apply Chain Rule User Defined Symbols



解決:

多分あなたは以下を使うことができます:

ClearAll [dmydot、mydot] Derivative [ndiff __] [mydot] [x __]:= dmydot [ndiff] [x]; dmydot /:Times [f __、dmydot [n1 ___、1、n2 ___] [x __]]:= mydot @@ MapAt [Times [f]&、{x}、Length [{n1}] + 1]

ここで私がしているのは、連鎖律から来た内部導関数を引き戻すことだけです。mydotは、その位置の元のエントリを置き換えます。これは、導関数を次のように定義することによって行われます。dmydotと、何かがそれを乗算したときに機能するルールを与えます。もちろん、この「何か」には、連鎖律が始まる前から存在していた要因も含まれている可能性があります。しかし、少なくともそのような追加の要因を引き出す操作 の中へ NSmydot製品が正しくないことはありません。あなたがこの可能性を持って生きることをいとわないかどうか、私にはわかりません...



ここにいくつかのテストがあります:

D [y ^ 2 + 2 mydot [x + by、(x + ay)、z]、y](* ==> 2 y + 2(mydot [b、x + ay、z] + mydot [x + by 、a、z])*)

これは今とまったく同じように動作しますドット:



D [y ^ 2 +2ドット[x + by、(x + ay)、z]、y](* ==> 2 y + 2(b。(x + ay).z +(x + by)。 az)*)

これがより一般的な関数ですf内側あなた:

D [y ^ 2 + 2 mydot [x、f [x + ay]、z]、y](* ==> 2 y + mydot [x、2 a Derivative [1] [f] [x + ay]、 z] *)

これはすべて数学的に正しいと思います。製品の前にある不要な内部導関数の主な問題は修正されました。さらに、それはより高い導関数でも機能します:

D [mydot [x、(x + a y ^ 2)、z]、y、y](* ==> mydot [x、2 a、z] *) 

デフォルトでは、関数ヘッドが「DifferentiationOptions」->「ExcludedFunctions」システムオプションにリストされていない限り、Mathematicaは常に独立した微分変数を含む関数ヘッドを微分します。だから、私たちはあなたが追加することによってあなたが望む振る舞いを得ることができますこのリストへのmydot:



SetSystemOptions ['DifferentiationOptions'-> 'ExcludedFunctions'-> DeleteDuplicates [Append [OptionValue [SystemOptions []、 'DifferentiationOptions'-> 'ExcludedFunctions']、mydot]]];

次に、カスタム微分ルールを追加しますあなた:

mydot /:D [mydot [a __]、y _]:= D [Dot [a]、y] /。ドット-> mydot

次に、次のようになります。

D [mydot [x、(x + a y)、z]、y]

mydot [x、a、z]

望んだ通りに。 @Jensの残りのテストは次のとおりです。

D [y ^ 2 + 2 mydot [x + by、(x + ay)、z]、y] D [y ^ 2 + 2 mydot [x、f [x + ay]、z]、y] D [mydot [x、(x + ay ^ 2)、z]、y、y] 

2 y + 2(mydot [b、x + a y、z] + mydot [x + b y、a、z])

2 y + 2 mydot [x、a f '[x + a y]、z]

mydot [x、2 a、z]