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?
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
nixChef
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 25.10.2013, 14:07
Titel:
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?!?
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
nixChef
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 26.10.2013, 11:40
Titel:
Hallo Harald,
nochmals Danke für deine Antwort. Ich denke ich weiß nun was du gemeint hast:
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.
entweder das, oder (vielleicht noch besser) wie eingangs vorgeschlagen Realwert und Imaginärwert als verschiedene Komponenten gleichzeitig anpassen.
Grüße,
Harald
nixChef
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 12.01.2014, 01:02
Titel:
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
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?
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.
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: ---
Verfasst am: 12.01.2014, 16:09
Titel:
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(); imag(errors()];
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:
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.
Gegenfrage: wie bekommst du denn die Daten in deine Zielfunktion?
Grüße,
Harald
nixChef
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 12.01.2014, 16:35
Titel:
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... ...Ich versuch mal ein Minimalbeispiel zu geben wie die Optimierung implementiert ist:
Zitat:
Gegenfrage: wie bekommst du denn die Daten in deine Zielfunktion?
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: ---
Verfasst am: 12.01.2014, 16:50
Titel:
ach ja, noch eine Ergänzung:
Das Modell besitzt reelle Parameter A,B,C. Hier ein Beispiel des Modells:
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
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.