由於你描述的問題,我沒有看到一個簡單的方法。你可以做的一件事是重新定義它以使它更容易,它將重新定義A
,因此它的衍生品F
和G
的函數。如果你有
A[{dFdx_,dFdy_}, {dGdx_,dGdy_}] := dFdx*dFdy
你會在一個很好的位置,計算出你需要的F
衍生品,然後在某種程度上這是一般相對於A
,像這樣定義AF
:
With[{ dFdx = D[F,x], dFdy = D[F,y] },
AF[G_] := A[{dFdx, dFdy}, {D[G, x], D[G, y]}]]
如圖所示,您可以使用With
將評估過的片段替換爲SetDelayed表單的未評估右側(使用「:=」定義)。但是,如果你不能做出這樣的改變,事情就會變得多毛,並且你必須對A
做出一些假設。
如果A
是爲它定義DownValues的象徵,有一個簡單的定義,那麼你可以做你想要使用Hold
,做規則替換,然後做一個ReleaseHold
,像這樣的部分評價:
ReleaseHold[
Hold[AF[G_] := A[F, G]] /. DownValues[A] /.
HoldPattern[D[F, var_]] :> With[{eval = D[F, var]}, eval /; True]]
第二個規則的With[...]
位是強制的東西匹配Hold
內的模式稱爲"Trott-Strzebonski method",這是模糊的,但像這樣的任務是非常有用的評價一招。然而,這種方式確實會限制你的界面,也就是說你不能通過一個純函數來傳遞A
,而且如果這個技巧更復雜,這個技巧可能也不起作用。如果您可以設法指定您的差異表格是實際衍生工具的函數,我強烈建議您這樣做。
編輯:我想到了這樣做的一個更普遍和強大的方式。然後
訣竅是暫時抑制的使用Block
D
(衍生物操作者)的定義,所以在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]]]]
謝謝!這工作完美。儘管考慮到有多個變量x,y等的可能性,但我做了一些非必要的更改。因此,我使用的代碼是AF = With [{fRules = {HoldPattern [D [F, x []]:>評估[D [F,x]]}},塊[{D},函數[G,評估[A [F,G] /。 fRules]]]]; – cefstat 2009-09-29 15:22:16