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

Optimierung in Matlab (inkl. Simulink) - Grundsatzprobleme..

 

Dschiehses
Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 12.01.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.06.2014, 19:13     Titel: Optimierung in Matlab (inkl. Simulink) - Grundsatzprobleme..
  Antworten mit Zitat      
Hallo zusammen,

ich arbeite gerade an einer Parameter-Optimierung für ein Simulink-Modell und hänge quasi ganz am Anfang fest. Mit der Optimierungs-Toolbox konnte ich mich leider noch nicht beschäftigen.

Folgende Problemstellung:
Ich habe ein Simulink-Modell, was über viele Parameter einen Wärmespeicher simuliert. Das Modell wird über ein Objekt aufgerufen.
Der Ablauf sieht folgendermaßen aus:
-Am Anfang werden Parameter übergeben
-In einer Schleife wird die Simulink-Simulation aufgerufen (Das Modell beschreibt eine Tankschicht mit konstanter Temperatur)
-Am Ende kommt der Austrittstemperaturvektor.


Die Optimierung soll folgendermaßen ablaufen:
Der zu bestimmende Wert ist die Änderung der Austrittstemperatur. Für diese gebe ich einen Zielwert vor.
Außerdem gebe ich einen Parameter an, der variiert werden soll (inklusive Startwert), und natürlich eine erlaubte Toleranz (xx%).

Meine Vorgehensweise bis jetzt war so:
1. startwert als parameter speichern
2. initial-simulation durchführen
3. while-endlos-schleife, abbruch bei >100 iterationen oder abweichung kleiner als toleranz
4. austrittstemperaturänderung bestimmen;
5. abweichung vom Sollzustand; habe ich so gelöst:
Code:

delta = abs(soll - ist) / sqrt(soll^2 + ist^2);
 

6. "vorzeichen" bestimmen (variable plm; entweder 1 oder -1)
7. das delta auf den zu variierenden wert auftragen:
Code:

wert = wert + plm * delta * wert;
 

8. simulation erneut durchführen.

Leider benötigt ein Durchlauf der Simulation ca. 5 Minuten. In meiner Beispielrechnung bin ich jetzt gerade bei der 35. Iteration, eine Annäherung auf die Zielgröße ist noch nicht wirklich festzustellen.

Wie kann ich diese Optimierung "optimieren", so dass sie zielführend und schnell von statten geht?

Vielen Dank für Eure Hilfe!
Jan
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.06.2014, 21:32     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Mit der Optimierungs-Toolbox konnte ich mich leider noch nicht beschäftigen.

Das solltest du nachholen.

Zitat:
Wie kann ich diese Optimierung "optimieren", so dass sie zielführend und schnell von statten geht?

Eben genau mit der Optimization Toolbox, genau genommen fminunc (falls keine weiteren Nebenbedingungen wie Schranken) oder fmincon (für den Fall von Nebenbedingungen). Je besser die Startwerte, desto schneller dürfte die (richtige) Lösung gefunden werden.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 12.01.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.06.2014, 18:06     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank für den Anstoß! Das hat mir auf jeden Fall schon weiter geholfen. Jetzt häng ich aber (schon wieder) an einem totalen Anfänger-Problem.

Ich hab jetzt folgendes gemacht:
Code:

options = optimset('Display','iter-detailed', 'TolFun', 1e-3);
fcn = @(x)obj.runOptimize(x, calcParam, dTout);
[x, f, flag, output] = fminunc(fcn, calcValue, options);
               
 

Die Funktion runOptimize sieht so aus:
Code:

function f = runOptimize(obj, x, calcParam, dTout)
obj.p.(calcParam) = x;

obj.simulate();

f = (obj.p.dTout - dTout);

end %

Nach 15 Iterationen (und ca. 2 Stunden wartens...) war das Programm durchgelaufen. Leider kam am Ende für die Temperaturerhöhung nicht der eingegebene Wert (30K) heraus, sondern 0.

Wo ist mein Gedankenfehler?

Vielen Dank für die Hilfe,
Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.06.2014, 19:40     Titel:
  Antworten mit Zitat      
Hallo,

was war die Statusmeldung von fminunc?

Ist sichergestellt, dass bei der Simulation die Parameter aus dem richtigen Workspace genommen wurden?

Ich würde den Betrag der Abweichung als Ziel verwenden:
Code:
f = abs(obj.p.dTout - dTout);


Das dürfte auch dein Problem erklären: klar, 0 ist besser als 30, wenn du nur die Differenz als Ziel nimmst.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 12.01.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.06.2014, 11:58     Titel:
  Antworten mit Zitat      
Hallo Harald,

ich habe das jetzt ausprobiert, also den Absolutbetrag genommen. Das hat leider nicht zum Ziel geführt ...

Code:

                                                        First-order
 Iteration  Func-count       f(x)        Step-size       optimality
     0           2          39.1608                         0.113
     1          88                0        360.902           2.47  

Optimization stopped because the objective function cannot be decreased in the
current search direction. Either the predicted change in the objective function,
or the line search interval is less than eps.
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

wieso ist das nicht das Ziel? Weniger als gar keine Abweichung kannst du doch nicht erwarten?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 12.01.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.06.2014, 12:21     Titel:
  Antworten mit Zitat      
Hi,

ja, das stimmt schon. Was mich wundert, ist, dass der Ablauf des Programms auf einmal anders war. Vorher wurde jeweils nach 2 Durchläufen der Simulation ein neuer Iterationsschritt angezeigt, jetzt wurde insgesamt über 80 Mal die Simulation durchgeführt, aber am Ende wird nur "ein" Iterationsschritt angezeigt. Das erschwert es für mich, eine Benutzeroberfläche zu bauen, die den Fortschritt anzeigt ... oder zumindest überhaupt etwas anzeigt.

Viele Grüße,
Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.06.2014, 12:37     Titel:
  Antworten mit Zitat      
Hallo,

schwierig.

Ein möglicher Ansatz: versuche als Zielfunktion mal
Code:
f = (obj.p.dTout - dTout)^2;


Hintergrund: abs ist bei 0 nicht differenzierbar, und das könnte ein Problem sein.

Ansonsten kann ich auch nicht erkennen, woran das liegt, und bräuchte wohl ein reproduzierbares Beispiel, um dem auf den Grund zu gehen.

Grüße,
Harald
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 - 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.