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

ode15s nach bestimmter Zeit abbrechen

 

IsaacK

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.05.2009, 14:21     Titel: ode15s nach bestimmter Zeit abbrechen
  Antworten mit Zitat      
Hallo,

ich arbeite gerade an einer Parameterschätzung für nichtlineare DGL-Systeme. Innerhalb meines Optimierungsalgorithmus rufe ich etliche Male den ode15s Solver auf um mein DGL System mit immer wieder unterschiedlichen Parametern zu lösen. Für manche Parameterkonstellationen scheint das System aber auch für ode15s zu steif zu werden und der Solver hängt sich quasi auf; braucht also ewig für eine Lösung von der ich in solchen Fällen schon weiß, dass sie für meine Zwecke nichts taugt.
Daher meine Frage: gibt es eine Möglichkeit einer laufenden Matlab-Fkt. ein Zeitlimit zu geben innerhalb derer Sie fertig sein muss und ansonsten abgebrochen wird?

Danke schon mal!
Isaac


Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 25.05.2009, 16:16     Titel:
  Antworten mit Zitat      
Hallo Isaac,

das könnte man eventuell über eine eigene OutputFunction ermöglichen. Für die Zeitmessung nehme ich hier etime und clock, und am einfachsten ist es, die OutputFunction in die Zielfunktion der Optimierung zu schachteln ("nested function"). Hier ein Gerüst zum Ausfüllen:

Code:
function fval = objective(params)

options = odeset('OutputFcn',@myfun);

starttime = clock;
[T,Y] = ode15s(@odefun,tspan,y0,options);

function dy = odefun(t,y)
%    dy = ...
end

function status = myfun(t,y,flag)
status = 0;
if isempty(flag) &&  etime(clock,starttime) > maxtime  
    status = 1;
end
end

end


Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
S2PID
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 18.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.05.2009, 18:36     Titel:
  Antworten mit Zitat      
Hi Isaac,
Vor etwas mehr als einer Woche hatte ich genau das gleiche Problem. Ansich würde man denken das es doch irgendwo so eine Option geben müsste oder das zumindest die Timerfunction hierfür verwendet werden könnte. Prinzipiell ist es aber so, dass du eine laufende Funktion nur intern terminieren kannst und nicht über eine extern aufgerufene Funktion, wie zb. durch Timerfunctions.

Heißt im Schluss,... du musst eine Abfrage direkt in die ODE-Berechnung einbauen und kannst mit den Timerfunktions meines Wissens nichts ausrichten. Wenn du wie ich SMBL kodierte Modelle verwendest bist du am Ende der Fahnenstange angekommen.

Falls nicht, zitiere Ich an der Stelle mal Outsider mit dem ich darüber eine Diskussion hatte:
Zitat:

Baue die Zeitabfrage direkt in die ODE-Berechnung ein! und zwar sollte
beim ersten Start die Zeit mit dem TIC-Befehl auf 0 gesetzt werden. In jedem Iterationsschritt wird nun mit dem TOC-Befehl die abgelaufene Zeit abgefragt. Ist diese größe als festgelegte, dann wird die Berechnung beendet. Ist in meinen Augen etwas einfacher und übersichtlicher, als mit dem Timer.


Also, viel Erfolg... und vielleicht wäre das für Mathworks ein Hinweis eine Realtime-Begrenzung in die ODE-Options zu integrieren. Ansonsten müssen wir unsere ODE15s frisieren... Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 26.05.2009, 08:50     Titel:
  Antworten mit Zitat      
Hallo S2PID,

ich habe es nicht ausprobiert, aber ich dachte, die Outputfunction ist genau dafür da, die ODE nach selbstgewählten Kriterien abzubrechen. Indem man status auf eins setzt, gibt man den Befehl, die Iteration abzubrechen. Statt clock und etime kann man natürlich auch tic und toc verwenden. Oder wolltest Du meinem Vorschlag gar nicht widersprechen?

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
IsaacK

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.05.2009, 11:04     Titel: Funktioniert!
  Antworten mit Zitat      
Danke ihr beiden!

Ich habe mein Problem über die Output Funktion undTic/Toc gelöst. Den Solver zu editieren ist mir nicht so geheuer. Allerdings wollte die Output Funktion noch einen vierten Parameter haben, obwohl in der Hilfe steht die Output Funktionen müssten genauso definiert sein wie von dir oben beschrieben. Naja, Hauptsache jetzt klappts!

Danke
Isaac
 
S2PID
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 18.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.05.2009, 11:36     Titel:
  Antworten mit Zitat      
hm... in der Tat Bijick du hast recht es funktioniert. Wiedersprechen wollte ich dir nicht, da die Outputfcn Werte an die interne Routine übergibt. Gewusst das sie unterbrechen kann, hab ich nicht... Wink
Daher warst du meinem Wissen vorraus Very Happy. Die Outputfcn bestitzt eine Flag die man auf true/false setzen kann. Im Sinne der Nachwelt zitiere ich mal kurz die Hilfe:
Zitat:

Output Function:
The Outputfcn field of the options structure specifies one or more functions that an optimization function calls at each iteration. Typically, you might use an output function to plot points at each iteration or to display optimization quantities from the algorithm.

The function definition line of the output function has the following form:
stop = outfun(x, optimValues, state)

- x is the point computed by the algorithm at the current iteration.
- optimValues is a structure containing data from the current iteration. Fields in optimValues describes the structure in detail.
- state is the current state of the algorithm. States of the Algorithm lists the possible values.
- stop is a flag that is true or false depending on whether the optimization routine should quit or continue. See Stop Flag for more information.


Das setzen von stop auf false oder 1 unterbricht die Iteration. Sprich so wie du es oben gepostet hast. Für Leute die gerne visuellen Kontakt halten, kann ich noch das Tool ODEbar empfehlen. http://www.mathworks.de/matlabcentral/fileexchange/9904
Einfach die File ODEprog.m um die folgende Zeile erweitern und die Variable "starttime" global definieren:
Code:

global starttime
.
.
.
status = 0;
if  etime(clock,starttime) > maxtime
    status=1;
end
drawnow;
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 26.05.2009, 12:06     Titel:
  Antworten mit Zitat      
Na, dann bin ich ja froh, dass ich keinen Unsinn vorgeschlagen habe. Danke für die Verifizierung und die Komplettierung des Themas hier im Forum.

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
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 - 2024 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.