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

Optimierungsproblem mit bestimmten Nebenbedingungen

 

Krueger
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 53
Anmeldedatum: 25.06.13
Wohnort: ---
Version: R2011b
     Beitrag Verfasst am: 14.05.2014, 14:46     Titel: Optimierungsproblem mit bestimmten Nebenbedingungen
  Antworten mit Zitat      
Hallo zusammen,

ich habe ein Kostenfunktion optimize_K die ich minimieren möchte. Außerdem habe ich 6 Variablen. Da die Variablen Integer sein sollen verwende ich den genetic algorithm. Diesen rufe ich wie folgt auf.

Code:
[x,fval,exitflag] = ga(@optimize_K,6,A,b,[],[],[0 0 0 0 0 0],[500 500 500 500 500 2000],[1 2 3 4 5 6],options)
 


in A und b habe ich bestimmte Nebenbedingungen als Ungleichungen definiert.

Die Optimierungsfunktion sieht Beispielhaft wie folgt aus.

Code:
function y=optimze_K(x)

opt=simset('SrcWorkspace', 'base');
sim('Simumodell',[],opt);

y= x(1) *K1 + x(2)* K2 + x(3) *K3 + x(4)* K4 + x(5) *K5 + x(6)* K6


Die Optimierung funktioniert soweit auch. Nun meine Frage...

Ich würde gerne ein Ergebniss aus dem Simulinkmodell als Nebenbedingung in die Optimierungsfunktion aufnehmen. Z.B , dass die Summe eines bestimmten Vektors am Ende der Simulation 0 betragen soll.

Könnt ihr mir sagen, ob ich dieses Problem irgendwie Programmiertechnisch umsetzen kann?

Freue mich über eure Anregungen und Hile!

VG

Krueger
Private Nachricht senden Benutzer-Profile anzeigen


Krueger
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 53
Anmeldedatum: 25.06.13
Wohnort: ---
Version: R2011b
     Beitrag Verfasst am: 14.05.2014, 21:09     Titel:
  Antworten mit Zitat      
Vielleicht noch zur ergänzung...

Ich möchte quasi ein Ergebnis aus dem Simulinkmodell welches ich mit dem "to Workspace" Block in den Workspace schreibe in den Nebenbedingungen einbauen.

Jemand eine Idee?

Merci

Krueger
Private Nachricht senden Benutzer-Profile anzeigen
 
SkyRazor
Forum-Century

Forum-Century


Beiträge: 106
Anmeldedatum: 07.05.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.05.2014, 23:05     Titel:
  Antworten mit Zitat      
Krueger hat Folgendes geschrieben:
Vielleicht noch zur ergänzung...

Ich möchte quasi ein Ergebnis aus dem Simulinkmodell welches ich mit dem "to Workspace" Block in den Workspace schreibe in den Nebenbedingungen einbauen.

Jemand eine Idee?

Merci

Krueger


Hallo,

Wenn ich nicht falsch verstehe, du möchtest Ergebnisse nach der Simulation kriegen, oder?
Mit "to Workspace" oder "save data to workspace" in scope kannst du Variablen mit bestimmten Namen und Format kriegen, z.b. structure, dann kann man die Datei einfach nehmen, wie z.b.
x=ScopeData.signals(1).values

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 53
Anmeldedatum: 25.06.13
Wohnort: ---
Version: R2011b
     Beitrag Verfasst am: 15.05.2014, 10:50     Titel:
  Antworten mit Zitat      
Hallo SkyRazor,

so habe ich das auch schon versucht. Hier nochmal die Zielfunktion.

Code:
function y=optimze_K(x)

opt=simset('SrcWorkspace', 'base');
sim('Simumodell',[],opt);

x(7) = sum(Result_Simulink)

y= x(1) *K1 + x(2)* K2 + x(3) *K3 + x(4)* K4 + x(5) *K5 + x(6)* K6


Code:
Result_Simulink


schreibe ich als Array aus dem Simulinkmodell in den Workspace. Die Variable x(7) kommt aber nicht mehr extra in der Zielfunktion y vor sondern ist nur eine Nebenbedingung, welche die Werte x(1) bis x(6) beeinflussen soll.

Die Nebenbedingungen habe ich wie folgt als ungleichung Definiert.

Code:
A = [0 0 0 0 0 0 1; 0 0 0 0 0 0 -1];

b = [0; 0]
 



Also die Summe über die 8760 Schritte aus Result_Simulink soll am Ende einer Simulation 0 ergeben. Demnach sollen x(1) - X(6) bestimmt werden.
Leider greift die Nebenbedingungen nicht. X(7) nimmt auch Werte größer 0 an.


Hat jemand eine Idee?

Vielen Dank

Krueger
Private Nachricht senden Benutzer-Profile anzeigen
 
Krueger
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 53
Anmeldedatum: 25.06.13
Wohnort: ---
Version: R2011b
     Beitrag Verfasst am: 22.05.2014, 13:58     Titel:
  Antworten mit Zitat      
Ich bin leider noch nicht viel weiter gekommen. Anbei habe ich einmal den Plot zu dem best und dem mean penalty value hochgeladen. Es sieht so aus, als ob die Nebenbedingung wie zuvor beschrieben wird zumindestens in den ersten 23 Generations berücksichtigt wird. Ab der 24 Generation wirkt dann anscheinend die Zielfunktion. Am Ende bekomme ich eine Lösung, die mir zwar das minimum der Kostenfunktion ausgibt, allerdings die Nebenbedingung nicht mehr berücksichtigt.

Kann mir das jemand erklären?

best_Penalty.jpg
 Beschreibung:

Download
 Dateiname:  best_Penalty.jpg
 Dateigröße:  19.98 KB
 Heruntergeladen:  313 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Krueger
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 53
Anmeldedatum: 25.06.13
Wohnort: ---
Version: R2011b
     Beitrag Verfasst am: 27.05.2014, 11:49     Titel:
  Antworten mit Zitat      
niemand eine Idee woran es liegen könnte?
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: 27.05.2014, 12:53     Titel:
  Antworten mit Zitat      
Hallo,

woraus schließt du, dass die Nebenbedingungen nicht berücksichtigt werden?

Deine Ungleichungen bedeuten ja
x7 <= 0
x7 >= 0
also x7 = 0.

Ist das wirklich so gewollt?
Warum gibst du das dann nicht als Gleichungs-NB an?

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 53
Anmeldedatum: 25.06.13
Wohnort: ---
Version: R2011b
     Beitrag Verfasst am: 27.05.2014, 13:11     Titel:
  Antworten mit Zitat      
Hallo Harald,

zu deiner ersten Frage...

die x(1)-x(6) Werte laufen nach dem Sprung in dem Plot den ich zuvor hochgeladen habe nalle gegen 0. Es stimmt auch, dass in diesem Fall die Kostenfunktion minimal wird. Allerdings kann damit die Nebenbedingung x(7)=0 nicht mehr erfüllt werden. In x(7) schreibe ich ein Ergebnis aus dem Simulink modell, und dieses ist (indirekt) abhängig von x(1)-x(6). Ich lasse mir nach der Berechnung auch alle Werte ausgeben und dort ist der Vektor Result_Simulink auch nicht 0.

zu deiner zweiten Frage...

Ja, dies ist so gewollt. Ich habe das ganze zunächst als Gleichung definiert. Wenn ich dann allerdings die Variablen bestimmte, die nur Integer Werte annehmen dürfen, bekomme ich einen Error, der mir genau diesen Weg über die Ungleichungen vorschlägt. Ich kann dir den Error nachher gerne auch noch mal Posten.


Vielen Grüße und Danke für deine Hilfe


Krueger
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: 27.05.2014, 13:27     Titel:
  Antworten mit Zitat      
Hallo,

... und wie groß ist x(7) dann?

Ein reproduzierbares Beispiel könnte helfen.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 53
Anmeldedatum: 25.06.13
Wohnort: ---
Version: R2011b
     Beitrag Verfasst am: 27.05.2014, 14:14     Titel:
  Antworten mit Zitat      
Hallo Harald,

anbei ein vereinfachtes Beispiel. Das Originalsystem unterscheidet sich dann nur darin, dass es mehrere Anlagen gibt, die jeweils mit einem ADD Block der Reihenfolge nach zugeschaltet werden. Dabei sehen die Subsysteme der Anlagen leicht anders aus. In dem Originalsystem müssen dann alle Anlagen zu jedem Zeitpunkt den input decken.

Reicht dir das so?

VG Krueger

Beispiel.zip
 Beschreibung:

Download
 Dateiname:  Beispiel.zip
 Dateigröße:  9.58 KB
 Heruntergeladen:  343 mal
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: 27.05.2014, 16:08     Titel:
  Antworten mit Zitat      
Hallo,

vorweg: ich würde als SrcWorkspace current nehmen, dann kann man die ganzen Kopfstände mit assignin und eval vermeiden.

Mich wundert nun: wird x denn überhaupt verwendet? Du erzeugst ja Anlage1_Leistung, aber wo wird das genutzt?

Du kannst aber vor allem nicht erwarten, dass ein nachträglich erzeugtes x(2) bei der Überprüfung der Nebenbedingungen berücksichtigt wird. Die Nebenbedingung ist ja dann von der Ausführung des Simulink-Modells abhängig und somit sicher nicht mehr linear.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 53
Anmeldedatum: 25.06.13
Wohnort: ---
Version: R2011b
     Beitrag Verfasst am: 27.05.2014, 17:40     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für die Info mit dem SrcWorkspace current.

Anlage1_Leistung wird in dem Subsystem in dem Saturation Block also obere Grenze verwendet.


Genau das habe ich befürchtet, das x(2) wird ja erst nach dem ausführen des Simulinkmodells gespeichert.

Kannst du mir einen Ansatz geben, wie ich das ganze umsetzen kann?


Vielen Dank

Krueger
Private Nachricht senden Benutzer-Profile anzeigen
 
Krueger
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 53
Anmeldedatum: 25.06.13
Wohnort: ---
Version: R2011b
     Beitrag Verfasst am: 27.05.2014, 19:32     Titel:
  Antworten mit Zitat      
Hallo,

habe gerade folgendes probiert...

Code:

function [c,ceq] = mycon(x)

Input_A = randi([50,300],8760,1);

c=Input_A - x(1);
ceq=[];


mit der einen Anlage hat es schon funktioniert. Werde es jetzt mal im vollständigen Modell versuchen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Krueger
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 53
Anmeldedatum: 25.06.13
Wohnort: ---
Version: R2011b
     Beitrag Verfasst am: 27.05.2014, 19:39     Titel:
  Antworten mit Zitat      
Gibt es denn eine Möglichkeit, Ergebnisse aus dem Simulinkmodell in den Nebenbedingungen zu verwenden?
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: 27.05.2014, 19:59     Titel:
  Antworten mit Zitat      
Hallo,

zu 19:32 - ist dir klar, dass sich die Zufallszahlen und somit die Nebenbedingungen in jeder Auswertung ändern? Ich kann mir nicht vorstellen, dass das sinnvoll ist.

zu 19:39 - mir ist keine solche Möglichkeit bekannt. Ich werde mal sehen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.