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]
War es hilfreich?

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}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top