2010-03-22 43 views
4

我的問題是:爲什麼不做以下工作,以及如何解決?Mathematica中替換的奇怪行爲

Plot[f[t], {t, 0, 2*Pi}] /. {{f -> Sin}, {f -> Cos}} 

結果是兩個空白圖。通過比較,如所期望

DummyFunction[f[t], {t, 0, 2*Pi}] /. {{f -> Sin}, {f -> Cos}} 

給出

{DummyFunction[Sin[t], {t, 0, 2 *Pi}], DummyFunction[Cos[t], {t, 0, 2 * Pi}]} 

這是什麼我實際上做一個簡化版本。我非常惱火,即使在弄清楚把花括號放在哪裏的煩人的「正確方法」都沒有用。

最後,我做了以下,其工作方式:

p[f_] := Plot[f[t], {t, 0, 2*Pi}] 
p[Sin] 
p[Cos] 

回答

4

數學正試圖評估替代之前情節。您可以防止與保持和ReleaseHold功能:

ReleaseHold[Hold[Plot[f[t],{t,0,2*Pi}]] /. {{f -> Sin},{f -> Cos}}] 

按住[],將迫使整個小區的子表達式在執行該替換,以保持繁體字,然後ReleaseHold []將讓它與實際繪圖進行。

+0

謝謝您的回答。你的解決方案有一個錯字,你應該有/。而不是第一個 - >。有用。然而,對我而言,爲什麼替代不會處於優先順序的頂部...... – Ilya 2010-03-22 02:52:03

+0

(這個錯字現在由Ramasalanka修復) – Ilya 2010-03-22 02:54:56

+0

我無法解釋爲什麼操作的順序是它的方式是,但它不只是劇情。 Mathematica將嘗試評估/左側的任何函數。 (對於錯字較早),然後再執行替換。很多時間無關緊要:未定義的f [t]將通過函數定義進行,直到執行替換。例如,myFun [x_,l_]:= x/@ l; myFun [f,{1,2,3}] /。 {{f-> Sin},{f-> Cos}}會像你期望的那樣工作。但Plot []是未定義f [t]將導致立即錯誤的示例之一。 – 2010-03-22 02:59:04

7

至於彼得Hold/ReleaseHold戰略可選方案,你可以做

Plot[Evaluate[ f[t]/. {{f -> Sin}, {f -> Cos}} ], {t, 0, 2*Pi}] 

這是一個小清潔閱讀。這確保fPlot被評估之前被替換。

+0

您甚至不需要'Evaluate []',只需移動'Plot []'內部的替換就足夠了。 'Plot [f [t] /。 {{f - > Sin},{f - > Cos}},{t,0,2 * Pi}]' – Isaac 2010-03-22 07:57:32

+0

@Isaac:並不總是。有些時候我發現有必要先評估一下,否則'Plot'不能達到你所期望的。 – rcollyer 2010-03-22 18:46:19

+0

@ rcollyer:是的,這取決於什麼被取代。在這個特殊的例子中,雖然(至少在7.0.1.0中)我的代碼能夠正常工作,但您的代碼會以兩種不同的顏色生成曲線,而我的代碼會以相同的顏色生成兩條曲線。當然,你的代碼和我的代碼都會在一個網格上產生兩條曲線,這可能不是原始海報的意圖(也許是兩個獨立的網格)。 – Isaac 2010-03-22 21:17:07

7

這一個更短:

Plot[#[t], {t, 0, 2*Pi}] & /@ {Sin, Cos} 
+0

這真是太棒了!我接受彼得的答案,因爲它看起來不像一個謎題,但這肯定是一種很酷的方式,可以將我的「解決方案」縮短爲一條線。 – Ilya 2010-03-23 02:41:15

+0

爲了進一步遊說這種方法(並且可以用相同的方式擴展Peter的方法),可以使用MapIndexed或MapThread來擴展這個方法,讓您以不同方式繪製每個繪圖。此外,他們可以使用「Show」來創建相當複雜的圖表。 (這是我傾向於在我的數據分析中傾向的方法。) – rcollyer 2010-03-23 12:25:42