Mathematica中奇怪的替换行为

时间:2010-03-22 02:33:28

标签: 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}}

给出

{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]

3 个答案:

答案 0 :(得分:7)

作为彼得Hold / ReleaseHold策略的替代方案,你可以做到

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

阅读起来有点干净。这可确保在评估f之前替换Plot

答案 1 :(得分:7)

这个更短:

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

答案 2 :(得分:4)

Mathematica试图在替换之前评估Plot。您可以使用Hold和ReleaseHold函数来阻止它:

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

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