Странное поведение замещения в Mathematica - PullRequest
4 голосов
/ 22 марта 2010

У меня вопрос: почему не работает следующее и как мне это исправить?

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 ]

7 голосов
/ 22 марта 2010

В качестве альтернативы стратегии Питера Hold / ReleaseHold вы можете сделать

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

что немного чище читать. Это обеспечивает замену f до оценки Plot.

7 голосов
/ 22 марта 2010

Это еще короче:

Plot[#[t], {t, 0, 2*Pi}] & /@ {Sin, Cos}
4 голосов
/ 22 марта 2010

Mathematica пытается оценить участок перед заменой. Вы можете предотвратить это с помощью функций Hold и ReleaseHold:

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

Удержание [] заставит все подвыражение графика оставаться не упрощенным, пока выполняется замена, затем ReleaseHold [] позволит ему продолжить фактическое построение.

...