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

Problem mit OutputFcn beim Solver Ode45

 

katyx
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 24.07.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.07.2015, 18:25     Titel: Problem mit OutputFcn beim Solver Ode45
  Antworten mit Zitat      
Hallo ihr Lieben,

ich habe ein DGL-System, das ich mit dem ode45-solver löse, der auch einwandfrei funktioniert.
Nun möchte ich aber die Werte, die der Solver mir ausgibt, nach jedem Zeitschritt bearbeiten (ganz grob gesagt quasi nach der Größe sortieren), damit er beim nächsten Zeitschritt mit diesen Werten rechnet. Die Matlab-Hilfe ist mir leider keine große Hilfe, deshalb hoffe ich, dass es hier jemanden gibt, der besser erklären kann.

Der Aufruf der Funktion klappt (habe es getestet, indem ich statt @myfun einfach mal @odeplot eingesetzt habe):
Code:

options = odeset('OutputFcn',@myfun);
[t,y]=ode45('modell3', [0,100], [y1_0; y2_0; y3_0], options);


In der Funktion myfun würde ich nun gerne diese Ordnung der Werte pro Zeitschritt durchführen, verstehe aber einfach nicht, wie ich diesen Befehl an Matlab gebe, dass es nach jedem Zeitschritt etwas tun soll...
Code:

function status=myfun(t,y,[])
  % ...

end
 



Aus der Matlab-Hilfe habe ich das so verstanden, dass ich '[]' dort eingeben soll, aber damit (oder auch mit eingesetzten Zahlen, Vektoren, mit und ohne Klammern oder sonstwas) bekomme ich nur Fehlermeldungen, z.B.

Error using feval
Error: File: testmischen.m Line: 5 Column: 27
Unbalanced or unexpected parenthesis or bracket.

Error in ode45 (line 235)
feval(outputFcn,[t tfinal],y(outputs),'init',outputArgs{:});

Error in berechnung_modell3 (line 14)
[t,y]=ode45('modell3', [0,100], [y1_0; y2_0; y3_0], options);

Kann mir jemand helfen?
Danke im Voraus und schönes Wochenende schonmal,
Grüße,
Kathi
Private Nachricht senden Benutzer-Profile anzeigen


laternenjoe
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 83
Anmeldedatum: 25.02.15
Wohnort: Bochum
Version: ---
     Beitrag Verfasst am: 24.07.2015, 19:57     Titel:
  Antworten mit Zitat      
Hallo katyx,

Ich kann/muss jetzt raten, weil ich den Fehler ja nicht reproduzieren kann. Der Code sieht so schon gut aus. Die myfun wird nach jedem Integrationsschritt aufgerufen, das hast du ja durch flag=[] richtig eingestellt. Aber gibt deine myfun immer den Wert von statusmit 0 oder 1 zurück oder etwas anderes? Ansonsten würde ich mal einen breakPoint in myfun setzen und schauen was er rechnet.

lg laternenjoe
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: 25.07.2015, 01:15     Titel: Re: Problem mit OutputFcn beim Solver Ode45
  Antworten mit Zitat      
Hallo katyx,

Zitat:
Nun möchte ich aber die Werte, die der Solver mir ausgibt, nach jedem Zeitschritt bearbeiten (ganz grob gesagt quasi nach der Größe sortieren), damit er beim nächsten Zeitschritt mit diesen Werten rechnet.

Wenn Du die Werte irgendwie veränderst, die in jedem Zeitschritt verwendet werden, wird das den Solver durcheinander bringen. Dafür ist ODE45 nicht gedacht.

Beschreibe doch mal, wozu Du das benötigst.

Code:
function status=myfun(t,y,[])

Man kann in der Definition einer Funktion nicht [] als Input-Argument einsetzen. Im Aufruf einer Funktion ist das möglich, aber nicht bei der Definition.

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

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 24.07.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.07.2015, 11:31     Titel:
  Antworten mit Zitat      
Hallo und danke für eure Antworten!

Ich habe es gestern abend noch geschafft, dass nach jedem Berechnungsschritt zumindest Werte ausgegeben werden. Ich habe dafür einfach nen Zeitvektor erstellt, um zu definieren, wann genau myfun immer aufgerufen werden soll (eigentlich logisch, funktioniert aber anscheinend nur, wenn man den Vektor vorher definiert). Ich konnte mir also nach jedem Berechnungsschritt die jeweiligen 3 Werte von y ausgeben lassen.
Was ich nun tun möchte, ist die Werte zu modifizieren, dass z.B. der Mittelwert (im Code y_mix) aus y(2) und y(3) gebildet wird und dann dieser Wert auf y(2) und y(3) geschrieben wird, so dass der Solver im nächsten Schritt mit diesen neu berechneten Werten rechnet.

Aufruf klappt also jetzt...
Code:
% Intervallgrenzen
Zeitvektor=(1:5)';

% Anfangsbedingungen
y1_0=90;
y2_0=90;
y3_0=90;

% ODE lösen
options = odeset('OutputFcn', @myfun);
[t,y]=ode45('modell3', Zeitvektor , [y1_0; y2_0; y3_0], options);


Hier die myfun, um die es geht:
Code:
function status=myfun(t,y,Zeitvektor)
if   size(y)>0
    y_mix=y(2)+y(3)
    y(2)=y_mix
    y(3)=y_mix
end

status=0;

end
 


Ich bekomme so zwar die neu berechneten y(2) und y(3) eines jeden Schrittes im Command Window ausgegeben, aber nicht an den Solver übergeben, die Berechnung wird nämlich weiterhin mit den alten durchgeführt und das Gesamtergebnis bleibt das Gleiche.

@ Jan S: Du sagst, ode45 kommt bei so einer Werte-Veränderung durcheinander, kann das denn ein anderer Solver besser?

Was ich darstellen möchte, ist die Temperaturschichtung in einem Wasserspeicher. Das Modell des Speichers, das ode45 hier berechnet, funktioniert einwandfrei, berücksichtigt aber nicht die temperaturabhänige Dichte des Wassers (das heißt, es ist unten ständig wärmer als oben, was natürlich physikalisch nicht richtig ist), daher möchte ich nach jedem Berechnungsschritt manuell 'mischen'.

Ich bin leider nicht wirklich mit solvern und functions und so Sachen in Matlab vertraut und das Problem scheint mir schon sehr speziell zu sein, vielleicht hat trotzdem jemand eine Idee?

Danke und Grüße Smile
katyx
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.07.2015, 11:46     Titel:
  Antworten mit Zitat      
Hallo,

zum ursprünglichen Problem:
Zitat:

Error using feval
Error: File: testmischen.m Line: 5 Column: 27
Unbalanced or unexpected parenthesis or bracket.

Das hat im Grunde nicht das geringste mit ODE-Solvern zu tun. Es ist schlicht und einfach eine Klammer falsch platziert. Wenn du auf den Link in der Fehlermeldung klickst, kommt du an die richtige Stelle. Zudem macht in solchen Fällen das rote Quadrat rechts oben im Editor schon vor dem Ausführen darauf aufmerksam, dass es einen Syntaxfehler gibt.

Von der Frage, ob dies sinnvoll ist, mal ganz abgesehen: es ist in der OutputFcn nicht vorgesehen, dass die Werte verändert werden. Die OutputFcn ist lediglich dafür gedacht, dass mit den Werten etwas zusätzlich gemacht wird (z.B. Loggen oder graphische Darstellung).

Ich würde hier das Modell überdenken. Eine ODE scheint mir zur Modellierung ungeeignet. Stattdessen eher eine PDE, da Ableitungen nach der Zeit und der Höhe eine Rolle spielen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
katyx
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 24.07.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.07.2015, 14:39     Titel:
  Antworten mit Zitat      
Hallo Harald, danke für deine Antwort.

Da das mit der OutputFcn wie du sagst nicht funktioniert, habe ich jetzt einfach einen zugegebenerweise eher unschönen Umweg gewählt, der aber immer noch einfacher als ne PDGL ist. Ich berechne nun einfach eine Schleife mit Lösen der DGL, Mischen der Werte, Abspeichern dieser und als neue Anfangswerte setzen umd die Schleife von vorne zu beginnen.
Funktioniert. Smile

Schönes Wochenende!
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.07.2015, 16:39     Titel:
  Antworten mit Zitat      
Hallo,

heißt "funktionieren" in dem Fall, dass der Code fehlerfrei durchläuft oder dass du eine korrekte Lösung bekommst?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
katyx
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 24.07.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.07.2015, 13:06     Titel:
  Antworten mit Zitat      
Beides. Wink
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.