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:
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?
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.
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.
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.
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.
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
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.