WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Zwei Vektoren aus ode in äquidistante Werte interpolieren

 

BernhardV
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 22.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.11.2011, 16:50     Titel: Zwei Vektoren aus ode in äquidistante Werte interpolieren
  Antworten mit Zitat      
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)];

    tstart = tout(n); % Anpassen der Integrationsgrenzen
    tspan = [tstart tend];
   
    if (tstart >= tend) % Abbruch wenn Endzeit erreicht
        break
    end
end
 
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 22.11.2011, 18:11     Titel: Re: Zwei Vektoren aus ode in äquidistante Werte interpolier
  Antworten mit Zitat      
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?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
BernhardV
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 22.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.11.2011, 20:02     Titel:
  Antworten mit Zitat      
Hey Jan!

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.

Grüße
BernhardV
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.11.2011, 20:15     Titel:
  Antworten mit Zitat      
Hallo,

wenn du die Lösung zu bestimmten Zeitpunkten haben willst, gib die doch als tspan an, z.B.
Code:
tspan = tstart:0.1:tend;


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 22.11.2011, 21:29     Titel:
  Antworten mit Zitat      
Hallo BernhardV,

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.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
BernhardV
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 22.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.11.2011, 21:54     Titel:
  Antworten mit Zitat      
Hey Harald

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?

Liebe Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.11.2011, 22:21     Titel:
  Antworten mit Zitat      
Hallo,

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.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 23.11.2011, 01:11     Titel:
  Antworten mit Zitat      
Huhu BernhardV!

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.

Beispiel:
http://www.mathworks.com/help/techd...../f1-662913.html#f1-669698
Hier wird aber leider nicht gezeigt, wie man am praktischsten Parameter der ODE-Funktion ändert.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.