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

e-Funktionenfit funktioniert nur bei niedrigen Werten

 

Nordlicht
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 62
Anmeldedatum: 08.09.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.07.2017, 15:26     Titel: e-Funktionenfit funktioniert nur bei niedrigen Werten
  Antworten mit Zitat      
Moin moin,
ich möchte eine e-Funktion an Daten anfitten.
Mein Code:
Code:
xdata = [1 2 3]; %"good" data
ydata = [2 5 25];
% xdata = [10 20 30];%"bad" data
% ydata = [20 50 250];

xmin=min(xdata);
xmax=max(xdata);
xinter=xmax-xmin;
% Create a simple exponential decay model.
fun = @(x,xdata)x(1)+x(2)*exp(x(3)*xdata);

x0 = [xmax+xinter/100,xinter,xmin-xinter/100];
x = lsqcurvefit(fun,x0,xdata,ydata)
funct=lsqcurvefit(fun,x0,xdata,ydata);
xhelp=xmin:xinter/100:xmax;
y=x(1)+x(2)*exp(x(3)*xhelp)
% Plot the data and the fitted curve.
plot(xdata,ydata,'ko',xhelp,y,'b-')


Mit dem ersten Datensatz funktioniert der Fit, beim zweiten Datensatz knickt die Funktion ab und macht Mist.
Ich habe mycurvefit.com genutzt um die Funktion zu validieren, bei den ersten Werten werden die richtigen Koeffizienten berechnet. Bei den zweiten leider nicht mehr.
Wenn die Werte noch größer werden, schmiert die Funktion ganz ab, komme nur leider nicht dahinter, warum..

Jemand Ideen?

Lieben Gruß
euer Nordlicht
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 19.07.2017, 17:36     Titel: Re: e-Funktionenfit funktioniert nur bei niedrigen Werten
  Antworten mit Zitat      
Hallo Nordlicht,

Warum ist das doppelt?
Code:
x     = lsqcurvefit(fun,x0,xdata,ydata)
funct=lsqcurvefit(fun,x0,xdata,ydata);


Zitat:
Mit dem ersten Datensatz funktioniert der Fit, beim zweiten Datensatz knickt die Funktion ab und macht Mist.

Denke daran, dass die Leser zunächst keine Ahnung haben, was Du tust. Was bedeutet "Mist machen"?

Zitat:
Ich habe mycurvefit.com genutzt um die Funktion zu validieren, bei den ersten Werten werden die richtigen Koeffizienten berechnet. Bei den zweiten leider nicht mehr.

Das heißt, dass mycurvefit.com die gleichen Ergebnisse liefert wie Matlab?

Zitat:
Wenn die Werte noch größer werden, schmiert die Funktion ganz ab, ...

Bitte poste die Daten, den Code und eine Erklärung, was genau "Abschmieren" hier bedeutet. Ist sind ja wohl doch aus mathematischer Sicht die korrekten Werte, oder denkst Du, dass Matlab sich hier verrechnet?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Nordlicht
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 62
Anmeldedatum: 08.09.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.07.2017, 18:12     Titel:
  Antworten mit Zitat      
Moin Jan,

Code:
funct=lsqcurvefit(fun,x0,xdata,ydata);

ist überflüssig, das habe ich vergessen herauszunehmen.
Zitat:

Zitat:
Mit dem ersten Datensatz funktioniert der Fit, beim zweiten Datensatz knickt die Funktion ab und macht Mist.

Denke daran, dass die Leser zunächst keine Ahnung haben, was Du tust. Was bedeutet "Mist machen"?

Bezüglich des Mistes, den die Funktion macht hänge ich ein Bild an.

Zitat:
Das heißt, dass mycurvefit.com die gleichen Ergebnisse liefert wie Matlab?

Korrekt. Bei dem "good data" Datensatz liefert die website die exakt selben Parameter der e-Funktion. Bei dem zweiten Datensatz nicht mehr.

Zitat:
Bitte poste die Daten, den Code und eine Erklärung, was genau "Abschmieren" hier bedeutet. Ist sind ja wohl doch aus mathematischer Sicht die korrekten Werte, oder denkst Du, dass Matlab sich hier verrechnet?


Mit Abschmieren habe ich folgenden Error gemeint:
Code:
Error using snls (line 47)
Objective function is returning undefined values at initial point. lsqcurvefit cannot continue.

Error in lsqncommon (line 166)
            snls(funfcn,xC,lb,ub,flags.verbosity,options,defaultopt,initVals.F,initVals.J,caller, ...

Error in lsqcurvefit (line 257)
    lsqncommon(funfcn,xCurrent,lb,ub,options,defaultopt,caller,...

Error in test (line 13)
x = lsqcurvefit(fun,x0,xdata,ydata)


Das sich der PC, bzw Matlab verrechnet will ich nicht andeuten, ich werde schon die Funktion irgendwie falsch benutzen. Es wird halt ein nicht plausibler Kurvenverlauf ermittelt. Auch der Abgleich mit genannter Website lässt darauf schließen, dass ich bei der Nutzung der
Code:

Funktion einen Fehler begehe, mir ist bloß nicht klar wo der liegen mag.

baddata.PNG
 Beschreibung:
Unerklärliches Verhalten

Download
 Dateiname:  baddata.PNG
 Dateigröße:  17.59 KB
 Heruntergeladen:  291 mal
gooddata.PNG
 Beschreibung:
Korrekte Anfittung der Funktion

Download
 Dateiname:  gooddata.PNG
 Dateigröße:  18.43 KB
 Heruntergeladen:  330 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

laut Fehlermeldung ist der Startwert schlecht gewählt. Abhilfe: andere Startwerte wählen.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 62
Anmeldedatum: 08.09.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.07.2017, 21:55     Titel:
  Antworten mit Zitat      
Top, danke euch beiden!
Diese Daten müssen nun aber nicht bei niedrigen Werten beginnen.

Eine mögliche Abhilfe könnte sein, sich den niedrigsten X-Wert zu schnappen, und sowohl X und Y Werte durch diesen zu teilen, sodass eine Normierung auf 1 stattfindet.
Wenn nun die Parameter mit diesem Teiler multipliziert werden, erhält man die Parameter der Gleichung, die die originalen Messwerte beschreibt.
Ob das dann auch noch funktioniert, wenn die Y-Werte bei 10^8 beginnen und nur <10 mal vorkommen müsste getestet werden (es geht hier um Betriebsfestigkeit). Ich spreche von einem Vektor der so aussieht:
x=[ 5 10 30 100 ...]
y=[1e8 2e7 4e6 ...]
Das dafür eine abklingende e-Funktion nötig ist, ist klar, es geht ums Prinzip.

Fällt euch da eine elegantere Lösung ein?

Lieben Gruß
das Nordlicht

Zuletzt bearbeitet von Nordlicht am 19.07.2017, 22:51, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

der Fit der e-Funktion ist an sich sehr gutartig, Startwerte sind kaum ein Problem. Du darfst halt nur nicht Startwerte wählen, für die inf herauskommt.
Code:
x0 = [0, 1, 1/xmax];
 
würde beispielsweise funktionieren.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 62
Anmeldedatum: 08.09.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.07.2017, 22:57     Titel:
  Antworten mit Zitat      
Ich glaub ich steh auf dem Schlauch.
Wieso kommt denn bei
Code:
% xdata = [10 20 30];%"bad" data
% ydata = [20 50 250];

inf heraus?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

ok, inf kommt nicht heraus, aber auch nichts wirklich hübsches:

Code:
fun(x0, xdata)
 
ans =
7.2759e+43 2.647e+86 9.6296e+128

Dass es da numerische Probleme gibt, ist nicht weiter verwunderlich.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 62
Anmeldedatum: 08.09.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.07.2017, 14:28     Titel:
  Antworten mit Zitat      
Moin Harald,

ich habe nun eine e-Funktion genommen, die auf das Anwendungsbeispiel passt.
Hier der aktualisierte Code

Code:
xdata = [1 3 10]; %good data
ydata = [35 5 -2];

% xdata = [1 3 10]; %bad data
% ydata = [3500 500 -200];

xmin=min(xdata);
xmax=max(xdata);
xinter=xmax-xmin;
x0 = [xmax+xinter/100,xinter,xmin-xinter/100];

% Create a simple exponential decay model.

fun = @(x,xdata)x(1)./(exp(x(2)*xdata))

x = lsqcurvefit(fun,x0,xdata,ydata)
xhelp=xmin:xinter/100:xmax;
b=100
c=1
a=10

y=fun(x,xhelp)

% Plot the data and the fitted curve.
plot(xdata,ydata,'ko',xhelp,y,'b-')
legend('Data','Fitted exponential')
xlim([xmin-xinter/10 xmax+xinter/10])


Hier ist das gleiche Problem, die "good data" Datensätze werden gefittet wie sie sollen, die "bad data" Datensätze resultieren in einer waagerechten Geraden.
Da die anwendungsbezogenen Datensätze noch deutlich größer werden können und auch die Differenz zwischen niedrigstem X-Wert und niedrigsten Y-Wert noch verhältnismäßig klein gewählt wurde bei dem "bad data" Datensatz, kann ich nicht einfach die Startwerte kleiner wählen.
Sollte ich mich nach einer andern Fit-Funktion umsehen oder gibts da einen cleveren Workaround?

Lieben Gruß
das Nordlicht
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.