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

Modellfit an Messwerte

 

Theodyzee

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.07.2016, 18:32     Titel: Modellfit an Messwerte
  Antworten mit Zitat      
Hallo liebe MATLAB-Com!

Ich habe reale Messwerte (10 Stk.) mehrerer (16) Wachstumskurven (Zelldichte "y" über die Zeit "t").
Nun möchte ich ein Wachstumsmodell ("Baranyi-Modell") an diese Messwerte fitten. Dieses Modell enthält insgesamt 3 Variablen (L,m,v), welche verändert werden können/sollen.

Ich habe diesbezüglich schon sämtliche Foren und auch die Matlab-Hilfe durchstöbert, finde jedoch keinen Passenden Ansatz für mein Problem, bzw. fahre mich ständig fest. Matlab soll mir diese drei genannten Werte (mit Nebenbedingungen) so weit verändern, bis die Modellkurve bestmöglich über den Messwerten liegt.

Kann mir da jemand spontan weiter helfen und mir vieleicht einen Ansatz nenne, welcher es Wert ist genauer zu beleuchten?


Harald
Forum-Meister

Forum-Meister


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

hast du schon fitnlm versucht? Oder lsqcurvefit ?

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.07.2016, 20:52     Titel:
  Antworten mit Zitat      
Hallo Harald,

also
Code:
hab ich versucht, komme aber anscheinend mit der Synthax nicht ganz zurecht Embarassed
Code:
habe ich hingegen noch nicht verwendet (danke an dieser Stelle Smile ) Ich werde mal versuchen mich in diesen Befehl zu denken...

Mein Ziel war/ist es ersteinmal eine Lösung ähnlich dem Excel-Solver zu finden.
Dort habe ich die Summe der Quadratischen Abweichungen zwischen modell- und Messwerten (bei veränderung der drei Parameter) minimieren lassen.

Bei Matlab verstehe ich nur leider nicht, wie ich diese Minimize-Funktionen auf eine Ganze Datenreihe anwenden soll... Question
 
Harald
Forum-Meister

Forum-Meister


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

schau dir doch mal die Beispiele in der Doku an.

Dann versuche, das auf dein Problem anzupassen.

Wenn du dabei auf Probleme stößt, poste bitte deinen Code. Dann kann man Verbesserungsvorschläge liefern.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.07.2016, 22:04     Titel:
  Antworten mit Zitat      
Also ich habe nocheinmal ein wenig herum probiert (auch mit Hilfe der Beispiele aus der Hilfe). Ich komme wiederholt mit der Synthax nicht zurecht und habe daher mal meinen Code kopiert.
Ich hoffe mit Hilfe der Anmerkungen steigt man grob durch... Embarassed
Wäre echt super, wenn mir der Wald hinter den Bäumen gezeigt werden könnte!!!

Code:
clc
clear all

format short
format compact

%% Einlesen der Messwerte
load('Begg_Messwerte')  %laedt I_0; V; e; exp; xm

% xm - Messwerte Zelldichte Matrix m-Tageswerte / n-Messreihen       10x16
% e - gemessene Abweichungen                                         10x16
% I_0 - Vektror der jeweiligen Initial-OD                             1x16
% uexp - spez. Wachstumsrate jew. in exp. Phase                       1x16
% V - Verdünnungswerte                                               10x16


k=10^3;         % Proportionalitaetsfaktor
V_H2O=20;       % Volumen des flüssigen Trägermediums, Wasser
V_I0=2;         % Volumen des Inokulums

xe=(xm-(e.*V))*k;   % Verrechung des Fehlerwertes (e) mit der jeweiligen Verdünnung (V)
ye=log(xe);         % ln(xe)

x0m=xe(1,:);        % Initial-OD (gemessen)
y0m=ye(1,:);        % ln(x0m)

x0t=I_0.*k/(V_H2O/V_I0); % Initial-OD (theoretisch)
y0t=log(x0t);            % ln(x0t)

ymax=max(ye);       % max. Zelldichte

umax=max(uexp);     % max. spez. Wachstumsrate aus max(uexp)


%% Baranyi-Modell

t=0:1:9;
At=zeros(size(xm));
yt=zeros(size(xm));


for j=1:length(ymax)
    %      L v m
     x0 = [1 1 1];
         
    for i=1:length(t);
       
        L = xo(1);          % 0 <= lambda
        h0 = L*umax;
        v = xo(2);
        m=xo(3);

        % Glättungsparameter für B.-Modell
        At(i,j) = t(:,i)+(1/umax)*...
                  log(exp(-v*t(:,i))+exp(-h0)-exp(-v*t(:,i)-h0));

        % Modellfunktion nach Baranyi
        yt(i,j) = y0t(1,j)+umax*At(i,j)...
                  -(1/m)*log(1+((exp(m*umax*At(i,j))-1)/...
                  (exp(m*(ymax(1,j)-y0t(1,j))))));

        %X = lsqcurvefit(yt,x0,t,ye);
       
    end
end


Grüße,
Theodyzee
 
Harald
Forum-Meister

Forum-Meister


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

versuch doch erst mal, eine Kurve zu fitten, bevor du das in eine doppelte for-Schleife packst?

lsqcurvefit erfordert als erstes Argument ein Function Handle, und das wird auch in jedem der Beispiele dazu gezeigt. Du definierst aber weit und breit kein Function Handle.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
frankw
Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 22.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.07.2016, 09:03     Titel:
  Antworten mit Zitat      
...ich weiß nicht ob dir das Hilft bzw. du die entsprechenden Toolboxes hast. Bei mir ging es ohne Probleme. In dem Programm geht es um die Anfittung von Messdaten für den O2 Verbrauch von Zellen an ein Modell (siehe Ansatzfunktion):

Code:
dateiname = '123abc';

daten = xlsread(dateiname, 1, 'A4:D1000');
tx = daten(:,1);   % Zeit
o2x = daten(:,4);  % O2 Konzentration [%O2 sät.]

daten = xlsread(dateiname, 1, 'E1:E2');
zeb = daten(1);   % Zellzahl Versuchsbeginn
zee = daten(2);   % Zellzahl Versuchsende

clear daten;

rug = 8.31433; % Universelle Gaskonstante
mo2 = 32;      %Molare Masse O2 [g/mol]
po2 = 960e2*.2095;  %Sauerstoffpartialdruck
khcc = 3.18e-2;
t0k = 25;       %Temp von Khcc
tu = 37;        %Umgebungstemperatur
ta = tu+273.15; %Umgebumgstemp. Absolut
kh = 1/khcc*exp(-1700*(1/ta-1/(t0k+273.15)));
v0 = 60e-6;   %Gesamvolumen Flasche
vm = 5e-6;    %Volumen Medium
va = v0-vm;    %Volumen Luft

vx = kh*va+vm;


le = length(tx);
tx = zeros(le,1);
for i=1:le
    tx(i) = (i-1)*5/60;
end;    

bwx = log(zee/zeb)/tx(le); %Berechnung Wachstumsfaktor

fum = po2/(ta*rug*kh); %Umrechnung %O2 sät. in O2 Konzentration

o2x = o2x/100*fum;

excldata = ~(excludedata(tx,o2x,'domain',[0,3]));  %Breiche die von der Berechnung ausgeschlossen werden sollen


fun = '(qz/bw*n*(1-exp(bw*t))+cm*k)/k'; %Ansatzfunktion

s1 = fitoptions('Method','NonlinearLeastSquares','Lower',[-.5,1e-20],'Upper',[.5,1e-10],'Startpoint',[0.0 1e-13]);
s1 = fitoptions(s1,'Exclude',excldata);
f1 = fittype(fun,'problem',{'k','n','bw'},'independent','t','options',s1);
[ls1,lsd1] = fit(tx,o2x,f1,'problem',{vx,zeb,bwx});

plot(tx,o2x,'.');
hold on;
plot(ls1,'r');
hold off;

xlswrite(dateiname,ls1.qz,1,'G5');
xlswrite(dateiname,ls1.bw,1,'G6');
Private Nachricht senden Benutzer-Profile anzeigen
 
Theodyzee

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.07.2016, 11:33     Titel:
  Antworten mit Zitat      
Hallo,

ich habe nun mein Modell in ein function-file ( 'func' ) übertragen, habe meine Messreihen auf "eine" reduziert und soweit funktioniert auch alles.
Ein Vektor 'var0' beinhaltet die Startwerte [1 1 1] der drei veränderlichen Variablen ( 'L' , 'm' , 'v' ) und liefert für die function die Funktionswerte für yt.
Nun komme ich jedoch immernoch nicht mit der Synthax von lsqcurvefit zurecht. Da immer wieder der Fehler:
Code:
??? Input argument "var0" is undefined.

Error in ==> func at 4
        L = var0(1);

Error in ==> Untitled6_1 at 42
B = lsqcurvefit(func,var0,t,ye);


erscheint. Ich zweifel langsam wirklich an mir selbst! Embarassed

In der Hilfe steht doch(?!):
- es wird eine function benötigt (habe ich: 'func' )
- es wird ein Startwert 'x0' benötigt (bei mir der Vektor 'var0' )
- es werden die x-werte benötigt 'xdata' (bei mir der Vektor t)
- es werden die y-werte (Messwerte) benötigt 'ydata' (bei mir der Vektor 'ye' )

und das habe ich meines erachtens alles übertragen bzw. befolgt! (Hier nochmal meine Codes)

Function-File:
Code:
function yt = func(var0,t,umax,ymax,y0t)

        L = var0(1);
        m = var0(2);
        v = var0(3);  
        h0 = L*umax;
       
        % Glättungsparameter für B.-Modell
        At = t+(1/umax)*...
                  log(exp(-v*t)+exp(-h0)-exp(-v*t-h0));

        % Modellfunktion nach Baranyi
        yt = y0t(1)+umax*At...
                  -(1/m)*log(1+((exp(m*umax*At)-1)/...
                  (exp(m*(ymax-y0t)))));


Script-File:
Code:
clc
clear all

format short
format compact

%% Einlesen der Messwerte
load('TEST')  %laedt I_0; V; e; exp; xm

% xm - Messwerte Zelldichte Matrix m-Tageswerte / n-Messreihen       10x16
% e - gemessene Abweichungen                                         10x16
% I_0 - Vektror der jeweiligen Initial-OD                             1x16
% uexp - spez. Wachstumsrate jew. in exp. Phase                       1x16
% V - Verdünnungswerte                                               10x16


k=10^3;         % Proportionalitaetsfaktor
V_H2O=20;       % Volumen des flüssigen Trägermediums, Wasser
V_I0=2;         % Volumen des Inokulums

xe=(xm-(e.*V))*k;   % Verrechung des Fehlerwertes (e) mit der jeweiligen Verdünnung (V)
ye=log(xe);         % ln(xe)

x0m=xe(1,:);        % Initial-OD (gemessen)
y0m=ye(1,:);        % ln(x0m)

x0t=I_0.*k/(V_H2O/V_I0); % Initial-OD (theoretisch)
y0t=log(x0t);            % ln(x0t)

ymax=max(ye);       % max. Zelldichte

umax=max(uexp);     % max. spez. Wachstumsrate aus max(uexp)

t=0:1:9;

%% Baranyi-Modell

var0 = [1 1 1];

T = func(var0,t,umax,ymax,y0t);

var = lsqcurvefit(func,var0,t,ye);


Für jeglicher verbale Schläge auf den Hinterkopf, bin ich sehr Dankbar!!!

Grüße,
Theodyzee

P.S. @frankw: Dein Beispiel konnte ich leider nicht anwenden. Aber Danke trotzdem! Rolling Eyes
 
Harald
Forum-Meister

Forum-Meister


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

sieht schon viel besser aus.

Das Problem ist:
lsqcurvefit möchte die Funktion mit zwei Argumenten aufrufen. Die Funktion erwartet aber fünf. Das Problem wird auf dieser (auch aus der Doku von lsqcurvefit verlinkten) Seite ausführlich erläutert.
http://uk.mathworks.com/help/optim/.....ing-extra-parameters.html

Ich würde "Anonymous Functions" empfehlen.

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 - 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.