4

我有一个作用于两个函数的微分算子。为了简化问题,假设我的运营商是

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 中是否可行。

4

2 回答 2

4

对于您描述的问题,我看不到直接的方法。您可以做的一件事是重新定义它以使其变得更加容易,那就是重新定义它,使其成为andA的导数的函数。如果你有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 的符号,并且有一个简单的定义,那么您可以通过使用 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]]]]
于 2009-09-29T14:23:27.363 回答
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
于 2010-04-22T23:14:50.090 回答