|
|
Nicht-lineares Optimierungsproblem lösen - wie? |
|
clustering_n00b |
Forum-Century
|
|
Beiträge: 129
|
|
|
|
Anmeldedatum: 05.09.11
|
|
|
|
Wohnort: ---
|
|
|
|
Version: R2011a, R2012b
|
|
|
|
|
|
Verfasst am: 02.01.2013, 13:34
Titel: Nicht-lineares Optimierungsproblem lösen - wie?
|
|
Hi!
Es geht darum, ein recht komplexes Optimierungsproblem zu lösen, und zwar, soll die folgende Funktion minimiert werden:
Zitat: |
cost(Z) = ||I-R*S(Z, L)||^2
wobei
I, R, L: Konstanten sind (Matrizen)
S(Z, L) = funktion1(funktion2(funktion3(Z), konstante1), L)
funktion1,..,3: beliebige nicht-lineare Funktionen |
Z: die zu minimierende Variable ist (m x n Matrix)
Nun habe ich mir lsqnonlin abgeschaut (Doku, Tutorial).
Ich kann es nicht direkt benutzen, da ich keine Funktion F(x) = Korrelationsfunktion(Z(1), Z(2), ..) direkt definieren kann (die Abhängigkeit ist recht verschachtelt, wie oben erkennbar).
Hat jemand einen Vorschlag, wie dieses Problem angepackt werden kann?
|
|
|
|
|
MaFam |
Forum-Meister
|
|
Beiträge: 799
|
|
|
|
Anmeldedatum: 02.05.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: R2009b
|
|
|
|
|
|
Verfasst am: 02.01.2013, 16:04
Titel:
|
|
Hallo,
ich wüsste nicht, warum hier eine Verkettung nicht funktionieren sollte. lsqnonlin ist egal, ob die Zielfunktion verkettet ist.
Grüße, Marc
|
|
|
clustering_n00b |
Themenstarter
Forum-Century
|
|
Beiträge: 129
|
|
|
|
Anmeldedatum: 05.09.11
|
|
|
|
Wohnort: ---
|
|
|
|
Version: R2011a, R2012b
|
|
|
|
|
|
Verfasst am: 02.01.2013, 18:18
Titel:
|
|
|
|
|
MaFam hat Folgendes geschrieben: |
Hallo,
ich wüsste nicht, warum hier eine Verkettung nicht funktionieren sollte. lsqnonlin ist egal, ob die Zielfunktion verkettet ist.
Grüße, Marc |
Da hast du im Prinzip Recht. Ich bin aber dennoch darüber erstaunt, dass sich die Zielvariable gar nicht verändert (über 12 Iterationen!).
Ich möchte doch kurz erläutern, was die einzelnen Verkettungsfunktionen sind.
1) Variable Z definieren
2) Variable Z in einen struct speichern
state.Z = Z
3) Den struct in einen Vektor umwandeln (da lsqnonlin nur mit Vektoren arbeitet) über
[statevector, template] = struct2vector(state);
4) lsqnonlin aufrufen
state_final = lsqnonlin(@lossfunc, statevector, [], [], options, template);
5) Innerhalb von lossfunc finden folgende Schritte statt:
5.1) Zurück zur struct-Darstellung
state = vector2struct(statevector, template)
5.2) Die Variable Z aus dem Struct rausziehen
Z = state.Z
5.3) Neue Werte von Z berechnen
[X, ~] = funktion1(Z)
5.4) Eine weitere Umformung ausführen
[S, ~, ] = funktion2(X, L)
5.5) Die zu minimierende Funktion definieren
cost = || I - R*S || ^2 (wobei I und R als Konstanten definiert werden)
Ich habe mal die Zielvariable Z in jeder Iteration geplottet. Sie scheint sich aber gar nicht zu verändern.
Hat jemand eine Idee was hier schief gegangen sein könnte?
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.495
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 02.01.2013, 19:01
Titel:
|
|
Hallo,
eine Möglichkeit ist, dass du ein lokales Minimum bzw. einen Punkt nahe daran als Startwert angegeben hast. Probier also mal andere Startwerte.
Eine weitere Möglichkeit ist, dass die zu variierenden Größen nicht korrekt übergeben werden und somit die verwendete Zielfunktion unabhängig von den zu variierenden Größen ist.
Ich würde mir immer das dritte Rückgabeargument EXITFLAG des Solvers ansehen. Darin gibt der Solver ja an, wie die Resultate aufzufassen sind.
Genauere Unterstützung wird man nur anhand eines reproduzierbaren Beispiels geben können.
Grüße,
Harald
|
|
|
clustering_n00b |
Themenstarter
Forum-Century
|
|
Beiträge: 129
|
|
|
|
Anmeldedatum: 05.09.11
|
|
|
|
Wohnort: ---
|
|
|
|
Version: R2011a, R2012b
|
|
|
|
|
|
Verfasst am: 02.01.2013, 20:06
Titel:
|
|
Harald hat Folgendes geschrieben: |
Ich würde mir immer das dritte Rückgabeargument EXITFLAG des Solvers ansehen. Darin gibt der Solver ja an, wie die Resultate aufzufassen sind.
|
Hallo Harald!
Wie kann ich den EXITFLAG anschauen, bevor die Funktion ausgeführt wird? Es wird nämlich unendlich weitergerechnet.
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.495
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 02.01.2013, 20:20
Titel:
|
|
Hallo,
Zitat: |
Wie kann ich den EXITFLAG anschauen, bevor die Funktion ausgeführt wird? |
Gar nicht. Das bezieht sich ja auf das Endergebnis.
Zitat: |
Es wird nämlich unendlich weitergerechnet. |
Ich halte es für sehr unwahrscheinlich, dass unendlich weitergerechnet wird. Es gibt eine Option, die die maximale Anzahl von Iterationen angibt (MaxFunEvals).
Ich würde mal etwas Geduld mitbringen und schauen, ob sich die Zielfunktion früher oder später doch noch ändert.
Grüße,
Harald
|
|
|
MaFam |
Forum-Meister
|
|
Beiträge: 799
|
|
|
|
Anmeldedatum: 02.05.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: R2009b
|
|
|
|
|
|
Verfasst am: 03.01.2013, 09:32
Titel:
|
|
Warum kapselst du eigentlich deine Variablen in einem struct? Das hatte ich in einem anderen Thread von dir auch schon bemerkt. Ich erkenne den Sinn dahinter nicht so recht.
|
|
|
|
|
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 - 2024
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.
|
|