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

nicht lineare Regression

 

FelixderUnwissende
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 20.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.02.2017, 14:39     Titel: nicht lineare Regression
  Antworten mit Zitat      
Hallo ihr Lieben,

ich habe die einfache, bzw für mich als Matlabneuling nicht ganz so einfache Aufgabe eine nichtlineare Regression durchzuführen. Toolboxen sind alle vorhanden, jedoch sehe ich gerade den "Code vor lauter Befehlen" nicht :/

die Grundgleichung lautet: xt=cs-(cs-c0)*e^(-klat*t)

xt; t sind Messwerte, c0 = Startwert, cs und klat sind die unbekannten


Code:
% Soweit so gut um die Ausreiser aus den 35 Messwerten zu erkennen

xt = [0   2   4   6   8   10   12   14   16   18   20   22   24   26   28   30   32   34 ...
    36   38   40   42   44   46   48   50   52   54   56   58   60   62   64   66   68]';

y = [28.4,26.96,24.44,22.4,21.2,20.18,19.28,18.5,17.78,17.12,16.58,16.16,...
    15.68,15.34,15.02,14.74,14.48,14.3,14.12,13.94,13.82,13.70,13.58,13.47,...
    13.4,13.32,13.26,13.2,13.16,13.1,13.06,13.06,13.0,12.98,12.96]';
 
x = xt/60; % t in h
c0 = 28.40; % in mg/l

%% Parameter ct = y; t = x; cs = p(1); kla = p(2)
%% Gleichung y = cs-(cs-28.45)*exp(-kla*x)

modelFun = @(p,x) p(1)-(p(1)-c0)*exp(p(2)*x);
 
paramEstsLin = [ones(size(x)), x] \ log(y);  %%Logarythmieren

xx = linspace(min(x), max(x));
paramEsts = nlinfit(x, y, modelFun, paramEstsLin) %%Regression mit nlinfit

yy = modelFun(paramEsts,xx); %%%% Plot nonlinear fit x-y-Skale
plot(x,y,'o', xx,yy,'-');
xlabel('x'); ylabel('y');
legend({'Raw data',  ...
   'Nonlinear fit on the original scale'},'location','NE');

r = y-modelFun(paramEsts,x); %%%%Plot Residduals -> Um Ausreiser visuell zu erkennen
plot(x,r,'+', [min(x) max(x)],[0 0],'k:');
xlabel('x'); ylabel('residuals');

 


p(1) ist demnach 12.95 und p(2) -4.40 -> Werte decken sich mit der Lösung

Aus den Residuten ist zu erkennen, das die ersten vier Werte (x=0,2,4,6) Ausreiser sind. Daher ist laut Lösungsweg die lineare Regression ab x = 8 min und y = 21.20 durchzuführen.

Mein Problem besteht darin, das dann die Regression ungenau wird, bzw nicht mehr der Lösung entspricht.

Code:
%für 30 Messwerte


xt = [8 10   12   14   16   18   20   22   24   26   28   30   32   34 ...
    36   38   40   42   44   46   48   50   52   54   56   58   60   62   64   66   68]';

y = [21.20 20.18,19.28,18.5,17.78,17.12,16.58,16.16,...
    15.68,15.34,15.02,14.74,14.48,14.3,14.12,13.94,13.82,13.70,13.58,13.47,...
    13.4,13.32,13.26,13.2,13.16,13.1,13.06,13.06,13.0,12.98,12.96]';

x = xt/60;
c0 = 21.20;

modelFun = @(p,x) p(1)-(p(1)-c0)*exp(p(2).*x); %%Funktion
 paramEstsLin = [ones(size(x)), x] \ log(y);  %%Logarythmieren beider Seiten
 xx = linspace(min(x), max(x));
 yy = modelFun(paramEstsLin, xx);
 
paramEsts = nlinfit(x, y, modelFun, paramEstsLin)%%Regression mit nlinfit

yy = modelFun(paramEsts,xx); %% Plot nonlinear fit x-y-Skale
plot(x,y,'o', xx,yy,'-');
xlabel('x'); ylabel('y');
legend({'Raw data',  ...
   'Nonlinear fit on the original scale'},'location','NE');

r = y-modelFun(paramEsts,x); %%Plot Residduals
plot(x,r,'+', [min(x) max(x)],[0 0],'k:');
xlabel('x'); ylabel('residuals');

plot(x,log(y),'o', xx,log(yy),'-'); %%Plot nonlinear Fit Logy-x-Skale
xlabel('x'); ylabel('log(y)');
ylim([2.5,3.1]);
legend({'Raw data',  ...
   'Nonlinear fit on the original scale'},'location','SW');

 


für p(1) sollte das Ergebnis 12.8 und für p(2) 3.99 lauten, es wird aber 11.14 und -1.78 :/ irgendwie klappt die Regression nicht, obwohl sie besser sein müsste...

habt ihr Vielleicht eine Lösung?

Vielen Dank und beste Grüße
Felix
_________________

Vielen herzlichen Dank und bleibt gesund Smile
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 21.02.2017, 09:32     Titel:
  Antworten mit Zitat      
Hallo,

im unteren Code-Teil definierst du ein anderes c0. Wenn du das c0 von oben verwendest, bekommst du auch vergleichbare Ergebnisse.

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

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 20.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.02.2017, 14:00     Titel:
  Antworten mit Zitat      
c0 ist der jeweilige Startwert der Messungen. D.h ich starte im unteren Abschnitt später und bei einer anderen Startwert

mit allen 35 Werten bei t=0

Code:


xt = [0   2   4   6   8   10   12   14   16   18   20   22   24   26   28   30   32   34 ...
    36   38   40   42   44   46   48   50   52   54   56   58   60   62   64   66   68]';

y = [28.4,26.96,24.44,22.4,21.2,20.18,19.28,18.5,17.78,17.12,16.58,16.16,...
    15.68,15.34,15.02,14.74,14.48,14.3,14.12,13.94,13.82,13.70,13.58,13.47,...
    13.4,13.32,13.26,13.2,13.16,13.1,13.06,13.06,13.0,12.98,12.96]';
 
x = xt/60;
c0 = 28.40;
beta0 = [20, -4, 1];

 modelFun = @(p,x) p(1)-(p(1)-c0)*exp(p(2)*x);
 
beta = nlinfit(x,y,modelFun,beta0)
xx = linspace(min(x), max(x));

yy = modelFun(beta,xx);
plot(x,y,'o', xx,yy,'-');
xlabel('x'); ylabel('y');
legend({'Raw data',  ...
   'Nonlinear fit on the original scale'},'location','NE');

 


mit 30 Werten (ohne Ausreiser ab Minute 8. )

Code:


xt = [8   10   12   14   16   18   20   22   24   26   28   30   32   34 ...
    36   38   40   42   44   46   48   50   52   54   56   58   60   62   64   66   68]';

y = [21.2,20.18,19.28,18.5,17.78,17.12,16.58,16.16,...
    15.68,15.34,15.02,14.74,14.48,14.3,14.12,13.94,13.82,13.70,13.58,13.47,...
    13.4,13.32,13.26,13.2,13.16,13.1,13.06,13.06,13.0,12.98,12.96]';
 
x = xt/60;
c0 = 21.2;
beta0 = [10, -4, 1];

 modelFun = @(p,x) p(1)-(p(1)-c0)*exp(p(2)*x);
 
beta = nlinfit(x,y,modelFun,beta0)


xx = linspace(min(x), max(x));

yy = modelFun(beta,xx);
plot(x,y,'o', xx,yy,'-');
xlabel('x'); ylabel('y');
legend({'Raw data',  ...
   'Nonlinear fit on the original scale'},'location','NE');
 


im Unteren Abschnitt wird die Kurve, trotz besserer Werte, nicht mehr angelegt und ich verstehe nicht warum Crying or Very sad

gegenüber den Beitrag von gestern (mit nun angepassten Code) kommt nun auch die Warnung:
Code:
Warning: Some columns of the Jacobian are effectively zero at the solution, indicating that the model is insensitive to some of its parameters.  That
may be because those parameters are not present in the model, or otherwise do not affect the predicted values.  It may also be due to numerical
underflow in the model function, which can sometimes be avoided by choosing better initial parameter values, or by rescaling or recentering.  Parameter
estimates may be unreliable.

_________________

Vielen herzlichen Dank und bleibt gesund Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

da die xt-Werte ja auf der gleichen Skala bleiben, verstehe ich die unterschiedliche Wahl von c0 nicht. Die nicht so guten Ergebnisse bei nlinfit kommen durch die nicht so guten Startwerte für das neue Modell zustande.

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

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 20.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.02.2017, 10:22     Titel:
  Antworten mit Zitat      
habe die Lösung des Problems gefunden...

die Lösung ist, das nlinfit mit dem Startwert bei "Null" arbeitet, dh wenn ich die Werte für den xt-Vektor mit 8 subtrahiere x = (xt-Cool/60; und somit bei "Null" starte klappt es wie es soll Smile

zur Vollständigkeit:
c0 ist der Startwert bei der Konzentrationsmessung...quasi wenn man Daten zu einem späteren Zeitpunkt auswerten möchte ändert sich damit auch der c0-Wert...

trotzdem Vielen Dank Smile
_________________

Vielen herzlichen Dank und bleibt gesund Smile
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 - 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.