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: Entstehung komplexer Parameter verhindern

 

nixChef

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.10.2013, 10:48     Titel: Optimierung: Entstehung komplexer Parameter verhindern
  Antworten mit Zitat      
Hallo liebe Forumsbesucher,

ich habe eine dringende Frage zu folgendem Problem:
Ich versuche gerade eine Gleichung mit 9 Parametern auf einen vorgegebenen Kurvenverlauf (welcher komplexe Anteile besitzt) zu fitten. Die Parameter sind dabei jedoch alle reell. Lasse ich den lsqnonlin laufen um die Parameter nach dem least square verfahren zu optimieren, so bekommen ich komplexe Parameter als Ergebnis. Die Parameter dürfen jedoch nicht komplex werden. Der Imaginärteil ist durch die Ausgangsgleichung ja schon berücksichtigt. Wie kann ich Matlab sagen, dass die zu optimierenden Parameter ausschließlich reeller Natur sein dürfen?

Vielen Dank für eure Hilfe!

Gruß nixChef


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.10.2013, 12:21     Titel:
  Antworten mit Zitat      
Hallo,

die einfachste Lösung: spalte die Gleichung an sich in Real- und Imaginärteil auf. Im Zweifelsfall, indem du am Ende deiner Funktion statt eines Spaltenvektors y den Vektor [real(y); imag(y)] zurückgibst.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.10.2013, 14:07     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für dein schnelle Antwort!

Ich hätte schon in meiner Problemstellung dazuschreiben sollen, dass Real- und Imaginärteil nicht getrennt optimiert werden kann, da die Parameter sowohl auf den Real- als auch auf den Imaginärteil wirken. Wird also nur einer der beiden Teile optimiert, kann der andere irgendwas machen. Es muss schon das gesamte Konstrukt optimiert werden.

Es muss doch irgendwie möglich sein Matlab mitzuteilen, dass die Parameter während dem Optimierungsvorgang nur im reellen variiert werden dürfen?!?

Gruß nixChef
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.10.2013, 15:44     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Es muss schon das gesamte Konstrukt optimiert werden.

... und genau das wird passieren, wenn du meinen Vorschlag umsetzt. Ich meine ja, dass du in der Zielfunktion die Aufspaltung machen sollst und statt einer Minimierung der Abweichungen jeweils die Abweichungen in Realteil und Imaginärteil - nicht nacheinander, sondern quasi auf einmal - minimieren sollst.
Wenn du ein Beispiel lieferst, kann ich das gerne anhanddessen testen.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.10.2013, 11:40     Titel:
  Antworten mit Zitat      
Hallo Harald,

nochmals Danke für deine Antwort. Ich denke ich weiß nun was du gemeint hast:

Fehlervektor = Fehler(Realteil) + Fehler(Imaginärteil)

Kann das sein? Ist jedenfalls plausibel und habs schon ausprobiert. Es findet eine Optimierung statt, die Werte die erzeugt werden sind plausibel. So sollte es also passen.

Danke nochmals!

Gruß nixChef
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 26.10.2013, 12:11     Titel:
  Antworten mit Zitat      
Hallo,

entweder das, oder (vielleicht noch besser) wie eingangs vorgeschlagen Realwert und Imaginärwert als verschiedene Komponenten gleichzeitig anpassen.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.01.2014, 01:02     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke nochmals für dein Ratschläge von vor fast drei Monaten. Ich habe wieder ein Problem mit der nichtlinearen Optimierung mit Hilfe des lsqnonlin.
Der Startvektor, den ich für die Optimierung vorgebe ist besser, d.h. näher an der Messkurve auf die ich meine Modellparameter fitten will dran, als der optimierte Vektor!? Und ich glaube, darum schreib ich das auch hier zu diesem Beitrag, dass es an der Fehlersumme liegt.
Ich habe bisher meine obige Lösung also

Fehlervektor = Fehler(Realteil) + Fehler(Imaginärteil)

implementiert. Ich würde gerne deine Lösung mal ausprobieren, verstehe aber nicht, was du mit "Real- und Imaginärteil als getrennte Komponenten gleichzeitig optimieren" meinst?! Kannst du mir das erklären?


Vielen Danke schon einemal!

Gruß nixChef
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.01.2014, 10:45     Titel:
  Antworten mit Zitat      
Hallo,

ich meinte im Grunde so etwas in der Art. Vielleicht an einem Beispiel:
min(abs(z^2)) würde mit z = x + i*y zu
min(abs(x^2 + 2*i*x*y - y^2)) bzw.
min( (x^2 - y^2)^2 + (2*x*y)^2 )

Um zu verhindern, dass die Fehler sich gegenseitig auslöschen, ist es bei deiner Formulierung wichtig, dass der Betrag der Fehler genommen wird oder (wohl üblicher, weil differenzierbar) das Quadrat der Fehler genommen wird.

Code:
Fehlervektor = (Fehler(Realteil)).^2 + (Fehler(Imaginärteil)).^2


Berechne doch mal den Fehlervektor (bzw. seine Norm) für den Startvektor und für den optimierten Vektor.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.01.2014, 13:03     Titel:
  Antworten mit Zitat      
Hallo Harald,

wow, vielen Dank für die super schnell Antwort!

Ich habe noch einen Fehler bei mir entdeckt. Hatte folgendes Implementiert:

Fehlervektor = abs(real(z_simuliert)) - abs(real(z_gemessen)) + abs(imag(z_simuliert)) - abs(imag(z_gemessen))

das macht aber klar keinen Sinn.

Ich habs geändert und werde nun mal die quadrierte Abweichen des Real- und Imaginärteils (also deine Vorschlag) testen.

Ich schreibe dann hier rein, obs geklappt hat!

Vielen Dank nochmal!

Gruß nixChef
 
nixChef

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.01.2014, 16:09     Titel:
  Antworten mit Zitat      
Hallo Harald,

also ich habe deine Vorschlag ausprobiert, aber es funktioniert nicht. Die "optimierten" Parameter sind extrem schlecht. Ich kann es mir mittlerweile nicht mehr erklären woher dieses Verhalten kommt. Ich habe auf der mathworks-Seite noch einen weiteren Vorschlag gefunden, wie der Fehlervektor übergeben werden kann:

F = [real(errors(Smile); imag(errors(Smile)];

Aber auch das ändert nichts. Es muss also noch irgendwo ein Implementierungsfehler vorliegen. Als eine mögliche Fehlerquelle sehe ich weiterhin den Fehlervektor an. Eine zweite Möglichkeit habe ich gerade noch entdeckt. Ich rufe den lsqnonlin wie folgt auf:

[x,resnorm,residual,exitflag,output,lambda] = lsqnonlin(@Fittingfunktion,x0,xmin,xmax,options);

wobei x0 mein Startvektor, xmin die untere Grenze und xmax die obere Grenze der Parameter darstellt.

Habe eine weitere Möglichkeit auf der Mathworks-HP entdeckt, wobei ich nicht verstehe wie sie genau funktioniert:

[x,resnorm] = lsqnonlin(@(c)myfun(c,xdata,ydata),[1 3])

Was genau bedeutet das @(c)myfun(c,xdata,ydata)? Also warum wird das c in Klammern vorneweg geschrieben?

Gruß nixChef
 
nixChef

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.01.2014, 16:11     Titel:
  Antworten mit Zitat      
hier noch der link zu dem Beispiel auf der Mathworks-HP:

http://www.mathworks.com/matlabcentral/answers/99986


Gruß
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.01.2014, 16:18     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Ich kann es mir mittlerweile nicht mehr erklären woher dieses Verhalten kommt.

Ich kann dir dabei nur helfen, wenn ich weiß, was du genau machst --> vollständiger Code + Testdaten.
Ich hatte dir mal einen Vorschlag gemacht und weiß nicht, ob du ihn umgesetzt hast bzw. was wenn dabei herausgekommen ist:
Zitat:
Berechne doch mal den Fehlervektor (bzw. seine Norm) für den Startvektor und für den optimierten Vektor.


Wenn du lsqnonlin verwendest, ist es in der Tat unnötig, den Betrag selbst zu nehmen bzw. zu quadrieren.

Im Beispiel wird ein anonymous function handle verwendet, das kannst du in der Hilfe nachlesen, z.B. hier:
http://www.mathworks.de/de/help/mat...../anonymous-functions.html

Gegenfrage: wie bekommst du denn die Daten in deine Zielfunktion?

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.01.2014, 16:35     Titel:
  Antworten mit Zitat      
Hallo,

ich weiß es ist schwer zu helfen, wenn man keinen code sieht. Das doofe ist, dass ich den Code und die Daten nicht online stellen kann, weil es sich um sensible Infos handelt... Sad ...Ich versuch mal ein Minimalbeispiel zu geben wie die Optimierung implementiert ist:

Zitat:
Gegenfrage: wie bekommst du denn die Daten in deine Zielfunktion?


Code:

options     = optimset('Algorithm','trust-region-reflective','Display','final','MaxFunEvals',15000,'MaxIter',5000,'TolX',0.000000000005,'TolFun',0.0000000000005);


[x,resnorm,residual,exitflag,output,lambda] = lsqnonlin(@Fittingfunktion,x0,xmin,xmax,options);
 


Code:
%Fittingfunktion

%% Führe Simulationsmodell aus

    Sim_Modell_v1;
   

%% Fehlervektor berechnen
ReZ    = evalin('base','ReZ');
ImZ    = evalin('base','ImZ');

F = [(real(Zges') - ReZ); (imag(Zges') - ImZ)];

 



Erklärung: Durch den Aufruf des lsqnonlin wird der Startvektor x0 an die Fittingfunktion übergeben. Im Workspace dieser Funktion werden die Parameter (also das x) vom Simulationsmodell übernommen und das Ergebnis (Zges) erzeugt. Danach wird der Fehlervektor F berechnet, der wiederum an den lsqnonlin zurückgegeben wird.

Zu deinem Vorschlag:
Muss ich noch ausprobieren. Mach ich sofort!

Hilft dir das?!

Gruß nixChef
 
nixChef

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.01.2014, 16:50     Titel:
  Antworten mit Zitat      
ach ja, noch eine Ergänzung:

Das Modell besitzt reelle Parameter A,B,C. Hier ein Beispiel des Modells:

Code:

A = x(1);
B = x(2);
C = x(3);

Zges = A+ 1/(1/(1i*B) + 1/C)
 


Die reellen Parameter sollen nun so optimiert werden, dass das Modell den gemessenen Daten möglichst genau folgt.

Gruß
 
nixChef

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.01.2014, 16:59     Titel:
  Antworten mit Zitat      
ach mist, das war falsch! Verbesserung:

Code:

A = x(1);
B = x(2);
C = x(3);

f = Messdaten;

for k = 1:1:length(f),

      Zges(k) = A+ 1/(1/(1i*f(k)*B) + 1/C);
 
end;

 
 
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.