|
|
lsqnonlin -Syntax korrekt?Wie zusätzlichen Vektor übergebe |
|
Andband |
Forum-Anfänger
|
|
Beiträge: 34
|
|
|
|
Anmeldedatum: 10.03.09
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 16.06.2009, 14:44
Titel: lsqnonlin -Syntax korrekt?Wie zusätzlichen Vektor übergebe
|
|
|
|
|
Hallo
ich hab hier ein längeres Skript das Messdaten auswertet. Um eine mathematisch beschriebene Kurve zu bekommen, wollte ich jetzt lsqnonlin verwenden. Dabei sollen 10 Parameter optimiert werden.
Habe diese Funktion selbst noch nie verwendet (ich hab eh denk ich noch nicht viele Funktionen von Matlab verwendet ). Laut der Hilfe braucht man da jedenfalls wohl ein 2.tes m-File in der die eigentliche zu minimierende Funktion steht.
Also mein Versuch schaut so aus:
Hauptfile:
zusätzliches m.file mit titel Minimumsfunktion.m:
Meine erste Frage ist:
wäre das von der Syntax her so richtig?
Die Kurve am Ende soll eben aus 5 superpositionierten Sinus-Funktionen bestehen.
Und Zweitens:
Jetzt hab ich das Problem, dass ich in meiner Minimungsfunktion den Vektor "Messwert" brauche.
Dazu fallen mir 3 Möglichkeiten ein:
1. Irgendwie vermeiden das man ein zusätzliches m file braucht. Geht das? Wenn ja, wie?
2. An die "Minimumsfunktion" den Vektor Messwert noch übergeben (im Code ist sie auch so dargestellt, als ob sie ihn bekommen würde, aber sie bekommt ihn natürlich nicht, woher auch) - wie mache ich das?
3. "Messwert" in Datei ausgeben und diese wieder einlesen. Das fände ich aber irgendwie nicht sonderlich gut
Vielen Dank euch !!!
|
|
|
|
|
steve |
Ehrenmitglied
|
|
Beiträge: 2.022
|
|
|
|
Anmeldedatum: 03.09.07
|
|
|
|
Wohnort: Wien
|
|
|
|
Version: R2023b
|
|
|
|
|
|
Verfasst am: 16.06.2009, 15:19
Titel:
|
|
Moin,
ja, soweit ich das sehe stimmt die Syntax bis auf eine Kleinigkeit (die einen Fehler produzieren wird) soweit.
Die zweite Idee würde ich bevorzugen. Wenn ich richtig liege, sollte der Aufruf dann so aussehen:
Die Minimierungsfunktion sähe dann so aus:
Irgendwie kommt mir die Fehlerberechnung aber noch komisch vor. Der Gesamtfehler soll doch minimiert werden, oder? Dann musst du den ganzen Vektor noch aufsummieren:
Wobei auch das noch nicht die beste Lösung ist. Etwas besser wäre evtl. die Quadratfehlersumme oder so - aber das musst du dann wissen
Gruß
Alex
_________________
>> I told me to.
____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
|
|
|
Andband |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 34
|
|
|
|
Anmeldedatum: 10.03.09
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 16.06.2009, 15:43
Titel:
|
|
Hi Steve,
das ging ja sehr schnell. Danke für deine Antwort. Also alle Vektoren die ich übergeben will, muss ich am Ende einfach dahinter schreiben. Und dieses [] steht wohl als Platzhalter für nicht verwendete Paramter der Funktion selber. Super.
Das mit dem .Operator stimmt wahrscheinlich auch
Hm, ich dachte die lsqnonlin Funktion macht das Quadrieren irgendwie. automatisch. Aufsummiert wird mit k=1:360 dachte ich. Mom..in der Hilfe steht als Beispiel:
Bei mir summiere ich halt über jeden Messwert auf.
Was meinst du ? - Ist das dann trotzdem falsch?
|
|
|
steve |
Ehrenmitglied
|
|
Beiträge: 2.022
|
|
|
|
Anmeldedatum: 03.09.07
|
|
|
|
Wohnort: Wien
|
|
|
|
Version: R2023b
|
|
|
|
|
|
Verfasst am: 16.06.2009, 15:59
Titel:
|
|
Uups... Klarer Fall von: Wer lesen kann ist besser dran
Ja, die [] sind Platzhalter, da LSQNONLIN an dieser Stelle Optimierungssettings erwartet und du ja keine übergeben möchtest. Alles was danach übergeben wird, wird in der Reihenfolge an deine Minimierungsfunktion übergeben.
Gruß
Alex
_________________
>> I told me to.
____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
|
|
|
Andband |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 34
|
|
|
|
Anmeldedatum: 10.03.09
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 16.06.2009, 17:29
Titel:
|
|
ok danke nochmals - ich werd es dann mal mit den echten Messdaten testen
lg
and
|
|
|
Andband |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 34
|
|
|
|
Anmeldedatum: 10.03.09
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 16.06.2009, 18:48
Titel:
|
|
|
|
|
hm - ok das skript läuft, das Ergebnis ist Mist. Werd mir das nochma von der Idee selbst her anschauen müssen.
Unabhängig davon:
Meine Sinuskurve aus mehreren Sinusen besteht ja gerade aus 5 Parts.
Nehmen wir mal an, ich würde die Anzahl der Sinus Summanden über einen weiteren Parameter steuern wollen, wie muss ich da vorgehen?
Also ich mein klar kann ich per Hand noch mehr dazu schreiben, aber es sollte halt automatisiert ablaufen
Mein Versuch:
Also folgendes
funktioniert wie gesagt und es kommen Koeffizienten heraus. Ich hab dann es versucht zu ersetzen mit:
wobei ich für anz_koeff mal 5 als Test übergeben habe. Da sollte ja dann dasselbe rauskommen wie oben. Das haut aber nicht mehr hin. Er rechnet zwar auch, aber es kommt nur noch eine 0 Linie als Ergebnis heraus.
Weiß jemand woran das liegt?
Ich versteh das mit dem k=1:360 eh nicht so ganz fällt mir dazu noch ein. Damit wird ja irgendwie ein Vektor k erstellt, und für jeden dieser Einträge wird dann ein aufsummierter Wert für Fehler erzeugt?
Wäre echt toll, wenn hier noch jemand was sagen könnte
danke!
|
|
|
steve |
Ehrenmitglied
|
|
Beiträge: 2.022
|
|
|
|
Anmeldedatum: 03.09.07
|
|
|
|
Wohnort: Wien
|
|
|
|
Version: R2023b
|
|
|
|
|
|
Verfasst am: 16.06.2009, 20:34
Titel:
|
|
|
|
|
Moin,
ich bin mir nicht sicher, aber evtl. könnte das helfen:
Zur Erklärung: Die Funktion arbeitet Vektorbasiert. Du erstellst mit
einen Vektor mit den Einträgen 1 bis 360 im Abstand von 1 (also [1 2 3 4 ... 359 360]). In der ursprünglichen Gleichung haben wir die elementweisen Matrixoperationen (.*) verwendet um für jeden Eintrag aus "k" einen Fehler zu berechnen. Matlab erkennt dabei automatisch das ein Vektor entsteht und dadurch wird "Fehler" gleich zu einem Vektor mit ebenfalls 360 Einträgen (sollte zumindest )
In deinem zweiten Versuch hast du das nicht berücksichtigt. Bei meinem Code habe ich versucht das umzusetzen. Dazu habe ich "Fehler" am Anfang als einen Vektor der gleichen Größe von "k" erstellt und alle Einträge mit 0 belegt.
Anschließend habe ich in der Schleife nur noch die Laufvariable geändert, ist ne Angewohnheit von mir keine "i" oder "j" Derivate zu verwenden, da diese intern von Matlab als imaginäre Zahl gehändelt werden. Deine If-Abfrage macht nicht wirklich Sinn, da du das was du machst, auch ohne Probleme nach der Schleife durchführen kannst.
So, ich hoffe das hilft dir etwas weiter - war der längste Post von mir, seit langem
Gruß
Alex
_________________
>> I told me to.
____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
|
|
|
Andband |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 34
|
|
|
|
Anmeldedatum: 10.03.09
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 16.06.2009, 22:45
Titel:
|
|
Steve du bist mein Held - Jetzt liefern beide Varianten dasselbe Ergebnis.
Ich dachte mir das mit dem Vektor irgendwie unterbewusst - aber ich habs halt net erkannt
|
|
|
|
|
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.
|
|