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

Nicht-lineares Optimierungsproblem lösen - wie?

 

clustering_n00b
Forum-Century

Forum-Century


Beiträge: 129
Anmeldedatum: 05.09.11
Wohnort: ---
Version: R2011a, R2012b
     Beitrag Verfasst am: 02.01.2013, 13:34     Titel: Nicht-lineares Optimierungsproblem lösen - wie?
  Antworten mit Zitat      
Hi! Very Happy

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?
Private Nachricht senden Benutzer-Profile anzeigen


MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 02.01.2013, 16:04     Titel:
  Antworten mit Zitat      
Hallo,

ich wüsste nicht, warum hier eine Verkettung nicht funktionieren sollte. lsqnonlin ist egal, ob die Zielfunktion verkettet ist.

Grüße, Marc
Private Nachricht senden Benutzer-Profile anzeigen
 
clustering_n00b
Themenstarter

Forum-Century

Forum-Century


Beiträge: 129
Anmeldedatum: 05.09.11
Wohnort: ---
Version: R2011a, R2012b
     Beitrag Verfasst am: 02.01.2013, 18:18     Titel:
  Antworten mit Zitat      
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?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 02.01.2013, 19:01     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
clustering_n00b
Themenstarter

Forum-Century

Forum-Century


Beiträge: 129
Anmeldedatum: 05.09.11
Wohnort: ---
Version: R2011a, R2012b
     Beitrag Verfasst am: 02.01.2013, 20:06     Titel:
  Antworten mit Zitat      
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.
Code:
[x,resnorm,residual,exitflag] = lsqnonlin(...)
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 02.01.2013, 20:20     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 03.01.2013, 09:32     Titel:
  Antworten mit Zitat      
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.
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 - 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.