2011-12-06 42 views
9

專家;如何讓Mathematica用1代替0到0的電源?

鑑於

f = (#1^#2) & 

有一種方法,以限定上述這樣「F」,如果#1 #2都爲0,那麼純函數「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

+2

您確定要將它們評估爲1而不是0嗎?該符號使得它看起來好像您正在評估指數是非負整數或可能是實數的多項式。連續性考慮將表明,在這種情況下,值0可能更可取。 –

+0

@DanielLichtblau,好的,謝謝,將0^0替換爲0而不是1。但是,無論是哪種情況,如果我使用IF THEN ELSE(或者通過爲每個可能情況定義許多不同簽名來實現其功能)仍然有16種不同情況。希望有一種方法可以將這個短路,但告訴Mathematica用X代替0^0,其中X是正確的選擇(0或1,因爲它可能是)。 – Nasser

+0

另請參閱本數學小組討論:http://mathforum.org/kb/message.jspa?messageID=6577581&tstart=0以及關於程序員SE的這個問題:http://programmers.stackexchange.com/questions/9788/how- do-language-x-handle-indeterminate-forms-like-00 –

回答

10

我同意@Deep黃色的答案,但如果你堅持一個純粹的功能,這裏是一個辦法:

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 
+0

+1不錯,雖然讓我指出'f [foo,0]'爲未定義的'foo'返回'1'。 –

+0

@深黃色感謝您的支持。關於你的評論 - 這是預期的,並且基於「Power」的內置規則,而不是我的特定定義。您的解決方案展現出相同的行爲 –

+0

Oh yeah :-) * Mathematica *假設未定義的表達式對於'Power'而言不等於零。 –

4

您可以嘗試像f = Quiet[Check[#1^#2,1]] &寫它。

Quiet將抑制"Power::indet: "Indeterminate expression 0^0 encountered."消息,並且Check將取代1的結果,如果它是不確定的。

使用s = Quiet[Check[#1, 1]]這樣的函數可能會更好,並將其中的表達式包裝在其中。

+5

請注意,這也將抑制產生相同錯誤和輸出1的所有內容,而不管這是否是期望的結果。例如,'f [0,I]'。 – abcd

16

當然有很多方法可以在Mathematica中做事,但我經常使用的設計慣用法是編寫「函數」(實際上是一種模式),其特性越來越小。 Mathematica有一個屬性,它將在較少特定之前應用更具體的模式。

因此,對於你的情況下,我只是寫:

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

我假設你指望一個整數的工作,因爲這是這種類型的情況,例如通常的情況下在評估伯恩斯坦基函數時。

+0

+1好,沒有多餘的答案。順便說一句,我想你的意思是說「具有降低的特異性」。 – DavidC

+0

@DavidCarraher:謝謝,糾正。 –

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՝,因此可能很難區分不同筆記本的上下文以避免此修補程序產生衝突。

相關問題