Nas*_*ser 9 wolfram-mathematica
专家;
特定
f = (#1^#2) &
Run Code Online (Sandbox Code Playgroud)
有没有办法在上面定义'f',如果#1 和#2都为零,那么纯函数'f'的值应该是1?
这样我写的时候
f[0,0]
Run Code Online (Sandbox Code Playgroud)
它将返回1而不是不确定?
顺便说一句,我知道我可以写
f = (If[#1 == 0 && #2 == 0, 1, #1^#2]) &
Run Code Online (Sandbox Code Playgroud)
但我想要一个通用规则或模式,所以我不必编写这些检查,因为纯函数可能更复杂(其中有许多#)并且我不想做很多这些'if then else'检查可能出现的每个可能0 ^ 0.
谢谢
更新:
也许我应该澄清更多为什么我这样做.
我有一个用户从菜单中选择一个功能.功能是
a x^n0 + b y^n1 + c x^n2 y^n3
Run Code Online (Sandbox Code Playgroud)
在上面的地方,参数'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 &
)
]
Run Code Online (Sandbox Code Playgroud)
我在我的代码中到处使用实数(它是一个数值pde求解器),所以这就是为什么我在上面使用0.0而不是0 ^ 0来适应我正在做的事情.

Cod*_*key 16
当然,在Mathematica中有许多方法可以做,但我经常使用的一个设计习惯是写出具有降低特异性的"函数"(实际上是一种模式). Mathematica的特性是它会在不太具体之前应用更具体的模式.
那么,对于你的情况,我只想写:
Clear[f];
f[0, 0] = 1;
f[a_, b_] := a^b;
Run Code Online (Sandbox Code Playgroud)
我假设你期望使用整数值,因为这是这种情况的通常上下文,例如在评估Bernstein基函数时.
Leo*_*rin 10
我同意@Deep Yellow的答案,但如果你坚持纯函数,这里有一种方法:
f = Unevaluated[#1^#2] /. HoldPattern[0^0] :> 1 &
Run Code Online (Sandbox Code Playgroud)
编辑
保持在纯函数范围内,您在编辑中描述的情况可以通过与我的特定原始示例的解决方案相同的方式来解决.您可以通过一点点元编程自动执行此操作,定义以下函数转换器:
z2zProtect[Function[body_]] :=
Function[Unevaluated[body] /. HoldPattern[0^0] :> 1]
Run Code Online (Sandbox Code Playgroud)
然后,我以前的代码可以重写为:
f = z2zProtect[#1^#2 &]
Run Code Online (Sandbox Code Playgroud)
但是你可以更普遍地这样做,例如:
ff = z2zProtect[#1^#2 + 2 #2^#3 + 3 #3^#4 &]
In[26]:= ff[0,0,0,0]
Out[26]= 6
Run Code Online (Sandbox Code Playgroud)