Verfasst am: 20.02.2017, 14:39
Titel: nicht lineare Regression
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
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)
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)],[00],'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.
y = [21.2020.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]';
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)],[00],'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
_________________
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]';
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');
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]';
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
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.
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.
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-/60; und somit bei "Null" starte klappt es wie es soll
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 _________________
Vielen herzlichen Dank und bleibt gesund
Einstellungen und Berechtigungen
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
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.