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

Funktion fitten mit lsqcurvefit

 

jonny65
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 75
Anmeldedatum: 15.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.05.2013, 08:26     Titel: Funktion fitten mit lsqcurvefit
  Antworten mit Zitat      
Hallo liebe Forum-Gemeinde,

ich habe ein kleines Problem. Ich will zum ersten mal die Funktion lsqcurvefit benutzen und hab leider keine Ahnung wie das gehen soll, da ich die Hilfe auch nicht so richtig verstehe.

Ich habe eine Tabelle mit x und y Werten. Wenn ich diese Plotte entsteht ein Bild mit mehreren Peaks. Nun will ich einen bestimmten Bereich der Kurve fitten, den der Benutzer selbst auswählen kann. Für diesen Zweck kann der Benutzer einfach einen Startwert und einen Endwert eingeben.

Jetzt hab ich erstmal versucht mich mit der Hilfe irgendwie durchzuquälen.
Als erstes hab ich mir mein xdata und mein ydata definiert.

xdata=S((Startwert_double:Endwert_double),1);
ydata=S((Startwert_double:Endwert_double),2);

S sei dabei meine Tabelle.

Die Funktion lautet: f(x)= A/((2*pi*s**2)**0.5)*exp((-0.5*(x-xc)**2)/(s**2))

Dabei sind die Variablen A und s schon definiert.

Ab jetzt hackt es leider bei mir und ich weiß nicht wie ich weiter machen soll.

Kann mir da jemand helfen. Vielen Dank schonmal für Tipps und Anregungen.

Gruß jonny65
Private Nachricht senden Benutzer-Profile anzeigen


jonny65
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 75
Anmeldedatum: 15.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.05.2013, 08:43     Titel:
  Antworten mit Zitat      
Also bis jetzt habe ich das so:

Code:
A=y;
s=0.5;
xc=mean(Startwert_double:Endwert_double);
fun= f(x)=A/((2*pi*s**2)**0.5)*exp((-0.5*(x-xc)**2)/(s**2))
xdata=S((Startwert_double:Endwert_double),1);
ydata=S((Startwert_double:Endwert_double),2);



[b, resnorm]=lsqcurvefit(fun,x0,xdata,ydata)


Was ist hierbei mein x0? oder wie definiere ich das?

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

x0 ist der Startvektor, also ein Vektor derselben Länge wie die Anzahl Parameter.

Das größere Problem sehe ich aber in deinem "fun".
** gibt es in MATLAB so nicht, Potenzierung wäre .^

Schau dir vielleicht mal die Beispiele an in
Code:


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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 75
Anmeldedatum: 15.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.05.2013, 09:12     Titel:
  Antworten mit Zitat      
Vielen Dank für deine schnelle Antwort.
Ich habe das Programm jetzt etwas verändert:

Code:
A=y;
s=0.5;
xc=mean(Startwert_double:Endwert_double);
fxt=A/((2*pi*s^2)^0.5)*exp((-0.5*(x-xc)^2)/(s^2))
xdata=S((Startwert_double:Endwert_double),1);
ydata=S((Startwert_double:Endwert_double),2);
x0=S(Startwert,:);




[x, resnorm]=lsqcurvefit(fxt,x0,xdata,ydata)
 

passt das mit dem x0 so ? Das ist jetzt praktisch mein Start x-Wert und y-Wert? Jetzt habe ich noch das Problem, dass er mir sagt, das x undefiniert sei. Warum? Ich dachte x bräuchte man hier nicht fest definieren oder?

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

fxt muss ein Function Handle sein, z.B. so

Code:
fxt=@(xc, x) A/((2*pi*s^2)^0.5)*exp((-0.5*(x-xc).^2)/(s^2))


Wenn du xc finden willst, dann brauchst du als Startwert einen Skalar. Eine Möglichkeit wäre 0.

Wenn du die Code-Umgebung verwendest, werden Smileys ignoriert und der Code überhaupt schöner dargestellt.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 75
Anmeldedatum: 15.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.05.2013, 12:31     Titel:
  Antworten mit Zitat      
Vielen Dank! Jetzt hab ich das so ungefähr geändert, allerdings sagt er mir jetzt das mein s nicht definiert sei, woran kann das liegen, da ich das ja eig vorher definiert habe:

Code:
A=y;
s=0.5;
xc=mean(Startwert_double:Endwert_double);
fxt= @(x,A,s,xc)  A/((2*pi*s^2)^(0.5))*exp((-0.5*(x-xc)^2)/(s^2));
xdata=S((Startwert_double:Endwert_double),1);
ydata=S((Startwert_double:Endwert_double),2);  
x0=S(Startwert,:);


[x, resnorm]=lsqcurvefit(fxt,x0,xdata,ydata)
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

du hast es zuvor definiert, und genau deswegen solltest du es nicht in die Liste der (von lsqcurvefit zu übergebenden) Funktionsargumente aufnehmen.

Versuchs doch mal mit dem fxt, das ich dir vorgeschlagen hatte.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 75
Anmeldedatum: 15.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.05.2013, 20:57     Titel:
  Antworten mit Zitat      
okay, ich werde es gleich morgen ausprobieren. Vielen Dank schonmal!!
Private Nachricht senden Benutzer-Profile anzeigen
 
jonny65
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 75
Anmeldedatum: 15.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.05.2013, 08:49     Titel:
  Antworten mit Zitat      
Ich habe es jetzt so gemacht, wie es bei dir steht. Bei mir sieht es jetzt so aus:
Code:

A=y;
s=0.5;
xc=mean(Startwert_double:Endwert_double);
fxt= @(xc,x)  A/((2*pi*s^2)^(0.5))*exp((-0.5*(x-xc)^2)/(s^2))
xdata=S((Startwert_double:Endwert_double),1);
ydata=S((Startwert_double:Endwert_double),2);  
x0=S(Startwert,:);


[x, resnorm]=lsqcurvefit(fxt,x0,xdata,ydata)


allerdings kommt anschließend die Fehlermeldung:


Code:
??? Error using ==> minus
Matrix dimensions must agree.

Error in ==> Auswerten>@(xc,x)A/((2*pi*s^2)^(0.5))*exp((-0.5*(x-xc)^2)/(s^2)) at 169
fxt= @(xc,x)  A/((2*pi*s^2)^(0.5))*exp((-0.5*(x-xc)^2)/(s^2)) %Funktion


Woran kann das liegen? Außerdem habe ich noch kurz eine Frage zu x0, da ich das irgendwie immer noch nicht richtig verstanden habe. Ich habe x0 jetzt definiert als mein Startpunkt. Das heißt der Start X- und Y-Wert. Ist das richtig ?

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 28.05.2013, 09:18     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:

Wenn du xc finden willst, dann brauchst du als Startwert einen Skalar. Eine Möglichkeit wäre 0.

Code:
x0=S(Startwert,:);

siht irgendwie nicht danach aus
Private Nachricht senden Benutzer-Profile anzeigen
 
jonny65
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 75
Anmeldedatum: 15.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.05.2013, 10:58     Titel:
  Antworten mit Zitat      
Ich möchte xc, A und s finden. xc hab ich ja eig schon definiert durch:
Code:

xc=mean(Startwert_double:Endwert_double);


Also praktisch der Mittelwert. Trotzdem spuckt er mir eine Fehlermeldung nach der anderen aus. Sry, aber ich mach das zum ersten mal und weiß im Moment echt nicht weiter.
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 28.05.2013, 11:07     Titel:
  Antworten mit Zitat      
wenn alle deine parameter definiert sind ist deine funktion doch bestimmt. was willst du denn nun fitten? du hast deine funktion so geschrieben das du xc fitten willst hast es aber dennoch schon festgelegt als skalar und ihm dann trotzdem noch einen startwert gegeben der kein skalar ist....
also was willst du denn jetzt bestimmen? xc? s ? A?
wenn du alle 3 finden willst
Code:
fxt= @(para,x)  para(1)/((2*pi*para(2)^2)^(0.5))*exp((-0.5*(x-para(3))^2)/(para(2)^2))
xdata=S((Startwert_double:Endwert_double),1);
ydata=S((Startwert_double:Endwert_double),2);  
x0=rand(1,3)
[x, resnorm]=lsqcurvefit(fxt,x0,xdata,ydata)
Private Nachricht senden Benutzer-Profile anzeigen
 
jonny65
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 75
Anmeldedatum: 15.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.05.2013, 09:23     Titel:
  Antworten mit Zitat      
Hallo winkow.

Vielen Dank für deine Antwort! Doch leider versteh ich es immer noch nicht und es funktioniert auch nicht. So sieht jetzt mein Code aus:

Code:
  para(1)=y; %def. max Intensität als Fläche des Peaks
    para(2)=0.5; %fester Wert
    para(3)=0; %Mittelwert für xc
    fxt= @(para,x)  para(1)/((2*pi*para(2)^2)^(0.5))*exp((-0.5*  (x-para(3))^2)/(para(2)^2))
    xdata=S((Startwert_double:Endwert_double),1);
    ydata=S((Startwert_double:Endwert_double),2);  
    x0=rand(1,3)
    [x, resnorm]=lsqcurvefit(fxt,x0,xdata,ydata)


Meine Funktion ist in den xdata und ydata gespeichert. Und ich möchte alle 3 Werte finden, also s,A und xc.
Sry, wenn ich hier Blödsinn schreibe, aber ich mache das zum ersten mal und arbeite auch noch nicht lange mit Matlab.

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 29.05.2013, 09:51     Titel:
  Antworten mit Zitat      
jonny65 hat Folgendes geschrieben:
Hallo winkow.

Doch leider versteh ich es immer noch nicht und es funktioniert auch nicht.

Grüße

was funktioniert nicht? welche fehlermeldung?
Code:

para(1)=y; %def. max Intensität als Fläche des Peaks
    para(2)=0.5; %fester Wert
    para(3)=0; %Mittelwert für xc

warum legst du werte fest für parameter die du finden willst?
wenn das die start werte seien sollen dann steht das schon in den startwerten x0
Private Nachricht senden Benutzer-Profile anzeigen
 
jonny65
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 75
Anmeldedatum: 15.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.05.2013, 10:02     Titel:
  Antworten mit Zitat      
Ja, das sollten die Startwerte sein. Dachte man müsste die vorher definieren.

Ich habe es jetzt mal so geschrieben, wie von dir vorgeschlagen:

Code:
fxt= @(para,x)  para(1)/((2*pi*para(2)^2)^(0.5))*exp((-0.5*(x-para(3))^2)/(para(2)^2))
    xdata=S((Startwert_double:Endwert_double),1);
    ydata=S((Startwert_double:Endwert_double),2);  
    x0=rand(1,3)
    [x, resnorm]=lsqcurvefit(fxt,x0,xdata,ydata)


Dafür kommt die Fehlermeldung:

Code:
??? Error using ==> mpower
Inputs must be a scalar and a square matrix.
Private Nachricht senden Benutzer-Profile anzeigen
 
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.