对于您描述的问题,我看不到直接的方法。您可以做的一件事是重新定义它以使其变得更加容易,那就是重新定义它,使其成为andA
的导数的函数。如果你有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
。
如果A
是一个为它定义了 DownValues 的符号,并且有一个简单的定义,那么您可以通过使用 a 进行部分评估Hold
,执行规则替换,然后执行 a 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 方法”中的模式匹配的东西,这种方法晦涩难懂,但对于这样的任务非常有用。然而,这样做确实限制了你的界面,这意味着你不能,比如说,传递一个纯函数 for 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]]]]