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

Messwerte fitten mit rekursiver Summenfunktion

 

der_Maddin

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.04.2009, 10:52     Titel: Messwerte fitten mit rekursiver Summenfunktion
  Antworten mit Zitat      
Hallo zusammen,

ich habe Messdaten, die eine exponentiell ansteigende Kurve beschreiben. Ich möchte diese Messwerte gerne mit einer bestimmten Funktion abbilden. Allerdings ist dies eine rekursive Summenfunktion (siehe .doc-Datei).

Ist es Eurer Meinung nach prinzipiell möglich eine Art Optimierung (lsqcurvefit o.ä.) laufen zu lassen, bei der die Parameter a, b und c so lange variiert werden, bis die Kurve optimal auf die Messerwerte passt?

Für Tips und Hinweise wäre ich sehr Dankbar!

Gruß,
der Maddin

Funktion.doc
 Beschreibung:

Download
 Dateiname:  Funktion.doc
 Dateigröße:  16.5 KB
 Heruntergeladen:  973 mal


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 08.04.2009, 12:42     Titel:
  Antworten mit Zitat      
Das sollte gehen.
Zu berücksichtigen:
- eine ausreichende Anzahl Messwerte (min. 20, besser ~100)
- wenn Resultate trotzdem unbefriedigend sind: bessere Startwerte
Private Nachricht senden Benutzer-Profile anzeigen
 
der_Maddin

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.04.2009, 15:35     Titel:
  Antworten mit Zitat      
na das stimmt mich ja schonmal optimistisch Wink

Ich habe die Funktion jetzt so dargestellt:


% A ist x(1)
% b ist x(2)
% d ist x(3)

B = 3;

for i=1:210000
if i==1
f(i) = x(1)* exp(x(2)*B);
else
f(i) = f(i-1) + x(1) * exp( x(2)*B+x(3)*f(i-1) );
end


Es sind zwar nicht sonderlich viele Messdaten, aber ein Beispiel für den Anfang für x- und y-Daten ist:

xdata = [0 , 120000, 150000, 170000, 187500, 210000]';
ydata = [0.9, 1 , 1.05 , 1.1 , 1.15 , 1.2 ]';

Aber wie könnte ich jetzt am geschicktesten vorgehen, um unter Variation von x(1), x(2) und x(3) die Messdaten optimal abzubilden? ...ist ja doch irgendwie nicht so einfach wie ein "normales" curve-fitting Sad

Kann mir da jemand auf die Sprünge helfen?
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 08.04.2009, 18:42     Titel:
  Antworten mit Zitat      
Die Formel stimmt nicht mit der im WORD-Dokument überein. Dort wird D_i (?) aus einer Summe gebildet. Was ist n?

Mir kommt die Formel im WORD-Dokument komisch vor. Bitte auf Tippfehler u.ä. überprüfen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Lucia
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 55
Anmeldedatum: 19.03.09
Wohnort: ---
Version: R2008b
     Beitrag Verfasst am: 09.04.2009, 09:37     Titel:
  Antworten mit Zitat      
Wenn ich es richtig verstehe, ist aus D f geworden? Prinzipiell würde die Funktion so aussehen:
Code:
function F=myfun(x,xdata)
B = 3;
f=zeros(1,210000);

for i=(0:210000)+1
if i==1
    f(i) = x(1)* exp(x(2)*B);
else
    f(i) = f(i-1) + x(1) * exp( x(2)*B+x(3)*f(i-1) );
end
end
F=f(xdata+1);


Dann kann man lsqcurvefit z.B. so aufrufen:
Code:
x = lsqcurvefit(@myfun, [0.9 0 0] ,xdata', ydata')


Vermutlich funktioniert das aber nicht besonders gut! Kann man denn evtl. die Schrittweite erhöhen, z.B. auf 100? Also:
Code:
for i=(0:210000/100)+1
und
Code:
F=f(xdata/100+1);
Private Nachricht senden Benutzer-Profile anzeigen
 
der_Maddin

Gast


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

die Formel im Word-Dokument soll schon so sein, wenn dann habe ich sie vielleicht in Matlab falsch umgesetzt. Ich wusste nicht, wie ich es mit einer Summenfunktion machen kann, also habe ich eine Schleife genommen. Aber da stimmte tatsächlich etwas nicht. Ich habe es nochmal umgeändert:

% a ist x(1)
% b ist x(2)
% c ist x(3)

B = 2;

for i=1:210000 % Zählvariable N der Summenfunktion
if i==1
D(i) = x(1)* exp(B*x(2)); % erstes Summenglied, da D(0)=0
else
D(i) = D(1) * exp( x(3)*D(i-1) );
end

Ich müsste doch nun 210000 "D-Werte" erhalten. "D_1" bis "D_210000" sind quasi meine Y-Werte und i=1 bis i=210000 trage ich auf der x-Achse auf. Nun sollen x(1), x(2) und x(3) so zwischen 0 und 1 variiert werden, dass die o.g. Messwerte bzw. deren Kurve optimal getroffen wird. Wie stelle ich sowas an?
 
der_Maddin

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.04.2009, 14:54     Titel:
  Antworten mit Zitat      
Danke Lucia, ich werde über die Ostertage mal ein wenig rumprobieren und gebe dann Feedback wies geklappt hat!
 
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.