Frage

Ich habe auf ein Problem gestoßen, als ich versucht habe, die Antwort von a zu verwenden NdSsolve In zwei separaten Handlungsbefehlen. Um das Problem zu veranschaulichen, werde ich eine einfache Differentialgleichung und nur einen Handlungsbefehl verwenden. Wenn ich so etwas schreibe:

{Plot[x[t], {t, 0, 10}], x[4]} 
/. NDSolve[{x'[s] == - x[s], x[0] == 1}, x, {s, 0, 10}]

Es löst die Gleichung und berechnet X [4] ohne Problem, aber die Handlung wird leer, und ich habe keine Ahnung warum.

In meinem tatsächlichen Problem ist meine Gleichung ein ziemlich kompliziertes System für mehrere Funktionen und statt von x [4 Ich zeichne ein parametrisches Diagramm der gelösten Funktionen. Ich habe letztendlich vor, all dies in a aufzunehmen Manipulieren Aussage, damit ich das nicht will NdSsolve Aussage, um mehr als einmal zu erscheinen (dauert zu lange) und ich kann sie nicht einfach im Voraus berechnen (da es viele Parameter enthält).


EDIT: Ich möchte meine Frage klären und erweitern: Was ich tatsächlich tun möchte, ist, meine Plot -Erklärung in a einzubeziehen Manipulieren Aussage auf folgende Weise:

Manipulate[{Plot[x[t], {t, 0, 10}], x[4]} 
/. NDSolve[{x'[s] == - a*x[s], x[0] == 1}, x, {s, 0, 10}]
,{{a,1},0,5}]

Da nur die Manipulieren Anweisung gibt den Parameter Wert an a, Ich kann die Antwort auf die nicht berechnen NdSsolve vorweg. Da mein tatsächliches Gleichungssystem sehr kompliziert und nicht linear ist, kann ich die symbolische Funktion nicht verwenden DSOLVE.

Entschuldigung, wenn es vorher nicht klar war.

War es hilfreich?

Lösung

Ihr Problem ist, dass die Handlung [] einige lustige Dinge tut, um das Verschwören bequemer zu gestalten, und eines der Dinge, die es tut, ist einfach nicht die Aufzeichnung von Dingen, die sie nicht numerisch bewerten können. Also in dem Ausdruck, den du gepostet hast,

Plot[x[t], {t, 0, 10}]

Geht nur weiter und bewertet Vor Durch die Regelersatz durch die Lösung von NDSolve und erzeugt ein Grafikobjekt eines leeren Diagramms. Dieses Grafikobjekt enthält keinen Verweis auf X, daher gibt es nichts zu ersetzen.

Sie möchten sicherstellen, dass die Substitution vor der Verschwörung erfolgt. Wenn Sie auch sicherstellen möchten, dass die Substitution an mehreren Stellen erfolgen kann, möchten Sie die Lösung in eine Variable speichern.

sol = NDSolve[{x'[s] == - x[s], x[0] == 1}, x, {s, 0, 10}];
{Plot[Evaluate[x[t] /. sol], {t, 0, 10}], x[4] /. sol} 

Die Bewertung [] in der Handlung stellt sicher, dass Mathematica nur einmal die Substitution anstelle von einmal für jeden Plotpunkt ausführt. Es ist nicht wichtig für eine einfache Regelersatz wie diese, aber es ist eine gute Angewohnheit, sie zu verwenden, falls Sie jemals etwas komplizierteres zeichnen möchten.


Um diese Arbeit manipuliert zu machen, besteht die einfache Art und Weise, mit [] zu verwenden, was eines der Scoping -Konstrukte von Mathematica ist. Es ist diejenige, die Sie verwenden können, bei der Sie nur etwas ersetzen möchten, ohne es als Variable zu verwenden, die Sie mutieren können.

Zum Beispiel,

Manipulate[
  With[{sol = NDSolve[{x'[s] == - x[s], x[0] == 1}, x, {s, 0, 10}]},
    {Plot[x[t] /. sol // Evaluate, {t, 0, 10}, PlotRange -> {0, 1}], 
     x[4] /. sol}],
  {{a, 1}, {0, 5}}]

Verwenden Sie die Option PlotRange, um die y-Achse fest zu halten. Andernfalls springen die Dinge auf hässliche Weise, wenn sich der Wert eines ändert. Wenn Sie komplexere Dinge mit manipulierter machen, gibt es eine Reihe von Optionen, um die Geschwindigkeit der Aktualisierungen zu steuern.

Andere Tipps

In der Zwischenzeit fand ich einen anderen Weg, dies zu tun. Es ist weniger elegant, aber es verwendet nur einen Substitution, also habe ich gedacht, ich werde es auch hier veröffentlichen.

Die Idee ist zu verwenden Halt auf der Parzelle Es würde also nicht bewertet werden, die Regelsubstitution machen und dann Release, kurz vor dem Manipulieren.

Manipulate[ReleaseHold[
  Hold[ {Plot[x[t], {t, 0, 10}, PlotRange -> {0, 1}], x[4]} ]
 /.NDSolve[{x'[s] == -a x[s], x[0] == 1}, x, {s, 0, 10}]
], {{a, 1}, 0, 5}]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top