|
|
Optimierung mit fmincon() |
|
Caramba |

Forum-Newbie
|
 |
Beiträge: 7
|
 |
|
 |
Anmeldedatum: 01.03.16
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 01.03.2016, 12:34
Titel: Optimierung mit fmincon()
|
 |
Hallo,
Ich moechte folgendes Problem mit Matlab loesen. Bin aber leider Matlab noob.
s.t.
Weitere Anmerkungen:
v sind spalten vectoren einer (k+1)x(k+1) Matrix, die gegeben ist.
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.
|
|
|
|
|
Friidayy |

Forum-Century
|
 |
Beiträge: 225
|
 |
|
 |
Anmeldedatum: 17.12.13
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: R2012b
|
 |
|
|
 |
|
Verfasst am: 01.03.2016, 12:40
Titel:
|
 |
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
|
|
|
Caramba |
Themenstarter

Forum-Newbie
|
 |
Beiträge: 7
|
 |
|
 |
Anmeldedatum: 01.03.16
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 01.03.2016, 12:50
Titel:
|
 |
Wenn du so fragst, dann glaube ich beides.
V ist konstant korrekt.
|
|
|
Friidayy |

Forum-Century
|
 |
Beiträge: 225
|
 |
|
 |
Anmeldedatum: 17.12.13
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: R2012b
|
 |
|
|
 |
|
Verfasst am: 01.03.2016, 13:23
Titel:
|
 |
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
|
|
|
Caramba |
Themenstarter

Forum-Newbie
|
 |
Beiträge: 7
|
 |
|
 |
Anmeldedatum: 01.03.16
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 01.03.2016, 14:47
Titel:
|
 |
mh also das mit dem C leuchtet mir noch nicht ein..
meine function bissher:
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;
|
|
|
Friidayy |

Forum-Century
|
 |
Beiträge: 225
|
 |
|
 |
Anmeldedatum: 17.12.13
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: R2012b
|
 |
|
|
 |
|
Verfasst am: 01.03.2016, 15:23
Titel:
|
 |
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),...)
|
|
|
Caramba |
Themenstarter

Forum-Newbie
|
 |
Beiträge: 7
|
 |
|
 |
Anmeldedatum: 01.03.16
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 01.03.2016, 18:22
Titel:
|
 |
Also meine Funktion schaut jetzt so aus:
Aeq ist ein vektor mit einsen je nach Dimension von V
beq = 1
Sollte passen oder?
|
|
|
Friidayy |

Forum-Century
|
 |
Beiträge: 225
|
 |
|
 |
Anmeldedatum: 17.12.13
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: R2012b
|
 |
|
|
 |
|
Verfasst am: 01.03.2016, 18:34
Titel:
|
 |
Ja, scheint alles zu passen soweit.
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.501
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 02.03.2016, 11:45
Titel:
|
 |
Hallo,
da die Zielfunktion least squares ist und die Nebenbedingung linear sind, sollte man
lsqlin
verwenden.
Grüße,
Harald
|
|
|
Caramba |
Themenstarter

Forum-Newbie
|
 |
Beiträge: 7
|
 |
|
 |
Anmeldedatum: 01.03.16
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 02.03.2016, 11:56
Titel:
|
 |
Ich glaube da war noch ein kleiner Fehler.
In der Minimierungsfunktion unter der Summe seht ja also ein Wert aus dem c vektor, nicht der ganze Vektor. Meine neue Loesung sieht dann so aus:
Denke das sollte jetzt passen.
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?
|
|
|
Friidayy |

Forum-Century
|
 |
Beiträge: 225
|
 |
|
 |
Anmeldedatum: 17.12.13
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: R2012b
|
 |
|
|
 |
|
Verfasst am: 02.03.2016, 12:23
Titel:
|
 |
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.501
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 02.03.2016, 12:34
Titel:
|
 |
Hallo,
es sollte nicht lsqnonlin verwendet werden, sondern
lsqlin
.
ist äquivalent zu , wobei V die Matrix mit v_1 bis v_k und c ein Spaltenvektor mit den c_i ist.
Grüße,
Harald
|
|
|
Caramba |
Themenstarter

Forum-Newbie
|
 |
Beiträge: 7
|
 |
|
 |
Anmeldedatum: 01.03.16
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 02.03.2016, 12:58
Titel:
|
 |
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^^
|
|
|
Friidayy |

Forum-Century
|
 |
Beiträge: 225
|
 |
|
 |
Anmeldedatum: 17.12.13
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: R2012b
|
 |
|
|
 |
|
Verfasst am: 02.03.2016, 13:05
Titel:
|
 |
Das das Gleiche rauskommt, ist schonmal ein gutes Ergebnis
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.
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.501
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 02.03.2016, 14:00
Titel:
|
 |
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
|
|
|
|
Gehe zu Seite 1, 2 Weiter
|
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
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| 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.
|
|