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

Events im ODE

 

Karen
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 04.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.10.2013, 10:50     Titel: Events im ODE
  Antworten mit Zitat      
Hallo,

[EDITED, Jan] Betr.:http://www.gomatlab.de/ode45-solver.....nd-uebergeben-t27436.html [/EDITED]

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 Smile
Private Nachricht senden Benutzer-Profile anzeigen
Gesplittet: 02.10.2013, 11:27 Uhr von Jan S
Von Beitrag ode45 Solver, Werte zur Laufzeit auslesen und übergeben? aus dem Forum Programmierung


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 02.10.2013, 11:30     Titel:
  Antworten mit Zitat      
Hallo Karen,

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?

Danke, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Karen
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 04.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.10.2013, 12:48     Titel:
  Antworten mit Zitat      
Hallo Jan,
entschuldige, das war mir nicht bewusst und danke für die schnelle Antwort Smile . 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;

tend = 100;
tspan = [0:0.2:tend];

X0 = [n0;d0;c0;e0];

options = odeset('Maxstep', 0.02, 'Events', @events);

t_glob = [];
x1 =[];
x2 = [];
x3 = [];
x4 = [];

% s is the result of another ODE with the same t, which is transfered to
% myode and used there in several equations

while v == 1;
    tend = 100;
    tspan = [0:0.2:tend];
    [t,x,te,ye,ie] = ode45(@(t,x)myode(t,x,time,s), tspan, options);
    x = max(0,x);
    t_glob = [t_glob; t(:,1)];
    x1 = [x1; x(:,1)];
    x2 = [x2; x(:,2)];
    x3 = [x3; x(:,3)];
    x4 = [x4; x(:,4)];
   
    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

hold on
plot(t,x1,'r')
plot(t,x2,'b')
plot(t,x3,'c')
plot(t,x4,'g')


function  [value,isterminal,direction]= events(t,x,time,s)

CC = x(3);
z = 3;
value(1) = CC-z;
isterminal(1) = 1;
direction(1) = 1;

end
end
function dx = f(t, x )
%Example
 Nr = x(1);
 y = 0.8* Nr;
 d = 3*Nr;
 c = x(2);
 e = c+500000;
 
dX = [y;d;c;e];


viele Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Karen
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 04.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.10.2013, 13:49     Titel:
  Antworten mit Zitat      
Hallo nochmal,

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;
 
dX = [Jy;Jd;Jc;Je];


Ich hoffe, so kann man´s verstehen.
viele Grüße
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: 02.10.2013, 22:54     Titel:
  Antworten mit Zitat      
Hallo Karen,

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.

Wie ist "s" definiert?

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

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 04.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.10.2013, 12:59     Titel:
  Antworten mit Zitat      
Hallo Jan,
danke für die Antwort und für das Anschauen des Programmes Smile. 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
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.