Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Bücher:

Digitale Signalverarbeitung mit MATLAB-Praktikum

Fachkräfte:
weitere Angebote

Partner:


Vermarktungspartner


Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Gaußfunktion fitten mit lsqcurvefit

 

SaFW
Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 24.02.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.03.2020, 17:27     Titel: Gaußfunktion fitten mit lsqcurvefit
  Antworten mit Zitat      
Hallo Leute,

ich hab zwar schon viel zu dem Thema gefunden, wurde aber irgendwie nicht schlauer.
Wie schon am Titel zu erkennen ist, möchte ich eine Gaußfunktion an eine Kurve mittels des Befehls lsqcurvefit anfitten.
Ich habe zwei Datenreihen mit der Größe 1x121 double. Die X-Daten gehen von 1 bis 121 in einer Schritten und die Y-Daten sind experimentelle Werte, die sich im Größenbereich von 1 bis 255 bewegen.

Der Syntax des Befehls ist ja: lsqcurvefit(fun,x0,xdata,ydata)
Meine Fragen sind hierbei nun, wie ich das x0 auswähle und wie man das mit der Funktion geregelt bekommt. Alle meine bisherigen Versuche endeten leider in Fehlermeldungen. Confused
Hoffe, dass jemand helfen kann
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

poste bitte deine bisherigen Versuche und die zugehörigen Fehlermeldungen.

Bei einer Gaußfunktion können Mittelwert und Standardabweichung der Daten als Startwerte helfen. Die Syntax der Funktion wird in der Dokumentation von lsqcurvefit beschrieben.

Je konkreter die Frage bzw. das Problem, desto besser kann man helfen.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
SaFW
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 24.02.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.03.2020, 04:01     Titel:
  Antworten mit Zitat      
Hallo,

ich bedanke mich erstmal für den Tipp und habe noch versucht das x0 mithilfe der Standardabweichung und des Mittelwertes zu beschreiben, jedoch hat das an meiner Lage nichts verändert.

Mein bisheriger Code sieht so aus:

Code:
xdata = 1:length(Daten);
ydata = double(Daten);
mu = mean(ydata);
sig = std(ydata);
lsqcurvefit(@Gauss,[mu sig],xdata,ydata);


Die Funktion "Gauss" habe ich separat in einer m-File (Gauss.m) abgespeichert. An der wird es wahrscheinlich auch liegen, dass nichts funktioniert. Embarassed

Code:
function G= 1/(sig*(sqrt(2*pi)))*exp(((-1/2)*((x-mu)/sig)^2))
mu = mean(ydata);
sig = std(ydata);
x=ydata;
end
 


Die Fehlermeldung die ich dann bekomme lautet:
Error: File: Gauss.m Line: 1 Column: 13
Invalid expression. Check for missing multiplication operator, missing or unbalanced delimiters, or other syntax error. To construct matrices, use
brackets instead of parentheses.

Error in lsqcurvefit (line 214)
initVals.F = feval(funfcn_x_xdata{3},xCurrent,XDATA,varargin{:});

Error in Fit (line 55)
lsqcurvefit(@Gauss,[mu sig],xdata,ydata);

Caused by:
Failure in initial objective function evaluation. LSQCURVEFIT cannot continue.

Ich konnte bisher alle Probleme, die ich bei Matlab hatte, nach längerer Überlegung und Recherche lösen, aber das hat hierbei nicht so richtig funktioniert...
Ich bedanke mich schon mal für jede Hilfe Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

wie du schon vermutest, liegt es an der Funktion. Insbesondere fehlt dort die Deklarationszeile mit den Inputs und Outputs.

Aus der Doku:
Zitat:
where myfun is a MATLAB® function such as

function F = myfun(x,xdata)
F = ... % Compute function values at x, xdata


Du musst also dein mu und sigma zu einem Vektor x zusammenfassen und in der Zielfunktion wieder herausholen:
Code:
mu = x(1);
sigma = x(2);

Dann folgt die Berechnung von F bzw. du nanntest es G.

Edit: Im übrigen gibt es das ganze auch quasi vorgefertigt über normfit oder fitdist.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
SaFW
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 24.02.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.03.2020, 18:32     Titel:
  Antworten mit Zitat      
Hallo,

also danke für den Tipp mit der Funktion. Damit hab ich wirklich noch Probleme und vermeide es daher immer welche zu benutzen. Mir wurde zwar schon gesagt, dass man damit viele Sachen vereinfachen kann, aber ich komme damit einfach nicht so klar.

So sieht es jetzt bei mir aus:
Code:
function G= myfun(x,ydata)
mu = mean(ydata);
sig = std(ydata);
x=[mu sig];
G=1/(sig*(sqrt(2*pi)))*exp(((-1/2)*((ydata-mu)/sig).^2));
end


Ich bekomme jetzt zwar keine Fehlermeldung mehr, eine Fitkurve aber ebenfalls nicht.
Leider wurde mir vorgeschrieben, dass ich den Fit mit lsqcurvefit machen soll.
Gruß Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 21.158
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.03.2020, 19:06     Titel:
  Antworten mit Zitat      
Hallo,

die Signatur der Funktion stimmt nun. Als nächstes müsstest du den Rat von vorhin umsetzen:
Code:
mu = x(1);
sigma = x(2); % bzw. sig

also
Code:
function G= myfun(x,ydata)
mu = x(1);
sigma = x(2);
G=1/(sig*(sqrt(2*pi)))*exp(((-1/2)*((ydata-mu)/sig).^2));
end


Um eine Kurve zu bekommen, musst du schon was plotten. lsqcurvefit berechnet nur die Parameter der Kurve.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
SaFW
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 24.02.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.03.2020, 20:12     Titel:
  Antworten mit Zitat      
Hallo,

okay jetzt hab ich auch verstanden warum du den Code erwähnt hast. Dachte, dass ich auch einfach
Code:
x=[mu sig];
schreiben kann. Aber da lag ich wohl falsch. Wie gesagt, das Verständnis hinter der function ist immer noch nicht 100%ig da. Embarassed

Zu dem Plot:
Also benötige ich eine Funktion, die meinem derzeitigen gezeichneten Graphen beschreibt und in der ich meine Parameter einfüge, um damit dann den Fitgraphen zeichnen zu können? Oder kann man das auch einfacher angehen?

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

Forum-Meister


Beiträge: 21.158
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.03.2020, 20:19     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Dachte, dass ich auch einfach
x=[mu sig];
schreiben kann. Aber da lag ich wohl falsch.

Das ist Zusammenfassen, man musste aber aufspalten. Also genau die falsche Richtung.

Zitat:
die meinem derzeitigen gezeichneten Graphen beschreibt und in der ich meine Parameter einfüge, um damit dann den Fitgraphen zeichnen zu können?

Das klingt sehr kompliziert. Du musst lediglich die Ergebnisse in die Funktion einsetzen.

Code:
xOpt = lsqcurvefit(...);
yFitted = Gauss(xOpt, xdata);
plot(xdata, yFitted)


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
SaFW
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 24.02.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.03.2020, 21:36     Titel:
  Antworten mit Zitat      
Hallo,

danke für die Hilfe mit dem Plot! Jedoch ist dieser nicht wirklich zufriedenstellend. Ich schätze mal,dass sich irgendwo noch ein Tippfehler befindet. Deswegen werde ich jetzt nochmal alles anhand eines Beispiels durchgehen.

Meine Funktion Gauss.m sieht wie folgt aus:

Code:
function G= myfun(x,ydata)
mu = x(1);
sig = x(2);
G=1/(sig*(sqrt(2*pi)))*exp(((-1/2)*((ydata-mu)/sig).^2));
end


Der Rest ist dann:
Code:
Daten=[3   24   4   11   18   6   12   7   16   3   28   8   6   9   25   26   20   8   34   30   35   17   30   21   26   29   27   57   58   51   62   57   76   65   76   104   87   99   108   112   117   127   174   147   155   166   185   213   208   206   238   224   255   232   232   255   255   254   255   255   255   255   255   255   255   255   255   255   226   215   235   238   211   172   208   188   181   151   143   129   132   116   119   112   93   96   99   66   68   53   65   43   64   30   51   26   33   41   23   25   15   25   27   23   24   26   20   11   10   23   17   10   4   14   23   20   2   25   3   14   11] % uint8
xdata = 1:length(Daten);
ydata = double(Daten);
plot(xdata,ydata);
hold on
mu = mean(ydata);
sig = std(ydata);
x=[mu sig];
F=lsqcurvefit(@Gauss,x,xdata,ydata);
yFitted = Gauss(F, xdata);
plot(xdata, yFitted)


Das Resultat ist in dem angehängten Bild zu sehen Confused
Ich hab bisher nur die Vermutung, dass sich in der Gleichung ein Fehler befinden könnte.
Danke für die Hilfe Harald, hast mir auf jeden Fall schon sehr geholfen und ohne dich wäre ich wohl schon an der function gescheitert Laughing

Graph.png
 Beschreibung:

Download
 Dateiname:  Graph.png
 Dateigröße:  12.19 KB
 Heruntergeladen:  20 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 21.158
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.03.2020, 23:21     Titel:
  Antworten mit Zitat      
Hallo,

die Fläche unter einer Verteilung ist immer 1. Das passt nicht zu deinem Histogramm.
Du musst entweder das Histogramm normalisieren oder die Verteilung skalieren.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
SaFW
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 24.02.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.03.2020, 13:21     Titel:
  Antworten mit Zitat      
Hallo,

also benötige ich einen Faktor, mit dem ich meine Fitwerte multipliziere, damit sich dann eine Kurve zeichnet, die einem Fit an meine Werte entspricht?

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

Forum-Meister


Beiträge: 21.158
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.03.2020, 13:30     Titel:
  Antworten mit Zitat      
Ja.
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
SaFW
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 24.02.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.03.2020, 13:54     Titel:
  Antworten mit Zitat      
Alles klar,

dankeschön! Ich versuche es jetzt mal und melde mich, wenn ich es hinbekommen habe bzw falls ich es nicht hinbekommen sollte

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
SaFW
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 24.02.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.03.2020, 15:38     Titel:
  Antworten mit Zitat      
Hallo,

ich hab jetzt sowohl versucht meine Daten zu normalisieren mit normalize und histogram (hat nichts wirklich an dem Ergebnis geändert), als auch einfach meine gefitteten Daten zu skalieren. Das hat zwar den Graphen an sich verändert, jedoch hat das wenig mit fit zu tun...(siehe Bild)

Hab auch gemerkt, dass die ganze Zeit diese Meldung kommt:
Local minimum possible.

lsqcurvefit stopped because the final change in the sum of squares relative to
its initial value is less than the value of the function tolerance.

<stopping criteria details>

Hat aber an sich so wie ich das jetzt verstanden habe, wenig mit meinem Problem zu tun, sondern nur, dass Matlab hier auf seine Grenzen stößt.

Grüße

Graph2.png
 Beschreibung:

Download
 Dateiname:  Graph2.png
 Dateigröße:  12.83 KB
 Heruntergeladen:  17 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
normalisieren mit normalize

Nicht sinnvoll, da das eine vollkommen andere Art der Normalisierung ist.

Zitat:
Hat aber an sich so wie ich das jetzt verstanden habe, wenig mit meinem Problem zu tun, sondern nur, dass Matlab hier auf seine Grenzen stößt.

Das hast du falsch verstanden. Die Meldung besagt, dass der Fit ausgehend vom Startwert und im Rahmen der Toleranzen bestmöglich ist.

Vermutlich machst du hier etwas falsch. Da du leider nur beschrieben hast, was du gemacht hast, statt den verwendeten Code zur Verfügung zu stellen, kann ich dir leider nicht sagen was.
Anders gesagt: für weitere Unterstützung bitte den kompletten momentanen Stand zur Verfügung stellen.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
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
.


goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de


 Impressum  | Nutzungsbedingungen  | Datenschutz  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2020 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

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.