由于你描述的问题,我没有看到一个简单的方法。你可以做的一件事是重新定义它以使它更容易,它将重新定义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