Verfasst am: 22.11.2011, 16:50
Titel: Zwei Vektoren aus ode in äquidistante Werte interpolieren
Hallo!
Ich habe folgendes Problem. Mit dem ode45 schreibe ich die Lösung einer Differentialgleichung in die Variablen [tout xout]. Der Solver arbeitet ja iterativ und verändert die Zeitschritte. Das geht alles korrekt. Ich möchte jetzt mit Hilfe des Vektors tout die Werte von xout zu bestimmten Zeiten interpolieren. interp1 will nicht arbeiten, da die Werte wohl nicht distinct sind und wenn ich die Nullen vorne weglösche steht auf einmal NaN da.
Danke schonmal im Voraus und viele Grüße
Bernhard
PS: Hier mein verwendetes CodeSnippet. Vielleicht weiß ja jemand, wie ich das so umsetze, dass ich deval nutzen könnte.
Code:
while(1) % Integration der Differentialgleichung [tout xout] = ode45(@xpunkt_halbkfz, tspan, x0, options, s);
n = length(tout); % Anzahl der Simulationsschritte
t = [t; tout]; % Akkumulation von t und x
x = [x; xout];
s = 0.15; % Straßenlevel auf Bordsteinniveau als Event
x0 = [xout(1), xout(2), xout(3), xout(4), xout(5), xout(6), xout(7), xout(8)];
Verfasst am: 22.11.2011, 18:11
Titel: Re: Zwei Vektoren aus ode in äquidistante Werte interpolier
Hallo BernhardV,
Ich verstehe nicht, wozu die WHILE-Schleife nötig ist. ODE45 integriert über das Intervall tspan. Nach der ersten Iteration wird tspan=[tout(n), tend] gesetzt. Also wird tend auch (spätestens) in der zweiten Iteration erreicht. Ist die Schleife dann wirklich hilfreich? Oder könntest Du nicht gleich bis tend integrieren?
Die While ist wichtig, da ich den ode mit Events steuer. Es passiert bei 5 Sekunden ein diskretes Ereignis, der ode muss stoppen, die Variable s ändern und dann von dort weiter loslegen mit den aktuellen ABen.
Kannst Du nicht Event-Funktionen für diesen Zweck verwenden? Das wäre effizienter und ist genau für diesen Zweck gedacht.
Beim Zusammenfassen der Ergebnisse speicherst Du den ersten und letzten Zeitpunkt. Bei der Iteration ist aber der alte Endpunkt der neue Startpunkt. Diesen doppelten Punkt kannst Du einfach weglassen.
Fürs erste klappt es mit diesem Ansatz. Allerdings dürften die Ergebnisse doch relativ dürftig sein, wenn ich dem Solver eine Schrittweite aufzwinge, oder?
Grüße
Huhu Jan!
Ich mache das ganze mit der Eventfunktion. Die beendet zum rechten Zeitpunkt die Integration und ändert den Wert s dann wird losintegriert. Gibt es günstigere Lösungen? Hättest du ein Minimalbeispiel, wie man Event-Fct. einsetzt?
ganz im Gegenteil, die Ergebnisse sind so gut, wie sie nur sein können. Der Solver macht ja Zwischenschritte, wo es notwendig ist und beendet Schritte höchstens vorzeitig an den gewünschten Punkten.
Bei nachträgliche Interpolation kommt dagegen zum Simulationsfehler (durch ode45 gesteuert) ein Interpolationsfehler hinzu; man müsste also diesen Interpolationsfehler zusätzlich analysieren, um die Genauigkeit der Punkte abschätzen zu können. Vor allem aber schert sich ode45 nicht um den (nachträglichen) Interpolationsfehler - wie auch.
Wenn Du Eventfunktionen verwendest, wäre es praktisch, das auch explicit zu posten. Du hast zwar geschrieben, dass Du "den ode mit Events steuerst". Das erlaubt aber noch nicht eindeutig zu verstehen, was das Programm genau macht.
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.