es wäre sicherlich einfacher sich da reinzudenken wenn du ein beispiel zur verfügung stellst das dieses verhalten reproduziert.
grüße
_________________
eine Möglichkeit ist ein Vorzeichenwechsel der Ableitung innerhalb des Integrationsschritt, eine weitere ein Fehler bei der Anwendung von ode45. Ansonsten siehe Winkow Beitrag.
Grüße,
Harald
Steffi95
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 27.08.2015, 09:51
Titel:
Hallo,
vielen Dank für eure Antworten!
Ich habe das Problem gefunden. Ich habe für verschiedene Fälle zur Berechnung von y'. Ab einem bestimmten Zeitpunkt t, soll y' anders berechnet werden. Beim Debuggen ist mir aufgefallen, dass der Solver zwischen den beiden Fällen hin und her springt. Ich nehme an, dass der Solver damit nicht zurecht kommt. Durch Ändern der Fallbedingungen tritt das Problem nicht mehr auf.
in solchen Fällen sollten Events oder separate ode45-Aufrufe verwendet werden.
Grüße,
Harald
Steffi95
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 28.08.2015, 11:01
Titel:
Hallo Harald,
vielen Dank für den Tipp mit den Events. Ich versuche es nun darüber zu lösen.
So wie ich die Funktion bisher verstanden habe, bricht ode45 ab, sobald in meiner Event-Funktion der Variable value = 0 und iserminal = 1 ist.
Ich habe nun das Problem, dass meine Funktion je nachdem in welchem Wertebereich ein bestimmter Wert A liegt verschiedene Fälle zur Berechnung von y' verwendet (s. Code)
Mir fällt keine Möglichkeit ein, wie ich diese Bedingungen in die Event-Funktion einbinden kann. Die if-Bedingunen einfach zu übernehmen würde ja dazu führen, dass mein ode45 ständig abbrechen würde.
Ich möchte die verschiedenen Fälle zur Berechnung von y' gerne in einer Funktion beibehalten, also dass abhängig vom vorliegenden Event meine Funktion den richtigen Fall auswählt.
Hat da jemand eine Idee, wie man das umsetzen könnte?
Das Problem bei der Sache ist, dass meine Variablen A und C keine Zeitpunkte darstellen, sondern Werte die abhängig von t sind (A = f(t), C = f(t)). B ist eine Konstante.
Leider wird der Wert A allerdings nicht identisch B, sondern er überschreitet diesen ab einem bestimmten Zeitpunkt, sodass der Wert value mit dem nachfolgenden Code niemals 0 wird (sondern negativ).
Noch eine allgemeine Frage zu der Event-Funktion:
Ich habe die Funktion so verstanden, dass bei value = 0 und isterminal = 1 der solver ode45 abbricht und bei isterminal = 0 weiterrechnet.
Überspringt der Solver bei isterminal = 0 somit den Zeitpunkt des Events (wenn value = 0)? Oder welchen Zweck hat die Event-Funktionen wenn isterminal = 0?
Das Problem bei der Sache ist, dass meine Variablen A und C keine Zeitpunkte darstellen, sondern Werte die abhängig von t sind (A = f(t), C = f(t)).
Dann also f in der Event-Funktion aufrufen, genau so wie du das schreibst?
Zitat:
Leider wird der Wert A allerdings nicht identisch B, sondern er überschreitet diesen ab einem bestimmten Zeitpunkt, sodass der Wert value mit dem nachfolgenden Code niemals 0 wird (sondern negativ).
Kein Problem. Es wird ja nach Vorzeichenwechseln (Nulldurchgängen) von value gesucht.
Zitat:
welchen Zweck hat die Event-Funktionen wenn isterminal = 0?
Dass man den Zeitpunkt des Vorzeichenwechsels fein auflöst und ein Hin- und Herspringen zwischen den Zweigen vermeidet.
Grüße,
Harald
Steffi95
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 28.08.2015, 15:30
Titel:
Hallo Harald,
noch einmal vielen Dank für deine bisherige Hilfe!
Ich habe deine angegebenen Änderungen der Event-Funktion umgesetzt.
Jetzt habe ich allerdings das Problem, dass ode45 die ode-Funktion innerhalb eines Zeitschritts mehrmals aufruft, ohne dazwischen die Event-Funktion abzufragen. Dadurch springt er bei der Berechnung von y' innerhalb eines Zeitschritts trotzdem zwischen den verschiedenen Fällen hin und her und liefert ein unrealistisches Ergebnis.
Hast du dafür eventuell auch einen Lösungsvorschlag?
Jedenfalls ist das Problem bei meiner Funktion, dass innerhalb meiner ODE-Funktion mein y' zwar stets postitiv oder 0 ist, jedoch mein integrierter Wert negativ werden kann. Dies führt in meiner Funktion zu Fehlern.
Das Problem trifft in folgendem Beispiel (y' = 0 oder positiv) ebenfalls auf.
Ich gehe davon aus, dass das Problem ist, dass mein y' (entpsricht f in ode45) innerhalb der ODE-Funktion von 0 auf einen positiven Wert springt. Durch Multiplikation mit einem negativen Koeffizienten aus Matrix B wird daraus ein negatives delta y und damit ein negatives y für y0 = 0.
Leider habe ich keine Ahnung, wie ich dem entgehen kann.
Hast du vielleicht eine Idee?
Generell würde ich nested functions meiden. Das kann schnell zum unbeabsichtigten Überschreiben von Variablen führen. Stattdessen könnte man hier local functions verwenden.
Grüße,
Harald
Einstellungen und Berechtigungen
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.