|
|
Verwendung von fminunc/fmincon in Algorithmus |
|
Sehiro |

Forum-Newbie
|
 |
Beiträge: 3
|
 |
|
 |
Anmeldedatum: 14.02.16
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 06.03.2016, 15:36
Titel: Verwendung von fminunc/fmincon in Algorithmus
|
 |
|
 |
|
Hallo,
ich habe derzeit Probleme, einen coordinate-descent artigen Algorithmus in Matlab zu implementieren.
Ich habe eine Funktion f gegeben, deren Gradient ich analytisch berechnen kann. In jeder Iteration meines Verfahrens möchte ich nun f(x^k+t*e_i) nach t minimieren, und dazu fminunc verwenden.
Meine Funktion f liefert sowohl den Funktionswert als auch den Gradient an der Stelle x:
Dann möchte ich, dass mein Algorithmus etwa so aussieht.
Dies funktioniert jedoch nicht, da der zweite Output von fi der Gradient der Funktion an der Stelle x ist, für die eindimensionale Optimierung bräuchte ich jedoch nur die Ableitung nach t (was gerade der i-te Eintrag des Gradienten ist). Gibt es also eine einfache Möglichkeit, wie ich aus dem function handle fi ein function handle bauen kann, welches als ersten Output f(x+te_i) liefert (genau wie fi), als zweiten Output jedoch nur den i-ten Eintrag des Gradienten?
Ich hoffe es ist verständlich was ich machen möchte.
(vielleicht nochmal ohne das ganze außenrum nur der Kern das Problems. Ich habe eine Funktion f
und möchte ein function handle bauen, dass als Input t erhält und als ersten output f(x+te_i) und als zweiten Output df_i(x+te_i) zurückgibt. )
Eine mögliche Lösung, welche mir aber nicht besonders gut gefällt, wäre, der Funktion als dritten, optionalen, Inputparameter i zu übergeben. Falls dieser Parameter übergeben wird, würde die Funktion dann nur den i-ten Eintrag des Gradienten als zweiten Output zurückgeben. Zum einen würde ich aber gerne an der Funktion f nichts ändern müssen, zum anderen würde ich gerne allgemein verstehen wie man dieses Problem löst, und mir nicht nur einen Workaround für das spezielle Problem überlegen.
Für einen anderen Algorithmus habe ich das selbe Problem mit fmincon, aber wenn ich obiges Problem gelöst habe sollte das dann genauso gehen.
Danke schonmal für jede Hilfe!
|
|
|
|
|
Friidayy |

Forum-Century
|
 |
Beiträge: 225
|
 |
|
 |
Anmeldedatum: 17.12.13
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: R2012b
|
 |
|
|
 |
|
Verfasst am: 06.03.2016, 16:09
Titel:
|
 |
Scheint so, als wolltest du eine Schrittweitensteuerung implementieren, richitg?
f(x^k+t*e_i), xk wäre in dem Fall deine aktuelle Iterierte, t die Schrittweite und e_i deine aktuelle Suchrichtung? Du möchtest also letztendlich entlang der Suchrichtung dein t so wählen, dass der Funktionswert minimal ist.
Würde es dein Problem lösen, wenn du einfach zwei Functions schreibst. Eine zur Funktionsauswertung und eine zur berechnung des Gradienten?
P.S. Warum möchtest du umbedingt die "optimale" Schrittweite bestimmen? Die benötigte Rechenzeit wird dadurch extrem nach oben gehen. Normalerweise implementiert man Schrittweitensteuerungen so wie hier https://www.google.de/url?sa=t&.....6274245,d.bGQ&cad=rja
Gruß
|
|
|
Sehiro |
Themenstarter

Forum-Newbie
|
 |
Beiträge: 3
|
 |
|
 |
Anmeldedatum: 14.02.16
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 06.03.2016, 16:21
Titel:
|
 |
|
 |
|
Danke für die Antwort.
Zur Schrittweite: Es geht um ein Verfahren für sparsity constraint optimization, und mit den herkömmlichen Schrittweitenstrategien kann man da leider keine Konvergenz des Verfahrens garantieren (die Funktion f ist hier i.A. auch nicht konvex oder so). Daher die Minimierung.
Wenn ich zwei Funktionen schreibe, stehe ich doch vor einem ähnlichen Problem.
dann hätte ich zwei Funktionen f und df.
tut ja auch nicht das gewünschte, da ich dann wieder nicht auf den einzelnen Eintrag des Gradienten zugreifen kann. ich bräuchte sowas wie dfi(i)(t), was natürlich nicht der richtige Syntax ist.
Vielleicht fehlt mir auch nur ein stückchen syntax dass das alles möglich macht, aber ich sehe noch nicht wie das mein Problem löst.
Edit: Okay, in dem Fall kann man das ja tatsächlich einfach umgehen indem man
verwendet.
Irgendwie kommt mir das trotzdem sehr unschön vor. Wenn also jemand noch einen Vorschlag hat wie ich das ganze schöner machen kann, wäre ich dankbar
|
|
|
|
|
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.
|
|