我有一个差分运算符,它可以作用于两个函数。为了简化问题,我们可以说我的运营商是
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中我想要的是什么。
答案 0 :(得分:4)
根据您描述的问题,我没有看到一种直接的方式。你可以做的一件事就是重新定义它以使其更加容易,重新定义A
,使其成为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的符号,并且具有简单的定义,那么您可以使用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