gpt4 book ai didi

wolfram-mathematica - Mathematica 中的部分评估

转载 作者:行者123 更新时间:2023-12-01 01:36:43 24 4
gpt4 key购买 nike

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

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

最佳答案

对于您描述的问题,我看不到直接的方法。您可以做的一件事是重新定义它以使其变得更加容易,那就是重新定义 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]]]]

关于wolfram-mathematica - Mathematica 中的部分评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1491275/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com