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

lsqnonlin -Syntax korrekt?Wie zusätzlichen Vektor übergebe

 

Andband
Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 10.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.06.2009, 14:44     Titel: lsqnonlin -Syntax korrekt?Wie zusätzlichen Vektor übergebe
  Antworten mit Zitat      
Hallo Smile
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 Very Happy). 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:

Code:

x = lsqnonlin(@Minimumsfunktion,x0,linke_grenzwerte,rechte_grenzwerte);
 


zusätzliches m.file mit titel Minimumsfunktion.m:

Code:
function Fehler=Minimumsfunktion(x,Messwert)
k=1:360
Fehler= (x(1)*sin(k+x(6))+ x(2)*sin(2*k+x(7))+ x(3)*sin(3*k+x(8))+ x(4)*sin(4*k+x(9))+ x(5)*sin(5*k+x(10)))-Messwert[k];



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. Smile

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? Smile
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 Smile

Vielen Dank euch !!!
Private Nachricht senden Benutzer-Profile anzeigen


steve
Ehrenmitglied

Ehrenmitglied



Beiträge: 2.022
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2023b
     Beitrag Verfasst am: 16.06.2009, 15:19     Titel:
  Antworten mit Zitat      
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:
Code:
x = lsqnonlin(@Minimumsfunktion,x0,linke_grenzwerte,rechte_grenzwerte,[],Messwert);

Die Minimierungsfunktion sähe dann so aus:
Code:
function Fehler=Minimumsfunktion(x,Messwert)
k=1:360
Fehler= (x(1).*sin(k+x(6))+ x(2).*sin(2.*k+x(7))+ x(3).*sin(3.*k+x(8))+ x(4).*sin(4.*k+x(9))+ x(5).*sin(5.*k+x(10)))-Messwert[k]; % hier musst du die Matrixoperationen verwenden (.*) damit keine Dimensionsfehler kommen.

Irgendwie kommt mir die Fehlerberechnung aber noch komisch vor. Der Gesamtfehler soll doch minimiert werden, oder? Dann musst du den ganzen Vektor noch aufsummieren:
Code:
Fehler= sum((x(1).*sin(k+x(6))+ x(2).*sin(2.*k+x(7))+ x(3).*sin(3.*k+x(8))+ x(4).*sin(4.*k+x(9))+ x(5).*sin(5.*k+x(10)))-Messwert[k]);
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 Wink

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 10.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.06.2009, 15:43     Titel:
  Antworten mit Zitat      
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 Smile

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

Ehrenmitglied



Beiträge: 2.022
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2023b
     Beitrag Verfasst am: 16.06.2009, 15:59     Titel:
  Antworten mit Zitat      
Uups... Klarer Fall von: Wer lesen kann ist besser dran Wink

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 10.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.06.2009, 17:29     Titel:
  Antworten mit Zitat      
ok danke nochmals Smile - ich werd es dann mal mit den echten Messdaten testen Smile

lg
and
Private Nachricht senden Benutzer-Profile anzeigen
 
Andband
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 10.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.06.2009, 18:48     Titel:
  Antworten mit Zitat      
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 Smile

Mein Versuch:
Also folgendes
Code:

function Fehler=Minimumsfunktion(x,Messwert)
k=1:360
Fehler= (x(1).*sin(k+x(6))+ x(2).*sin(2.*k+x(7))+ x(3).*sin(3.*k+x(8))+ x(4).*sin(4.*k+x(9))+ x(5).*sin(5.*k+x(10)))-Messwert[k]
 

funktioniert wie gesagt und es kommen Koeffizienten heraus. Ich hab dann es versucht zu ersetzen mit:


Code:

function Fehler=Minimumsfunktion(x,geschw,anz_koeff)
k=1:360;
Fehler=0;
for ii=1:anz_koeff
   Fehler=Fehler+x(ii).*sin(ii*k+x(ii+anz_koeff));
if (i==anz_koeff)
    Fehler=Fehler-geschw(k);
end
end
 

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 Very Happy
danke!
Private Nachricht senden Benutzer-Profile anzeigen
 
steve
Ehrenmitglied

Ehrenmitglied



Beiträge: 2.022
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2023b
     Beitrag Verfasst am: 16.06.2009, 20:34     Titel:
  Antworten mit Zitat      
Moin,

ich bin mir nicht sicher, aber evtl. könnte das helfen:
Code:
function Fehler=Minimumsfunktion(x,geschw,anz_koeff)
k=1:360;
Fehler=zeros(size(k));
for l=1:anz_koeff
    Fehler=Fehler+x(l).*sin(l.*k+x(l+anz_koeff));
%     if (l==anz_koeff)
%         Fehler=Fehler-geschw(k);
%     end
end
Fehler = Fehler - geschw;


Zur Erklärung: Die Funktion arbeitet Vektorbasiert. Du erstellst mit
Code:
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 Wink)
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.
Code:

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 Wink

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 10.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.06.2009, 22:45     Titel:
  Antworten mit Zitat      
Steve du bist mein Held Smile - Jetzt liefern beide Varianten dasselbe Ergebnis.
Ich dachte mir das mit dem Vektor irgendwie unterbewusst - aber ich habs halt net erkannt Smile
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.