4

2 つの関数に作用する微分演算子があります。問題を単純化するために、私のオペレーターが

A[F_,G_] := D[F,x] D[G,y]

F を知っていれば、AF[G] が A[F,G] と等しいような微分演算子 AF を定義できるようになりたいです。明らかな方法は

AF[G_] := A[F,G]

問題なく動作します。しかし、私が本当に望んでいるのは、異なる引数 G1、G2、... で AF を呼び出すときに、導関数 D[F,x] が毎回再計算されるのではなく、1 回だけ再計算されるように調整することです。さらに、A は引数として関数に渡されるため、AF の定義が A の特定の形式に依存しないようにしたいと考えています。

Hold、HoldAll、Evaluate などのヘルプを読みましたが、これらを組み合わせて必要なものを取得することができません。私が望むことが Mathematica で可能かどうかさえわかりません。

4

2 に答える 2

4

あなたが説明した問題では、それを行う簡単な方法がわかりません。それを再キャストして劇的に簡単にするためにできることの 1 つは、とAの導関数の関数になるように再定義することです。あなたが持っている場合FG

A[{dFdx_,dFdy_}, {dGdx_,dGdy_}] := dFdx*dFdy 

必要な の導関数を計算し、に関して一般的な方法でF定義するのに非常に適した立場になります。AFA

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することで、必要な部分評価を行うことができます。HoldReleaseHold

ReleaseHold[
  Hold[AF[G_] := A[F, G]] /. DownValues[A] /. 
    HoldPattern[D[F, var_]] :> With[{eval = D[F, var]}, eval /; True]]

2 番目の規則のビットは、 "Trott-Strzebonski 法"と呼ばれるWith[...]内のパターンに一致するものの評価を強制するためのトリックです。これはあいまいですが、このようなタスクに非常に役立ちます。ただし、この方法を使用すると、インターフェイスが実際に制限されます。つまり、たとえば、純粋な関数を に渡すことはできず、より複雑な定義では、このトリックもおそらく機能しません。微分形式が実際の導関数の関数になるように指定できる場合は、そうすることを強くお勧めします。HoldA

編集:これを行うためのより一般的で堅牢な方法を考えました。

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]]]]
于 2009-09-29T14:23:27.363 に答える
0

あなたはただすることはできません:

A[F_] := With[{DF = D[F, x]}, Function[{G}, DF D[G, y]]]

これは、F# のような実際の関数型プログラミング言語でのカリー化に似ています。次のように記述します。

let a f =
  let df = d f x
  fun g -> df * d g y
于 2010-04-22T23:14:50.090 に答える