das Beispiel war sehr aufschlussreich für mich, da ich ein ähnliches Problem habe. Allerdings will ich in einer etwas anderen Weise eingreifen. Ich würde gerne einen Event einbauen bei dem einerseits die Anfangswerte von x verändert werden, was kein Problem ist, wenn man eine if Schleife einbaut. Andererseits soll aber auch die Veränderungrate von x(3) nach Errechen eines bestmmten Events der Veränderungsrate von x(1) entsprechen. Vor Erreichen dieses Events soll die Veränderungsrate von x(3) null sein. Da der Anfangswert von x(3) null ist, bleibt der Wert also bei null. Außerdem sollte vor Erreichen dieses Events die Veränderungsrate von x(2) der Veränderungsrate von x(1) entsprechen. Nach Eintritt des Events soll sich x(2) nicht mehr verändern. Zuerst hatte ich die If- Sätze in die Differnetialgleichungsfunktion (ebenfalls ein System aus Differentialgleichungen) eingebaut. Das ist aber ja, wie ich ja jetzt gelernt habe unsauber, wegen des Schrittweiten-Kontrollers. Mein Problem ist, dass ich nicht weiß, wie ich die Veränderungsraten in das Programm mit dem ODE solver sauber übergeben und wieder zurückgeben kann. Ich hatte naiverweise versucht die entsprechenden Veränderungsraten als globals zu definieren, aber dann funktioniert der ODE solver nicht mehr bzw. zählt die globals nicht als Outpt bzw Input Variablen für den ODE Solver, so dass ich die Fehlermeldung bekomme dass der Vektor der Anfangsbedingungen nicht der Länge des Vektors in der Datei des Differentialgleichungssystems entspricht. Ich wäre sehr dankbar, wenn jemand einen Tipp hätte, wie man in einem solchen Fall vorgehen könnte
Gesplittet: 02.10.2013, 11:27 Uhr von Jan S Von Beitrag ode45 Solver, Werte zur Laufzeit auslesen und übergeben? aus dem Forum Programmierung
Bitte hänge eine neue Frage nicht an einen bestehenden Thread an. Bei einem solchen Thread-Highjacking verliert man beim Lesen den Überblick, auf welche Frage sich eine Antwort bezieht. Zudem wirde der "beantwortet"-Status dann sinnfrei.
Ich verstehe Deine Frage noch nicht.
Zitat:
Ich würde gerne einen Event einbauen bei dem einerseits die Anfangswerte von x verändert werden, was kein Problem ist, wenn man eine if Schleife einbaut.
Wie könnte ein Event denn die Anfangswerte ändern? Die Anfangswerte werden doch beim Aufruf des Integrators definiert, sie während der Integration zu ändern ist für mich unverständlich.
Zudem gibt es keine IF-Schleifen, so kann ich nicht erahnen, was Du genau meinst. Kannst Du den entsprechenden Code posten?
Hallo Jan,
entschuldige, das war mir nicht bewusst und danke für die schnelle Antwort . Sorry, ich meinte if Verzweigungen, die in einer Schleife eingebaut sind. Also wenn der Event passiert, sollen bestimmte Dinge gemacht werden. Der Code selbst ist leider zu lang, um ihn hier einzufügen , aber hier ist ein Beispielcode, der übersichtlicher ist: Ich hoffe ich habe das diesmal mit dem richtigen einfügen hinbekommen
Code:
% Das ist mein Programm. function odesolver
a = 0;
b = 12;
d0 = 1000000;
n0 = 1000;
c0 = 100;
e0 = 800;
lent = length(t);
if(t(lent) >= tend)% if a certain time is reached, the loop should break
v = 0;
else
telen = length(te);
if ie(telen) == 1% event no1
Jd = Jc;
Je = 0;
X0 = [x(telen,1);x(telen,2);x(telen,3);x(telen,4)]; % old initial % conditions else
Je = Jc;
Jd = 0;
X0 = [x(telen,1);x(telen,2);x(telen,3);0]; % new initial contitions % e as a state variable is zero end end end
% here a second event would also be expressed similar to event no 1 % the second event just takes place if event 1 takes place (afterwards) % and is dependent on the altered process Je
sorry, mir ist gerade aufgefallen, dass ich vergessen hatte die letzte Funktion zu verändern:
statt der Funktion dx müsste dort also stehen:
Code:
% Das ist mein Programm. function myode = f(t, X, time, s)
%Example
st = interp1(time,s,t);
Nr = X(1);
Jy = 0.8* Nr*s;
Jd = 3*Nr*s;
Jc = X(2);
Je = Jc+500000;
Linear-interpolierte Parameter sind nicht stetig differenzierbar. Deshalb wird der ODE-Solver nicht sauber damit arbeiten können. Falls ODE45 überhaupt die Integration ohne Fehlermeldung beenden kann, würde ich den Ergebnissen nicht trauen.
Hallo Jan,
danke für die Antwort und für das Anschauen des Programmes . s ist ein Vektor mit Werten, die sich sich jeweils auf einen bestimmten Zeitpunkt zwischen t0 und tend beziehen. Ich bin leider noch nichtt so sehr mit Matlab bzw. auch mit den mathemProblemen vertraut. Ich hatte die Vorstellung, dass ich die Werte von s, die sich auf verschiedene Zeitpunkte beziehen, in dem anderen Programm 'myode' sozusagen wieder "entpacken" kann so dass jeweils der richtige Wert zu dem entsprechenden t in 'myode' verwendet wird. Aber, wenn ich dich richtig verstehe, geht das nicht. Oder meinst du dass durch die Interpolation etwas ganz anderes geschiet und ich einen generellen Denkfehler dadrin habe? Wäre es eine bessere Möglichkeit s in dem anderen Programm, in dem ich den odesolver benutze einzubauen? Allerdings bekomme ich dann glaube ich inhaltliche Probleme, da ich keine experimentellen Wertefür die Anfangswerte sämtlicher Prozesse habe und ich auch nicht sicher bin, ob ich von der mathematischen Logik her diese Prozesse mit dem ODEsolver lösen darf.
viele Grüße,
Karen
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.