【发布时间】:2011-12-06 16:49:37
【问题描述】:
专家;
给定
f = (#1^#2) &
有没有办法在上面定义'f',如果#1 和#2都为零,那么纯函数'f'的值应该是1?
这样写的时候
f[0,0]
它会返回 1 而不是 Indeterminate?
顺便说一句,我知道我会写
f = (If[#1 == 0 && #2 == 0, 1, #1^#2]) &
但我想要一个通用规则或模式,所以我不必编写这些检查,因为纯函数可能更复杂(其中有很多 # )而且我不想做很多这样的 'if then else ' 检查每个可能出现的 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,那么生活会更简单。
2011 年 12 月 7 日更新 感谢大家的回答和cmets,都非常有用,解决了我的问题,我向他们学习了。
我选择了 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 来适应我正在做的事情。
【问题讨论】:
-
您确定要将这些评估为 1 而不是 0?该符号看起来好像您正在评估指数为非负整数或实数的多项式。连续性考虑表明,在这种情况下,值 0 可能更可取。
-
@DanielLichtblau,好的,谢谢,将研究 0^0 是否被 0 代替 1。但无论哪种情况,如果我使用 IF THEN ELSE (或通过定义许多不同的签名来实现它的功能等价物每个可能的情况),仍然有 16 种不同的情况。希望有办法将其短路,但告诉 Mathematica 将 0^0 替换为 X,其中 X 是正确的选择(可能是 0 或 1)。