Странное поведение подстановки в Mathematica
-
21-09-2019 - |
Вопрос
Мой вопрос заключается в следующем:почему следующее не работает, и как мне это исправить?
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]
Решение
Mathematica пытается оценить график перед подстановкой.Вы можете предотвратить это с помощью функций Hold и ReleaseHold:
ReleaseHold[Hold[Plot[f[t],{t,0,2*Pi}]] /. {{f -> Sin},{f -> Cos}}]
Hold[] заставит все подвыражение Plot оставаться неупрощенным во время выполнения замены, затем ReleaseHold[] позволит ему продолжить фактическое построение графика.
Другие советы
В качестве альтернативы Питеру Hold
/ReleaseHold
стратегия, которую вы могли бы сделать
Plot[Evaluate[ f[t]/. {{f -> Sin}, {f -> Cos}} ], {t, 0, 2*Pi}]
который немного чище для чтения.Это гарантирует, что f
заменяется перед Plot
оценивается.
Этот еще короче:
Plot[#[t], {t, 0, 2*Pi}] & /@ {Sin, Cos}