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

min() und max() in Constraints verwenden?

 

Ufix
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 13.03.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.04.2015, 14:24     Titel: min() und max() in Constraints verwenden?
  Antworten mit Zitat      
Hallo zusammen,

ich habe ein Optimierungsproblem mit Nebenbedingungen der Form
Code:
X(20) <= 100 - max([max(X(1:3)) max(X(5:7)) max(X(10:17))])


Ich verwende den GlobalSearch Solver und habe das Problem mit createOptimProblem definiert. Dort habe ich die NB als Parameter 'c' übergeben und hierzu entsprechend umformuliert, z.B. so:
Code:
c = [X(20) - (100 - max([max(X(1:3)) max(X(5:7)) max(X(10:17))]);...]


Weitere Gleichheits-NB werden mit "ceq" übergeben, diese sind nicht-linear.

Das von GlobalSearch gelieferte Ergebnis erfüllt die in 'ceq' enthaltenen NB, nicht jedoch die mit min() und max() formulierten NB in 'c'. Liegt dies daran, dass lineare NB evtl. nicht mit 'c' sondern mit 'Aineq' und 'bineq' übergeben werden müssen? Oder können min() und max() nicht zur Formulierung von NB genutzt werden?

Viele Grüße!
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 19.04.2015, 15:09     Titel:
  Antworten mit Zitat      
Hallo,

poste doch bitte den tatsächlichen Code statt solcher Schnipsel.
Zitat:

Liegt dies daran, dass lineare NB evtl. nicht mit 'c' sondern mit 'Aineq' und 'bineq' übergeben werden müssen?

Lineare NB sollten auch als solche angegeben werden. Deine Ungleichungen sind aber nicht linear.

Was ist denn die Rückmeldung von GlobalSearch? Falls diese besagt, dass ein Minimum gefunden wurde, dann wurden die Gleichungen wohl falsch übergeben. Genaueres kann man aber nur sagen, wenn man den tatsächlichen Code sieht.

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

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 13.03.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.04.2015, 15:34     Titel:
  Antworten mit Zitat      
Danke für die Antwort! Ich hatte gemeint, dass sich die von mir gepostete Ungleichung sehr leicht in mehrere lin. NB umformen lässt, z.B.

Code:
X(20)+X(1) <= 100; X(20)+X(2) <= 100; usw


Hier ist die Problembeschreibung:

Code:

ObjectiveFunction = @prog_obj;
ConstraintFunction = @prog_constraint;

LB = zeros(56,1);
UB(1:52) = 0.6;
UB(53:56) = 6000;

problem = createOptimProblem('fmincon',...
    'objective',ObjectiveFunction,...
    'x0',X,'nonlcon',ConstraintFunction,'options',...
    optimoptions(@fmincon,'Algorithm','sqp','Display','off'));
problem.lb = LB;
problem.ub = UB;

gs = GlobalSearch('Display','iter');
[Xgs fval_gs,exitflag,output] = run(gs,problem)
 


Und hier der Auszug aus "prog_constraint":

Code:

function [c, ceq] = prog_constraint(X)
c = [X(49)-min([min(X(1:8)) min(X(21:24)) min(X(25:48))]);...
    X(50)-min(X(9:20));...
    X(51)-(0.6 - max([max(X(1:8)) max(X(21:24)) max(X(25:48))]));...
    X(52)-(0.6 - max(X(9:20)))];

ceq = [...nicht-lin. Gleichungen]
 


Die Rückmeldung des Solvers ist:

Code:

GlobalSearch stopped because it analyzed all the trial points.

27 out of 62 local solver runs converged with a positive local solver exit flag.

Xgs = (hier der Ergebnisvektor)

fval_gs = (hier der Wert der ZF)

exitflag =

     2


output =

                funcCount: 175106
         localSolverTotal: 62
       localSolverSuccess: 27
    localSolverIncomplete: 11
    localSolverNoSolution: 24
                  message: 'GlobalSearch stopped because it analyzed all the trial points.

27 out of 62 local solver runs converg...'
 


Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Danke für die Antwort! Ich hatte gemeint, dass sich die von mir gepostete Ungleichung sehr leicht in mehrere lin. NB umformen lässt

Stimmt. Es sollte auch einen Versuch wert sein, das so anzugeben.

Zitat:
Und hier der Auszug aus "prog_constraint":

Und welche Gleichungen sollen mit diesem Auszug nun umgesetzt werden? Die bisher genannten sind es ja nun schon mal nicht.

Zitat:
27 out of 62 local solver runs converged with a positive local solver exit flag.

Das bedeutet auf jeden Fall zulässige Punkte.

Wenn du Xgs in prog_constraint einsetzt, solltest du also bei
Code:
[cineq, ceq] = prog_constraint(Xgs)

im ersten Argument negative Werte, im zweiten Argument Nullen zurückbekommen, bis auf eine durch TolCon vorgegebene Toleranz.

Wenn du keine sehr guten Gründe dafür hast, 'sqp' als Algorithmus zu wählen, würde ich 'interior-point' vorschlagen.

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

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 13.03.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.04.2015, 16:02     Titel:
  Antworten mit Zitat      
In meinem zweiten Post haben sich lediglich die Zahlen und Indizes geändert, von der Struktur her ist die Ungleichung aus meinem ersten Post jedoch gleich der 3. Ungleichung in 'c' in 'prog_constraint'. Wenn ich wie von dir vorgeschlagen Xgs in prog_constraint einsetze, erhalte ich tatsächlich Nullen (abgesehen von der Toleranz):

Code:

>> [cineq, ceq] = prog_constraint(Xgs)

cineq =

   1.0e-41 *

    0.5189
         0


ceq =

   1.0e-09 *

    0.2625
         0
 


Die ersten beiden Ungleichungen sind auch erfüllt, jedoch nicht die 3. und die 4. Die Ausgabe in 'cineq' scheint jedoch nur zwei statt vier Elemente zu enthalten, irgendwo liegt also ein Programmierfehler vor?

Auf interior-point werde ich umstellen, danke für den Tipp!
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 19.04.2015, 17:41     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Die Ausgabe in 'cineq' scheint jedoch nur zwei statt vier Elemente zu enthalten, irgendwo liegt also ein Programmierfehler vor?

Davon ist auszugehen, ja.
Wenn ich die von dir gepostete prog_constraint teste, bekomme ich für c auch einen Vektor mit 4 Elementen zurück. Ich vermute also mal, dass du auch da anderen Code verwendest?

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

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 13.03.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.04.2015, 19:57     Titel:
  Antworten mit Zitat      
Hallo Harald,

komisch, ich verwende den Code genau so wie gepostet. Kann es damit zusammenhängen, dass ich in 'ceq' 2 nicht-lin. Gleichungen definiere? Überträgt sich die Dimension von 'ceq' in irgendeiner Form auf 'c'?

Vielen Dank!
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 19.04.2015, 20:14     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
komisch, ich verwende den Code genau so wie gepostet.

Sicher? Auch alles gespeichert? Keine gleichnamige Datei, die Vorrang hat?
Was bekommst du denn mit
Code:
[c, ceq] = prog_constraint(zeros(55,1))


Zitat:
Kann es damit zusammenhängen, dass ich in 'ceq' 2 nicht-lin. Gleichungen definiere? Überträgt sich die Dimension von 'ceq' in irgendeiner Form auf 'c'?

Nein, und nein.

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