Mathematica中的部分评估

时间:2009-09-29 08:31:41

标签: wolfram-mathematica

我有一个差分运算符,它可以作用于两个函数。为了简化问题,我们可以说我的运营商是

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

如果我知道F,我希望能够定义微分算子AF,使AF [G]等于A [F,G]。显而易见的方法是

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

没有任何问题。但我真正喜欢的是安排事情,这样当我用不同的参数G1,G2,...调用AF时,衍生的D [F,x]不会每次重新计算,而只会重新计算一次。此外,我希望AF的定义不依赖于A的特定形式,因为A作为参数传递给我的函数。

我已经阅读了关于Hold,HoldAll,Evaluate等的帮助,但我不能将这些东西放在一起以获得我想要的东西。我甚至都不知道Mathematica中我想要的是什么。

2 个答案:

答案 0 :(得分:4)

根据您描述的问题,我没有看到一种直接的方式。你可以做的一件事就是重新定义它以使其更加容易,重新定义A,使其成为FG的衍生物的函数。如果你有

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的符号,并且具有简单的定义,那么您可以使用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的纯函数,并且使用更复杂的定义,这个技巧也可能不起作用。如果您可以设法指定您的差异形式将是实际衍生工具的函数,我强烈建议您这样做。

编辑:我想到了一种更通用,更健壮的方法。

然后诀窍是暂时使用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]]]]

答案 1 :(得分: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