如何告诉Mathematica将0替换为0?

时间:2011-12-06 16:49:37

标签: wolfram-mathematica

专家;

给出

f = (#1^#2) &

有没有办法在上面定义'f',如果#1 #2都为零,那么纯函数'f'的值应该是1?

这样当我写

f[0,0]

它会返回1而不是不确定吗?

不过,我知道我可以写

f = (If[#1 == 0 && #2 == 0, 1, #1^#2]) &

但是我想要一个通用规则或模式,所以我不必编写这些检查,因为纯函数可能更复杂(其中很多#)并且我不想做其中的许多'如果其他的话'检查可能出现的每个可能的0 ^ 0。

感谢

更新

可能我应该澄清更多为什么我这样做 我有一个用户从菜单中选择一个功能。功能是

a x^n0 + b y^n1 + c x^n2 y^n3

在上面的地方,参数'n0','n1','n2'和'n3'也可以从滑块中选择,这些参数可以为零。

现在,'x'和'y'是坐标,它们也可以为零。

因此,在评估上述函数时可能会遇到0 ^ 0。

我自己做的时候有很多情况要检查。例如,'y ^ n3'可以是0 ^ 0而不是另一个,y ^ n1可以是0 ^ 0而不是另一个,x ^ n2 y ^ n3可以是0 ^ 0而不是其他等等。 ,所以我必须定义许多不同的案例。 (我认为可能有16种情况)。

我正试图避免这种情况。如果我可以告诉Mathematica在较低级别将0 ^ 0替换为1,那么生活会更简单。

更新12/7/11 感谢大家的回答和评论,一切都非常有用,解决了我的问题,并从中学习。

我选择了Leonid的答案,因为它允许我用最少的额外编码来解决我的问题。

这是一个小例子

Manipulate[Row[{format[x, n], "=", eval[x, n]}],
 {{x, 0.0, "x="}, 0, 1, .1, Appearance -> "Labeled"},
 {{n, 0.0, "n="}, 0, 1, .1, Appearance -> "Labeled"},
 Initialization :>
  (
   format[x_, n_] := HoldForm["(" x ")"^n];
   eval = Unevaluated[#1^#2] /. HoldPattern[0.0^0.0] :> 0.0 &
   )
 ]

我在代码中到处使用实数(它是一个数值pde求解器),所以这就是为什么我在上面使用0.0而不是0 ^ 0来适应我正在做的事情。

enter image description here

4 个答案:

答案 0 :(得分:16)

当然在 Mathematica 中有许多方法可以做,但我经常使用的一个设计习惯是写出具有降低特异性的“函数”(实际上是一种模式)。 Mathematica 具有以下特性:它将在不太具体的情况下应用更具体的模式。

所以,对于你的情况,我只想写:

Clear[f];
f[0, 0] = 1;
f[a_, b_] := a^b;

我假设您希望使用整数值,因为这是此类情况的常见上下文,例如在评估伯恩斯坦基函数时。

答案 1 :(得分:10)

我同意@Deep Yellow的答案,但如果你坚持纯函数,这是一种方法:

f = Unevaluated[#1^#2] /. HoldPattern[0^0] :> 1 &

修改

保持在纯函数范围内,您在编辑中描述的情况可以通过与我对特定原始示例的解决方案相同的方式进行处理。你可以通过一点点的元编程来自动化这个,定义下面的函数变换器:

z2zProtect[Function[body_]] := 
   Function[Unevaluated[body] /. HoldPattern[0^0] :> 1]

然后,我之前的代码可以改写为:

 f = z2zProtect[#1^#2 &]

但你可以更普遍地这样做,例如:

ff = z2zProtect[#1^#2 + 2 #2^#3 + 3 #3^#4 &]

In[26]:= ff[0,0,0,0]
Out[26]= 6

答案 2 :(得分:4)

您可以尝试编写f = Quiet[Check[#1^#2,1]] &

Quiet会取消"Power::indet: "Indeterminate expression 0^0 encountered."消息,Check会将结果替换为1,如果它是不确定的。

最好使用s = Quiet[Check[#1, 1]]之类的函数并将表达式包装在其中。

答案 3 :(得分:3)

我有点惊讶于前面没有提到的琐碎(虽然有点危险)修复。如果你真的不希望表达式0^0出现在你(a)担心它会发生的任何情况下,或者(b)希望将它评估为1以外的其他内容,那么你可以简单地尝试

Unprotect[Power];
Power[0, 0] = 1;
Protect[Power];
0^0

我需要此修复,因为复杂的函数对x^n形式的表达式进行了大量调用,其中x是实数,n是整数,在这种情况下应将0^0视为x^0=1的限制,因为x为0。

重要的是要注意,这样做会为当前内核会话“污染”Power,因此可能会破坏同时运行的其他笔记本以及(a)和(b)条件可能不会保持。由于Power位于System՝上下文而非Global՝,因此可能难以将不同笔记本的上下文分开以避免此修复产生的冲突。