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

fmincon, NLP unter zwei Variablen mit Nebenbedingungen

 

Waldo
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 03.08.15
Wohnort: Frankfurt
Version: ---
     Beitrag Verfasst am: 03.08.2015, 19:33     Titel: fmincon, NLP unter zwei Variablen mit Nebenbedingungen
  Antworten mit Zitat      
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


% Funktion c(x)
function [c,ceq] = nonlconstr(x)
   c = [phi(x,y,t)]
   ceq = [];

%phi(tilde) analog

%die anderen Nebenbedingungen, wobei ich jetzt für A und b lieber W und c genommen habe um nicht mit der Zielfunktion zu kollidieren
W=ones(n)
c=[n-k]

%lower und upper bounds
lb=zeros(n,1)
ub=ones(n,1)

%Startwert
xo=zeros(n,1)

%Initialisierung
[x, fval] = fmincon(@obyfun, xo, W, c,[],[],lb,ub,@nonlconstr)



Über Hilfe, Tipps und Impulse wäre ich unendlich Dankbar!
Viele Grüße,
Waldo

Optimierungsproblem.pdf
 Beschreibung:

Download
 Dateiname:  Optimierungsproblem.pdf
 Dateigröße:  72.47 KB
 Heruntergeladen:  542 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: 03.08.2015, 19:44     Titel:
  Antworten mit Zitat      
Hallo,

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


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

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 03.08.15
Wohnort: Frankfurt
Version: ---
     Beitrag Verfasst am: 03.08.2015, 20:09     Titel:
  Antworten mit Zitat      
Vielen Dank schonmal für die Antwort!

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?


Viele Grüße,
Waldo
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: 03.08.2015, 20:48     Titel:
  Antworten mit Zitat      
Hallo,

bitte ein komplett reproduzierbares Beispiel angeben. Was genau ist A, und was ist b?

Was liefert
Code:
obyfun(x0)

?

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.

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

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 03.08.15
Wohnort: Frankfurt
Version: ---
     Beitrag Verfasst am: 04.08.2015, 13:41     Titel:
  Antworten mit Zitat      
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:
Code:
% Initialisierungswerte
n=5
k=2
A=rand(n,3*n)
b=rand(n,1)
W=-ones(1,3*n)
c=[n-k]

lb=zeros(n,1)
ub=ones(n,1)
xo=zeros(n*3,1)
yo=ones(n*3,1)

%Initialisierung
[u, fval] = fmincon(@obyfun, xo, W, c,[],[],lb,ub,@nonlconstr)


%Die Zielfunktion habe ich dank deines Tipps abgeändert:
function f=obyfun(A,u,b)
l=size(A);
n=l(2);
f= norm(A*u(1:n)-b,2)^2;
end
 


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.


Viele Grüße,
Waldo
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: 04.08.2015, 13:50     Titel:
  Antworten mit Zitat      
Hallo,

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.

Was die Fehlermeldung angeht, darf ich nochmal verweisen auf
http://de.mathworks.com/help/optim/.....ing-extra-parameters.html
(mein bevorzugter Weg: anonymous functions)

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

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 03.08.15
Wohnort: Frankfurt
Version: ---
     Beitrag Verfasst am: 04.08.2015, 18:11     Titel:
  Antworten mit Zitat      
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
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.