あなたが説明した問題では、それを行う簡単な方法がわかりません。それを再キャストして劇的に簡単にするためにできることの 1 つは、とA
の導関数の関数になるように再定義することです。あなたが持っている場合F
G
A[{dFdx_,dFdy_}, {dGdx_,dGdy_}] := dFdx*dFdy
必要な の導関数を計算し、に関して一般的な方法でF
定義するのに非常に適した立場になります。AF
A
With[{ dFdx = D[F,x], dFdy = D[F,y] },
AF[G_] := A[{dFdx, dFdy}, {D[G, x], D[G, y]}]]
With
示されているように、 SetDelayed フォーム (「:=」を使用した定義) の未評価の右側に評価された部分を置き換えるために使用できます。ただし、その変更を行うことができない場合、事態は複雑になり、何が何でA
あるかについていくつかの仮定を立てる必要があります.
が定義されたDownValuesを持つシンボルであり、単純な定義を持っている場合、次のように a を使用し、ルールの置換を行い、次に a を実行A
することで、必要な部分評価を行うことができます。Hold
ReleaseHold
ReleaseHold[
Hold[AF[G_] := A[F, G]] /. DownValues[A] /.
HoldPattern[D[F, var_]] :> With[{eval = D[F, var]}, eval /; True]]
2 番目の規則のビットは、 "Trott-Strzebonski 法"と呼ばれるWith[...]
内のパターンに一致するものの評価を強制するためのトリックです。これはあいまいですが、このようなタスクに非常に役立ちます。ただし、この方法を使用すると、インターフェイスが実際に制限されます。つまり、たとえば、純粋な関数を に渡すことはできず、より複雑な定義では、このトリックもおそらく機能しません。微分形式が実際の導関数の関数になるように指定できる場合は、そうすることを強くお勧めします。Hold
A
編集:これを行うためのより一般的で堅牢な方法を考えました。
D
トリックは、を使用して (導関数演算子)の定義を一時的に抑制することですBlock
。そのため、 の定義の導関数は評価されA
ないままになり、ルール置換を使用して の導関数の値を代入し、F
すべてを純粋な関数にまとめます。次のように、名前の置換を正しく行います。
With[{fRules =
{HoldPattern[D[F, x]] :> Evaluate[D[F, x]]}},
Block[{D},
With[{fn = Function[G, Evaluate[A[F, G] /. fRules]]},
AF[G_] := fn[G]]]]