Mathematica中奇怪的替换行为

Ily*_*lya 4 wolfram-mathematica substitution

我的问题是:为什么以下工作没有,我该如何解决?

Plot[f[t], {t, 0, 2*Pi}] /. {{f -> Sin}, {f -> Cos}}
Run Code Online (Sandbox Code Playgroud)

结果是两个空白图.通过比较,

DummyFunction[f[t], {t, 0, 2*Pi}] /. {{f -> Sin}, {f -> Cos}}
Run Code Online (Sandbox Code Playgroud)

{DummyFunction[Sin[t], {t, 0, 2 *Pi}],  DummyFunction[Cos[t], {t, 0, 2 * Pi}]}
Run Code Online (Sandbox Code Playgroud)

如预期的.

这是我实际做的简化版本.我非常恼火,即使在找出令人讨厌的"正确方式"放置花括号之后也无济于事.

最后,我做了以下工作:

p[f_] := Plot[f[t], {t, 0, 2*Pi}]
p[Sin]
p[Cos]
Run Code Online (Sandbox Code Playgroud)

rco*_*yer 7

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

Plot[Evaluate[ f[t]/. {{f -> Sin}, {f -> Cos}} ], {t, 0, 2*Pi}]
Run Code Online (Sandbox Code Playgroud)

这是一个更清洁的阅读.这确保fPlot评估之前替换.


gde*_*ino 7

这个甚至更短:

Plot[#[t], {t, 0, 2*Pi}] & /@ {Sin, Cos}
Run Code Online (Sandbox Code Playgroud)


Pet*_*ley 5

Mathematica 正在尝试在替换之前评估 Plot。您可以使用 Hold 和 ReleaseHold 函数来防止这种情况:

ReleaseHold[Hold[Plot[f[t],{t,0,2*Pi}]] /. {{f -> Sin},{f -> Cos}}]
Run Code Online (Sandbox Code Playgroud)

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