Seltsames Verhalten der Substitution in Mathematica
-
21-09-2019 - |
Frage
Meine Frage ist: Warum funktioniert die folgende Arbeit, und wie kann ich es beheben
Plot[f[t], {t, 0, 2*Pi}] /. {{f -> Sin}, {f -> Cos}}
Das Ergebnis ist zwei leeren Graphen. Zum Vergleich:
DummyFunction[f[t], {t, 0, 2*Pi}] /. {{f -> Sin}, {f -> Cos}}
gibt
{DummyFunction[Sin[t], {t, 0, 2 *Pi}], DummyFunction[Cos[t], {t, 0, 2 * Pi}]}
wie gewünscht.
Dies ist eine vereinfachte Version von dem, was ich eigentlich tun. Ich war verärgert sehr, dass auch nach dem lästigen „richtigen Weg“, herauszufinden, der die geschweiften Klammern nichts Werke setzen.
Am Ende habe ich die folgenden, die funktioniert:
p[f_] := Plot[f[t], {t, 0, 2*Pi}]
p[Sin]
p[Cos]
Lösung
Mathematica versucht Plot vor dem Wechsel zu bewerten. Sie können dies verhindern mit dem Halten und Releasehold Funktionen:
ReleaseHold[Hold[Plot[f[t],{t,0,2*Pi}]] /. {{f -> Sin},{f -> Cos}}]
Halten Sie [] wird der gesamte Plot subexpression zwingen, nicht vereinfachten zu bleiben, während die Substitution durchgeführt wird, dann Releasehold [] lässt es mit dem eigentlichen Plotten gehen.
Andere Tipps
Als Alternative zu Peters Hold
/ ReleaseHold
Strategie tun Sie könnten
Plot[Evaluate[ f[t]/. {{f -> Sin}, {f -> Cos}} ], {t, 0, 2*Pi}]
, die ein wenig sauberer zu lesen ist. Dadurch wird sichergestellt, dass f
ersetzt wird, bevor Plot
ausgewertet wird.
Dies ist sogar noch kürzer:
Plot[#[t], {t, 0, 2*Pi}] & /@ {Sin, Cos}