Wolfram mathematica 声明的力函数评估

Wolfram mathematica 声明的力函数评估,wolfram-mathematica,Wolfram Mathematica,我有一个函数f[x,y,z]:=Limit[g[x+eps,y,z],eps->0]和我在下一步中绘制f[x,y,z]。前面,我曾经计算过限制,并复制了f定义中的表达式。我试图一步到位。但是,仅当我尝试绘制f时,才对极限进行评估。因此,每次我改变变量和replot时,都会重新计算限制(计算大约需要一分钟,因此变得很烦人)。我试着先计算极限,然后做f[x,y,z]:=%。但这也不行。如何让函数在声明时计算限制?您需要的函数在逻辑上称为evaluate,您可以在Plot命令中使用它 下面是一个人为的

我有一个函数
f[x,y,z]:=Limit[g[x+eps,y,z],eps->0]和我在下一步中绘制
f[x,y,z]
。前面,我曾经计算过限制,并复制了
f
定义中的表达式。我试图一步到位。但是,仅当我尝试绘制
f
时,才对极限进行评估。因此,每次我改变变量和replot时,都会重新计算限制(计算大约需要一分钟,因此变得很烦人)。我试着先计算极限,然后做
f[x,y,z]:=%
。但这也不行。如何让函数在声明时计算限制?

您需要的函数在逻辑上称为
evaluate
,您可以在
Plot
命令中使用它

下面是一个人为的例子:

f[x_, y_, z_] := Limit[Multinomial[x, y, z], x -> 0]

Plot3D[ Evaluate[ f[x, y, z] ], {y, 1, 5}, {z, 1, 5}]

在回答你的后续问题时,也许你所寻求的只是

ff = f[x, y, z]

Plot3D[ff, {y, 1, 5}, {z, 1, 5}]
或者仅仅是

ClearAll[f, x, y, z]

f[x_, y_, z_] = Limit[Multinomial[x, y, z], x -> 0]

Plot3D[f[x, y, z], {y, 1, 5}, {z, 1, 5}]

如果您能发布一个更完整的代码版本,这将很有帮助。

Mr向导解决方案的另一个替代方案是,您还可以将
求值
放在函数的定义中:

f[x_, y_, z_] := Evaluate[Limit[Multinomial[x, y, z], x->0]]

Plot3D[f[x, y, z], {y, 1, 5}, {z, 1, 5}]

通过
计时
绘图

Simon,您可以将这两个版本与没有
评估
的版本进行比较,我不建议这样做,因为它只适用于玩具示例。在我看来,如果一个人可以使用这个结构,他也可以简单地省略
Evaluate
而使用
Set
而不是
SetDelayed
。不需要OP的
f[x,y,z]:=Limit[g[x,y,z],x->0]在这种情况下。否?@Mr.Wizard:我一直认为
f[x\u]:=Evaluate[ff[x]
构造比
f[x\u]=ff[x]
好,因为突出显示的语法表示局部变量。但是我刚刚测试了它,如果运行
x=1,它们都会以同样的方式失败;f[x_]:=评估[ff[x];g[x]=ff[x]
。。。不管怎样,我经常用这个结构。西蒙,我不明白。为什么不简单地使用,例如
f[x]=g[x]
,而不是
f[x]:=Evaluate[g[x]
?@Mr.Wizard:没有理由。我以前(今天早上之前)认为变量在
SetDelayed
/
Evaluate
版本中是局部的,但在测试后我发现情况并非如此。尽管如此,我还是很喜欢
Set
@Simon中没有的语法突出显示:令人困惑的是,作用域结构(
Set、SetDelayed、Block、with、Module、Function
)也是Mathematica表达式(heads),它们(大部分)遵守标准计算规则。它们是作用域构造的事实反映在变量绑定阶段的存在中,但只有当它们的内置规则适用时才会发生这种情况(这在评估序列中是“向上的”)。因此,通过将Evaluate包装在它们的参数周围(在“向下”的过程中处理),您可以操纵它们的绑定,这通常是一个非常有用的功能。但这不会强制每次都对函数求值吗?按照现在的方式,我不需要每次都对它进行评估。一次评估就足够了。。在那之后,它只是玩弄绘图变量。我不难让函数计算。。。我只希望在声明期间对其求值,而不是在打印时(就像我打印多次一样,每次都需要对其求值)。事实上,西蒙的解决方案很有效。我还没有试过你的,但它似乎可以做我一直在做的事情。@d'o-o'b:两种解决方案对单个绘图命令的行为基本相同。对于多个绘图,Wizard先生的解决方案将为每个绘图计算一次
f[x,y,z]
,但与原始代码中为每个绘图点计算一次相比,这算不了什么。@Simon:啊,我不知道我的解决方案为每个绘图点计算一次!有什么区别?我认为需要使用
:=
定义函数。不,可以使用
设置(
=
)或
设置延迟(
:=
)来定义函数。通常,对于函数使用
:=
是正确的,但要使用Mathematica,您需要了解这两个方面。在我看来,如果您需要帮助理解这些问题,最好发布一个新问题。@Mr.Wizard@Yaroslav:这只是我的问题,还是应该
SetDelayed[…,Evaluate[…]]
像我在回答下面的评论中描述的那样是一个范围界定结构?鉴于hilighting的当前行为,语法hilighting(对于
:=
)是否有点误导人?@Simon语法突出显示在许多人为的情况下出现了中断;它决不是完美的。我怀疑你的构造并不常见。我将不得不考虑范围界定行为,但这对我来说并不意外。@Wizard先生,@Yaroslav,@Simon,谢谢你的回答。我从来不知道有什么不同。我发布了一个关于
Set
SetDelayed
之间区别的新问题,如果你们能在这里解释一下,那就太酷了。在我看来,没有太多的空间来写评论。