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

Optimierung mit fmincon()

 

Caramba
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 01.03.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.03.2016, 12:34     Titel: Optimierung mit fmincon()
  Antworten mit Zitat      
Hallo,

Ich moechte folgendes Problem mit Matlab loesen. Bin aber leider Matlab noob.

\min_{ci}|v_{k+1}-\sum_i^k c_i v_i|^2


s.t.


\sum_i(c_i) = 1

Weitere Anmerkungen:
v sind spalten vectoren einer (k+1)x(k+1) Matrix, die gegeben ist.
C = [c_1, ..., c_k] \epsilon R^k

Mein Problem ist wie kann ich die Matrix bzw. eine liste von vectoren als Eingabe verwenden?
So weit ich matlab verstehe schaut es vll so bei i=1 aus?:
>> vkp1 = [39,39,-82]
>> v = [-70,70,0]
>> fun = @(x) norm(vkp1 - x(1)*v)^2
>> x0 = 2 (random gewaehlt)
>> Aeq = [1]
>> beq = 1
>> fmincon(fun, x0, [], [], Aeq, beq)

Wie mache ich das jetzt mit mehr v vektoren?

Hoffe jemand kann mit helfen und danke schon mal.
Private Nachricht senden Benutzer-Profile anzeigen


Friidayy
Forum-Century

Forum-Century


Beiträge: 225
Anmeldedatum: 17.12.13
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 01.03.2016, 12:40     Titel:
  Antworten mit Zitat      
Möchtest du wissen, wie man die Matrix V übergibt, oder willst du wissen wie man fmincon sagt, dass die Optimierungsvariablen in einer Matrix C stehen? Ist es richtig, dass die Matrix V für das Optimierungsproblem konstant ist?

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

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 01.03.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.03.2016, 12:50     Titel:
  Antworten mit Zitat      
Wenn du so fragst, dann glaube ich beides.
V ist konstant korrekt.
Private Nachricht senden Benutzer-Profile anzeigen
 
Friidayy
Forum-Century

Forum-Century


Beiträge: 225
Anmeldedatum: 17.12.13
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 01.03.2016, 13:23     Titel:
  Antworten mit Zitat      
Du definierst dir einen Funktion, z.b. mit dem Namen minFcn, die du gerne minimieren möchtest. In etwa so:

function y=minFcn(p,v)
...
end

Hierbei ist y die Ausgangsgröße, p dein Parametervektor, bzw. die Variablen durch welche du die Funktion minimieren kannst und v sind deine konstanten Parameter.
Anschließend rufst du den Solver folgendermaßen auf:

solution=fmincon(@(p)minFcn(p,v),...)

Damit "weiß" der Solver, das er die Funktion über p minimieren kann und v konstant ist.

Bezüglich des anderen Problems: Du kannst fmincon nur Parameter in Form eines Vektors vorgeben, d.h. eine Matrix C wird nicht akzeptiert. Um aus einer Matrix einen Vektor zu machen, kannst du den Befehl "reshape" benutzen. Innerhalb der minFcn musst du dann den Parametervektor zurück in eine Matrix reshapen.

Du solltest mit diesen Ansätzen die Aufgabe lösen können, Viele Grüße Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
Caramba
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 01.03.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.03.2016, 14:47     Titel:
  Antworten mit Zitat      
mh also das mit dem C leuchtet mir noch nicht ein..

meine function bissher:
Code:
function y = minFcn(c, v, vsize)
  msize = sqrt(vsize)
  mv = reshape(v, [msize, msize])
  vkp1 = mv(:,msize)

  y = norm(vkp1 - c*mv)^2;
end


vsize ist die Anzahl an Eintraegen in v
mv ist meine V Matrix.
vkp1 ist die letzte Saplte der V Matrix.

Was schreibe ich jetzt nach y = ??
ich brauch als Zuweisung sozusagen eine for schleife, die ueber V Spalten itteriert^^
Ich glaube, ich habe hier das Prinzip von Matlab noch nicht ganz verstanden..
Das Problem habe ich dann auch noch in der Nebenbedingung

EDIT: die sum() function!
y = norm(vkp1 - sum(c*mv(:,(1:size-1))))^2;

Kann das funktionieren?

EDIT: y = norm(vkp1 - sum(c(1:size-1)*mv(:,(1:size-1))))^2;
Private Nachricht senden Benutzer-Profile anzeigen
 
Friidayy
Forum-Century

Forum-Century


Beiträge: 225
Anmeldedatum: 17.12.13
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 01.03.2016, 15:23     Titel:
  Antworten mit Zitat      
Ich bin davon ausgegangen, dass C eine Matrix ist, ist aber ein Vektor. Dann brauchst also nichts zu reshapen. Die Funktionen sollten dann folgendermaßen ausschauen:

function y=minFcn(c,V)
...
end

mit V als Matrix der Spaltenvektoren vi und y als Ausgangswert deiner zu minimierenden Funktion y=(v_k+1 - sum(ci*vi))^2

solution=fmincon(@(c)minFcn(c,V),...)
Private Nachricht senden Benutzer-Profile anzeigen
 
Caramba
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 01.03.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.03.2016, 18:22     Titel:
  Antworten mit Zitat      
Also meine Funktion schaut jetzt so aus:
Code:
function y = minFnc(c, V)
  vsize = size(V,2);
  vkp1 = V(:,vsize);
   
  y = norm(vkp1 - sum(c*V(:,(1:(vsize-1)))))^2;
end


Aeq ist ein vektor mit einsen je nach Dimension von V
beq = 1
Sollte passen oder?
Private Nachricht senden Benutzer-Profile anzeigen
 
Friidayy
Forum-Century

Forum-Century


Beiträge: 225
Anmeldedatum: 17.12.13
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 01.03.2016, 18:34     Titel:
  Antworten mit Zitat      
Ja, scheint alles zu passen soweit.
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: 02.03.2016, 11:45     Titel:
  Antworten mit Zitat      
Hallo,

da die Zielfunktion least squares ist und die Nebenbedingung linear sind, sollte man lsqlin verwenden.

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

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 01.03.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.03.2016, 11:56     Titel:
  Antworten mit Zitat      
Ich glaube da war noch ein kleiner Fehler.
In der Minimierungsfunktion unter der Summe seht ja c_iv_i also ein Wert aus dem c vektor, nicht der ganze Vektor. Meine neue Loesung sieht dann so aus:

Code:
function y = minFcn(c, V)
    vsize = size(V,2);
    vkp1 = V(:,vsize);
   
    sum = c(:,1)*V(:,1);
    for ind=2:vsize-1;
        sum = sum + c(:,ind)*V(:,ind);
    end
   
   y = norm(vkp1 - sum)^2;
end


Denke das sollte jetzt passen. Smile
Danke fuer Deine Hilfe!

Habe noch eine letzte Frage auch wenn sie dumm scheinen mag^^
Ist das ein Lineares, konvexes oder nichtlineares Optimierungsproblem mit linearer / nicht linearer Nebenbedingung?
Ich tippe auf Nichtlineares Optimierungsproblem mit linearer Nebenbedingung.
Oder ist sagt man einfach nur mit Nebenbedingung?

EDIT: @Harald habe deine Antwort noch nicht gesehen als ich meine geschrieben habe.
Wie wuerde das dann mit lsqlin aussehen?
Private Nachricht senden Benutzer-Profile anzeigen
 
Friidayy
Forum-Century

Forum-Century


Beiträge: 225
Anmeldedatum: 17.12.13
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 02.03.2016, 12:23     Titel:
  Antworten mit Zitat      
Schau dir mal die Doku zu lsqnonlin an http://de.mathworks.com/help/optim/ug/lsqnonlin.html

Dort findest du eigentlich alles was du wissen möchtest. Du ersetzt einfach fmincon durch lsqnonlin Smile
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: 02.03.2016, 12:34     Titel:
  Antworten mit Zitat      
Hallo,

es sollte nicht lsqnonlin verwendet werden, sondern lsqlin .

\sum_i^k c_i v_i ist äquivalent zu V*c, wobei V die Matrix mit v_1 bis v_k und c ein Spaltenvektor mit den c_i ist.

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

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 01.03.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.03.2016, 12:58     Titel:
  Antworten mit Zitat      
also statt fmincon lsqlin.
Ich mach das also einfach so:

Docu: lsqlin(C,d,A,b,Aeq,beq,lb,ub)
C ist mein V ohne letzte Spalte
d ist meine letzte Spalte aus V (also vkp1)
x ist mein c
Aeq passender 1er vektor
beq 1

lsqlin(V, vkp1, [], [], [1,...,1], 1, [], [])
Scheint das selbe raus zukommen. Verstehen tue ich es nur nicht^^
Private Nachricht senden Benutzer-Profile anzeigen
 
Friidayy
Forum-Century

Forum-Century


Beiträge: 225
Anmeldedatum: 17.12.13
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 02.03.2016, 13:05     Titel:
  Antworten mit Zitat      
Das das Gleiche rauskommt, ist schonmal ein gutes Ergebnis Very Happy
Das Ding ist halt, dass du mit lsqlin die spezielle Struktur der Aufgabe ausnutzt, sodass die Rechenzeit reduziert wird. Du kannst das ja mal mit tic; toc; überprüfen.
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: 02.03.2016, 14:00     Titel:
  Antworten mit Zitat      
Hallo,

was genau verstehst du nicht?

Falls es darum geht, warum hier die andere Methode empfohlen wird: siehe Friidayys Beitrag. Insbesondere werden bei fmincon die Gradienten durch Sekantensteigungen (und damit verbundene zusätzliche Funktionsauswertungen) geschätzt. Bei diesem speziellen Problem können die Gradienten ja aber analytisch ermittelt werden, was genauer und schneller ist.
Hilfreich finde ich z.B. auch, dass lsqlin ohne Startwert auskommt - und Startwerte sind ja oft schwierig zu schätzen.

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.