Verfasst am: 03.08.2015, 19:33
Titel: fmincon, NLP unter zwei Variablen mit Nebenbedingungen
Hallo liebe Matlab-Community!
Ich bin recht neu in der spannenden Welt der Programmierung, speziell bei Matlab und habe Probleme bei der Umsetzung des angehängten Optimierungsproblems. Ich entschuldige mich schonmal für die Qualität des Pdfs!
Als Tipp habe ich schon bekommen, dieses Problem mit fmincon anzupacken und habe mich darin auch schon eingearbeitet. Leider komme ich aber zu keinem vernünftigen Ergebnis.
Meine erste Frage wäre gleich zu Beginn wie man fmincon initialisiert, wenn man wie hier ein Optimierungsproblem über zwei Variablen durchführt, die Zielfunktion jedoch nur von einer der beiden Variablen abhängt?
Des Weieteren hakt es beim Verständnis zu den nichtlinearen Nebenbendingungen phi und phi(tilde). Normalerweise gibt dei Funktion c(x) bei fmincon ja immer einen Vektor aus, aber hier prüft phi ja nur die einzelnen Koeffizienten der Vektoren. Ich verstehe leider nicht wie man das berücksichtigen könnte.
Hier schonmal soweit der Code wie ich ihn mir überlegt hätte:
Code:
%Zuerst die Zielfunktion
function f=obyfun(A,x,b);
f= norm(A*x-b,2)^2;
%Für phi zuerst eine Hilfsfunktion
function z = H1(x,y,t)
if x+y >= 2*t
z = (x-t)*(y-t);
else
z = -0.5*((x-t)^2+(y-t)^2);
end
%Dann die Funktion die alle Einträge von x und y durchläuft
function phi = phi (x,y,t) for k = 1 : length(x)
z(k) = H1(x(k),y(k),t);
end end
Leider komme ich aber zu keinem vernünftigen Ergebnis.
Bekommst du denn überhaupt Ergebnisse? Ich würde ja eher Fehlermeldungen vermuten. Wenn Fehlermeldungen kommen, diese bitte immer hier reinkopieren.
Das Hauptproblem sehe ich im Interface von Zielfunktion und nichtlinearer Nebenbedingungsfunktion. Dazu kannst du dich an die aus der Hilfe von fmincon verlinkte Seite halten:
http://de.mathworks.com/help/optim/.....ing-extra-parameters.html
(mein bevorzugter Weg: anonymous functions)
Bei deinen Beschreibungen fällt es mir schwer zu folgen, insbesondere:
Zitat:
wenn [...] ein Optimierungsproblem über zwei Variablen durchführt, die Zielfunktion jedoch nur von einer der beiden Variablen abhängt?
und
Zitat:
Normalerweise gibt dei Funktion c(x) bei fmincon ja immer einen Vektor aus, aber hier prüft phi ja nur die einzelnen Koeffizienten der Vektoren.
Nein, ich bekomme gar kein Ergebnis. Wenn ich einen Testlauf mit beispielsweise n=5 und Matrixdimension 5x15 mache, kommt als Fehlermeldung:
"Error using fmincon (line 290)
A must have 15 column(s)."
Zu den beiden von mir schlecht formulierten Sätzen:
1) Ich minimiere ja über x und y, in meiner Zielfunktion f(x) taucht aber nur das x auf. Wie "signalisiert" man denn Matlab mit fmincon, dass man ein Optimierungsproblem über mehrere variablen (hier x und y hat)?
2) Das bezog sich auf die Beschreibung von mathworks "c(x) and ceq(x) are functions that return vectors". Meine Funktion phi hier überprüft die Vektoren ja nur Komponetenweise und nicht als Ganzes. Funktioniert der Aufruf von c(x) dann trotzdem, beziehungsweise ergibt die von mir programmierte Funktion phi dahingehend überhaupt Sinn?
Zu 1): Ich verstehe immer noch nicht ganz. Was heißt "über x und y minimieren"? Wenn x und y so variiert werden sollen, dass die Zielfunktion minimal ist und die Nebenbedingungen erfüllt sind, dann müssen x und y zu einem Vektor (z.B. u) zusammengefasst werden.
Zu 2): dein Code setzt die Nebenbedingungen H1(x(1), y(1), t) <= 0, H1(x(2), y(2), t) <= 0, etc.
Hallo,
vielen Dank, du hast mir schon sehr weitergeholfen und entschuldige bitte meine umständliche Ausdrucksweise! Habe meine beiden vorherigen Posts gerade mal gelöscht, weil ich die Fehler dazu selbst entdeckt habe.
2) habe ich jetzt kapiert und bei 1) meinte ich genau das und habe x und y jetzt mal zu einem Vektor u zusammengefasst. Ich war dabei vorher verwirrt, weil das y nur in den Nebenbedingungen auftaucht und nicht in der Zielfunktion, aber das macht ja nichts..
Hier mal ein komplettes Beispiel mit obigen Codes:
Als Fehlermeldung taucht hierbei auf:
"Error using obyfun (line 4)
Not enough input arguments.
Error in fmincon (line 564)
initVals.f = feval(funfcn{3},X,varargin{:});
Caused by:
Failure in initial user-supplied objective function evaluation. FMINCON cannot continue."
Ich glaube ein großes Problem bei mir ist noch die Verwendung von zwei Variablen x und y. Wie mache ich in dem fmincon Aufruf z.B. deutlich, dass sich die lower und upper bounds sowie die lineare Beschränkun W*y<=c nur auf das y beziehen?
Die Zielfunktion liefert bei mir obyfun(xo)=1.6057, ändert sich aber mit neu generierten zufälligen A,b.
was die Ziel- und nichtlin. NB-Funktion angeht, ist es vielleicht am übersichtlichsten, wenn man am Anfang x und y aus u extrahiert.
Was W und c angeht: c brauchst du nicht verändern. In W kannst du zusätzliche Spalten mit Nullen für die nicht verwendeten Variablen einfügen.
Bei lb und ub kann für unbeschränkte Variablen -inf oder inf angegeben werden.
Super, ich habe es endlich hinbekommen! Vielen herzlichen Dank für die Hilfe und die Tipps, das hat mich entscheidend weitergebracht.
Viele Grüße,
Waldo
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.