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

Definierter Start und Endpunkt fuer Fit

 

RatioTM
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 51
Anmeldedatum: 24.04.18
Wohnort: Genf
Version: ---
     Beitrag Verfasst am: 25.01.2019, 18:17     Titel: Definierter Start und Endpunkt fuer Fit
  Antworten mit Zitat      
Hallo,

ich habe einen Decay von Messwerten, den ich gerne mit einer doppelt exponentiellen Funktion fitten wuerde.
Das Problem dabei: Da es sich um Messwerte handelt, geht die Zeitserie danach natuerlich weiter. Ich habe ein Beispiel hier als MATLAB figure angehaengt.
Ich moechte den fit gerne lokal anwenden (nur auf den Decay). Das ist soweit kein Problem und auch im Beispiel oben bereits passiert (ich definiere einfach Start und Endpunkt).
Jedoch will ich dass die schwarze Kurve im plot explizit beim festgelegten Startpunkt (der genau bei Start des decays ist) beginnt und am Ende des Decays aufhoert und der fit sich nicht bis unendlich fortsetzt. Ich habe in diesem Forum einiges dazu gefunden, jedoch betreffen diese Beispiele stets den start und endpunkt zur fit berechnung. So sieht mein Code derzeit aus (er beinhaltet unter anderem Code vom User Harald):


Code:
bereich = time > time(10) & time< time(21);
xfilt = zeit_fan(bereich);
yfilt = data(bereich);

ft = fittype( 'exp2' );
opts = fitoptions( 'Method', 'NonlinearLeastSquares' );
opts.Display = 'Off';
opts.Normalize = 'on';
opts.Robust = 'Bisquare';
opts.Weights = data(11:20);
[fit_fan, gof] = fit( xfilt, yfilt, ft, opts );


Ich habe auch mit opts. Startpoint bereits herumgespielt, wobei ich hier den Fehler bekomme, dass die Funktion gegen unendlich geht weshalb der fit abgebrochen wurde, sofern ich hier die gewuenschten Start- und Endwerte eingebe.

Was genau mache ich falsch?

Vielen Dank fuer eure Hilfe!

fit.fig
 Beschreibung:

Download
 Dateiname:  fit.fig
 Dateigröße:  38.86 KB
 Heruntergeladen:  293 mal
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

ich fürchte, dass das mit fittype/fit so nicht möglich ist. Startpoint bezieht sich auf die Anfangswerte der Parameter.

Ich würde es stattdessen mit fmincon versuchen, ähnlich wie hier:
https://www.mathworks.com/help/matl.....ing-via-optimization.html
Der Anfangs- und Endwert sind dann Nebenbedingungen.

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
 
RatioTM
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 51
Anmeldedatum: 24.04.18
Wohnort: Genf
Version: ---
     Beitrag Verfasst am: 26.01.2019, 16:39     Titel:
  Antworten mit Zitat      
Hallo,

ginge dies alternativ auch mit lsqcurvefit?
Vermutlich laesst sich meine oben gezeigte Kurve besser logistisch beschreiben, als doppelt exponentiell. Dies haette den Vorteil dass ich mein gesamtes Zeitfenster fitten koennte und nicht nur den Decay Zeitraum, welcher ja nur wenige Minuten andauert (und ich somit gleich mehrere Decays braeuchte bis der Messzeitraum statistisch relevant wird...)

Ich muesste mir somit eine logistische annaehrung schreiben.. ich bekomme bei folgendem Beispiel jedoch eine Fehlermeldung:
Code:


x0=[time(1) ; data(1)];
xdata= time;
ydata= data;
fun=@(x,xdata) x(1)./(1+x(2).*exp(x(3).*xdata));
[x,resnorm] = lsqcurvefit(fun,x0,xdata,ydata);

 
Private Nachricht senden Benutzer-Profile anzeigen
 
RatioTM
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 51
Anmeldedatum: 24.04.18
Wohnort: Genf
Version: ---
     Beitrag Verfasst am: 26.01.2019, 16:48     Titel:
  Antworten mit Zitat      
Danke;
Mit

Code:


x0=[zeit_fan(1);nh3fan(1);1];
xdata= zeit_fan;
ydata= nh3fan;
fun=@(x,xdata) x(1)./(1+x(2).*exp(x(3).*xdata));
[x,resnorm] = lsqcurvefit(fun,x0,xdata,ydata);
 


Erhalte ich einen fit. Dieser ist jedoch leider mehr, als unbefriedigend. Ich vermute, die Ursache liegt bei x0: Ich definiere dies als den Startpunkt meines Fits. Da ich jedch in einem System mit zwei Parametern bin (x und y) und gleichzeitig 3 Startwerte angeben muss, bin ich bezueglich der Definition von x0 etwas verwirrt.

Zuletzt bearbeitet von RatioTM am 26.01.2019, 17:13, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.435
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 26.01.2019, 16:48     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
ginge dies alternativ auch mit lsqcurvefit?

Wenn du keine Nebenbedingungen hast, ja.

Zitat:
ich bekomme bei folgendem Beispiel jedoch eine Fehlermeldung

Bitte immer dazu schreiben, welche Fehlermeldung.

Auf den ersten Blick würde ich sagen: du verwendest drei Parameter, gibst aber nur zwei Startwerte vor. Wie gesagt: Startwerte sind die Startwerte für die Parameter, nicht der Anfangspunkt 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
 
RatioTM
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 51
Anmeldedatum: 24.04.18
Wohnort: Genf
Version: ---
     Beitrag Verfasst am: 26.01.2019, 19:42     Titel: logistischer Decay
  Antworten mit Zitat      
Okay, ich habe einen netten fit gefunden, den ich gerne hier teile fuer den fall, dass jemand anders einen aehnlichen fit braucht. Ich habe das ganze am Ende doch mit der klassischen fit function geloest...Das schoene bei dieser Funktion ist dass ich ueber f'(x) in meinem Fall an eine Decayzeit komme, sofern ich Randbedingungen fuer minimale und maximale Steigungswerte (f') festlege.
Vielen Dank fuer deine Hilfe, Harald!

Code:

%needed:
% (lower bound!) --when stady state is reached
 %upper bound -- in steady state before decay
% x-c where c is time when decay starts! (konstante zum einsetzen!)
% x1= Beginn des Decays; x2= Ende des Decays


[xdata, ydata, weights] = prepareCurveData( time, data,data );

logistic = fittype( '(lower+((upper-(lower)).*f)/(1+10^((x-c)-log10(x1))))+(upper-(lower)).*(1-f)./(1+10.^((x-c)-log10(x2)))', 'independent', 'x');
opt = fitoptions( 'Method', 'NonlinearLeastSquares' );
opt.Display = 'Off';
opt.Robust = 'LAR';
opt.Weights = weights;

[decay, goodness] = fit( xdata, ydata, logistic, opt );
 
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.