Wolfram mathematica Mathematica中的奇怪替代行为

Wolfram mathematica Mathematica中的奇怪替代行为,wolfram-mathematica,substitution,Wolfram Mathematica,Substitution,我的问题是:为什么下面的代码不起作用,我该如何修复它 Plot[f[t], {t, 0, 2*Pi}] /. {{f -> Sin}, {f -> Cos}} 结果是两个空白图。相比之下 DummyFunction[f[t], {t, 0, 2*Pi}] /. {{f -> Sin}, {f -> Cos}} 给予 如所愿 这是我实际所做工作的简化版本。我很恼火,即使在找到了令人恼火的“正确的方法”放上花括号后,什么都不起作用 最后,我做了以下工作,效果很好: p[f

我的问题是:为什么下面的代码不起作用,我该如何修复它

Plot[f[t], {t, 0, 2*Pi}] /. {{f -> Sin}, {f -> Cos}}
结果是两个空白图。相比之下

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

如所愿

这是我实际所做工作的简化版本。我很恼火,即使在找到了令人恼火的“正确的方法”放上花括号后,什么都不起作用

最后,我做了以下工作,效果很好:

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

Mathematica试图在替换之前对绘图进行评估。您可以通过保持和释放保持功能来防止这种情况:

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

执行替换时,Hold[]将强制整个绘图子表达式保持不简化状态,然后ReleaseHold[]将让它继续进行实际绘图。

作为Peter的
Hold
/
ReleaseHold
策略的替代方法,您可以这样做

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

读起来有点干净。这确保在计算
绘图
之前先替换
f

这一个更短:

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

谢谢你的回答。您的解决方案有输入错误,您应该有/。而不是第一个->。它起作用了。然而,为什么替换不在优先顺序的顶端,这对我来说毫无意义…(打字错误现在由拉马萨兰卡修复)我无法解释为什么操作顺序是这样的,但这不仅仅是情节。Mathematica将尝试计算/左侧的任何函数。(很抱歉前面的输入错误)在它执行替换之前。很多时候这并不重要:未定义的f[t]只会在函数定义中执行,直到执行替换为止。例如,myFun[x,l]:=x/@l;myFun[f,{1,2,3}]/。{{f->Sin},{f->Cos}将像您期望的那样工作。但是Plot[]是其中一个例子,其中f[t]未定义将导致立即错误。
Plot
在规则替换之前求值的原因是因为
/。
只是
ReplaceAll
函数的中缀运算符<代码>f[x]/。因此,x->y只是表达式
ReplaceAll[f[x],x->y]
ReplaceAll
没有任何
Hold*
属性。有关Mathematica求值语义的更多基础知识,请参阅本教程:您甚至不需要
Evaluate[]
,只需将替换移动到
绘图[]
中就足够了
Plot[f[t]/.{{f->Sin},{f->Cos},{t,0,2*Pi}]
@Isaac:不总是这样。我曾多次发现有必要先对
进行求值
,否则
绘图
无法达到预期效果。@rcollyer:是的,这取决于被替换的内容。在这个特定的例子中,它就像我说的那样工作,尽管(至少在7.0.1.0中对我来说)您的代码以两种不同的颜色生成曲线,而我的代码以相同的颜色生成两条曲线。当然,你的代码和我的代码都会在一个网格上生成两条曲线,这可能不是原始海报的意图(可能是两个单独的网格)。很抱歉,我一直在跳我接受的答案。我意识到艾萨克是对的:我确实想要两个独立的地块。不过,你的答案仍然很有趣。使用
评估
意味着替换只执行一次,然后结果由
绘图
使用;如果没有
Evaluate
ReplaceAll
将在每个绘图点进行一次。然后,
Plot
将不会进行自动赋予曲线不同颜色的分析。如果你不做简单的事情,它也会变慢——在
/的右侧粘贴一个
NDSolve
如果
Evaluate
不存在,你可能有时间喝杯咖啡。10次计算中有9次是正确的解决方案:例外情况是,如果您试图绘制的东西需要一个数值参数才能工作。这非常好!我接受Peter的答案,因为它看起来不像一个谜题,但这确实是一种将我的“解决方案”缩短为一行的酷方法。为了进一步游说这种方法(Peter的可以以同样的方式进行扩展),可以使用
MapIndexed
MapThread
对其进行扩展,以允许您对每个绘图进行不同的样式设置。此外,还可以使用
Show
组合它们,以创建相当复杂的绘图。(这是我在数据分析中倾向于使用的方法。)
Plot[#[t], {t, 0, 2*Pi}] & /@ {Sin, Cos}