2010-03-22 44 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