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

curve fitting

 

therion
Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 14.01.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.02.2015, 18:52     Titel: curve fitting
  Antworten mit Zitat      
Ich versuche die unten dargestellte Krve aus Messwerten mittels fminsearch zu fitten aber leider komme ich nicht weiter hat ggf. jemand eine Idee?


Code:
t = messung(:,1);
u = messung(:,2);

subplot(2,1,1)
plot(t, u, '*')
grid on
[estimates, model] = fitcurvedemo(t,u)
hold on
[sse, FittedCurve] = model(estimates);
plot(t , FittedCurve, 'r');
 
xlabel('xdata')
ylabel('f(estimates,xdata)')
title(['Fitting to function ', func2str(model)]);
legend('data', ['fit using ', func2str(model)])
hold off

C = abs(i* diff(t)./diff(FittedCurve));



subplot(2,1,2)
plot(t,u,'o',t,f,'-')
grid on
subplot(2,1,2)
 plot(t(2:end),C)
 grid on
 figure(5)
 plot(FittedCurve(2:end),C)




Code:
function [estimates, model] = fitcurvedemo(xdata, ydata)
% Call fminsearch with a random starting point.
start_point = rand(1, 3);
model = @expfun;
options = optimset('MaxFunEvals',1000000000000000,'TolFun',1e-16);
estimates = fminsearch(model, start_point);
% expfun accepts curve parameters as inputs, and outputs sse,
% the sum of squares error for A*exp(-lambda*xdata)-ydata,
% and the FittedCurve. FMINSEARCH only needs sse, but we want
% to plot the FittedCurve at the end.
    function [sse, FittedCurve] = expfun(params)
        A = params(1);
        lambda = params(2);
        TT = params(3);
        FittedCurve = .54-A.* exp(-lambda * xdata-TT);
        ErrorVector = FittedCurve - ydata;
        if( FittedCurve(1) > 0.53)
            FittedCurve(1)
        end
%         if ( FittedCurve(1) < 0.55 && FittedCurve(1) > 0.5 )
             sse = sum(ErrorVector.^ 2);
%             disp('BB');
%         else
%             sse = 11e9;
%         end    
    end
end

edit winkow: code umgebung eingefügt

Capture.PNG
 Beschreibung:

Download
 Dateiname:  Capture.PNG
 Dateigröße:  19.51 KB
 Heruntergeladen:  608 mal
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: 02.02.2015, 19:05     Titel:
  Antworten mit Zitat      
ein fit hängt stark von den startwerten ab. deine wälst du nur zufällig über rand. ich denke da könnte man zuerst ansetzen.
bitte benutze die code umgebung um code zu posten. grüße
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
therion
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 14.01.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.02.2015, 19:21     Titel:
  Antworten mit Zitat      
Wie gehe ich am besten vor diese zu wählen?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

ein zusätzliches Problem ist, dass die Modellparameter redundant sind:

FittedCurve = .54-A.* exp(-lambda * xdata-TT);
= .54-A.* exp(-TT) .* exp(-lambda * xdata);
= .54- B .* exp(-lambda * xdata);

Die letzte Zeile wäre dann ein sinnvolleres Modell. Man könnte die .54 dann noch durch einen zu bestimmenden Parameter ersetzen.

Startwerte sollten dann keine große Rolle mehr spielen.

Allerdings flacht das auf beiden Seiten ab. Ich würde also eher zu einer logistischen Wachstumsfunktion als Modell neigen:
y = A ./ (1 + B* exp(C*x));

Übrigens: sofern Optimization Toolbox oder Statistics Toolbox vorhanden sind, ist das mit lsqcurvefit oder fitnlm deutlich einfacher zu schreiben.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 14.01.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.02.2015, 22:08     Titel:
  Antworten mit Zitat      
Danke, für die Tipps. Lsqcurvefit steht mir zur Verfügung, wenn Du zur Umsetzung einen Tipp od. ein Beispiel hättest wäre das Klasse.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

mal in die Doku von lsqcurvefit geschaut?
Code:

In dem Beispiel wird ja sogar eine Funktion verwendet, die deiner sehr ähnlich ist.
Wenn dort etwas nicht klar ist, bitte konkrete Fragen dazu stellen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 14.01.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.02.2015, 22:21     Titel:
  Antworten mit Zitat      
ich hatte das zuvor schon mit lsqnonlin (mit deinem Ansatz: c(1) ./ (1 + c(2)* exp(c(3)*t)) ) umgesetzt, hat lsqcurvefit Vorteile?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

ein vereinfachtes Interface für Curve Fitting.
Bekommst du denn nun einen guten Fit?

Grüße,
Harald
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.