Verfasst am: 16.01.2008, 12:49
Titel: Konstantenberechnung über curve fitting
Liebe Matlab Community,
ich habe folgendes Problem und wäre froh, wenn mir einer helfen könnte.
Mein Stoff A reagiert über B zum Produkt C. Die Lösung der Reaktion erfolgt über ein DGL, welches ich mit dem ode45 solver lösen kann. Dafür gebe ich der Funktion die Konstanten k1 und k2 als (Start)werte vor.
Nun möchte ich, dass die Konstanten mithilfe der Least Square Methode (Minimumkriterium: sum( (KonzMesswert - KonzSimulation)^2) ) so angepasst werden, dass die simulierte Lösung möglichst nah an meine Messwerte kommt.
Folgende zwei m-files habe ich geschrieben:
Rkt_ABC (Hauptfile) - hier der Code
clear
%Rkt. A (v13(2,:)) über B (v13(4,:)) zu C (v13(3,:))
%plotten
plot(t,c(:,1),'b',v13(1,:),v13(2,:),'bo',t,c(:,2),'r',v13(1,:),v13(4,:),'ro',t,c(:,3),'k',v13(1,:),v13(3,:),'ko');
legend(['A-Simulation'],'A-Experiment',['B-Simulation'],'B-Experiment',['C-Simulation'],'C-Experiment');
xlabel('Zeit in Stunden','Fontsize',10)
ylabel('Konzentrationen in mgL-1','Fontsize',10)
hold on
DGL_Rkt_ABC (Funktion mit dem DGL) - hier der Code
function dcdt = DGL_Rkt_ABC(t,c)
Wie schaffe ich es nun die Konstanten zu optimieren? Brauche ich dazu eine weitere Funktion? Kann ich mit der lsqcurvefit Funktion aus Matlab arbeiten? Wenn ja, wie müssen die Datensätze übergeben werden?
da du die DGL numerisch berechnest sind einfache fitting-tools in matlab, so glaube ich, nicht geeignet. du hast hier ein optimierungsproblem vorliegen. und dafür gibt es routinen in matlab, wie fminsearch, fmincon...
hab dein programm mal mit einer Optimierung mittels Simplex-Verfahren ausgestattet, welches die fehlerquadratsumme minimiert.
allerdings sehen die verläufe noch nicht wirklich zufriedenstellend aus
dies liegt aber nicht an der optimierung, sondern am mathematischen modell
die Ordnung der Reaktionsgeschw. muss ja nicht immer 1 sein, sie nimmt in der Praxis oft sehr krumme werte an... aber die lassen sich ja auch anpassen probiers doch mal
%Konstanten per Hand als Startwerte für die spätere Iteration
k1 = 1.5;
k2 = 4;
par0 = [k1 k2];
%Festlegung der Zeitschritte für das Lösen des DGL
tspan = v13(1,:);
%Optionen für die Optimierungsroutine(optional)
options = optimset('Display','iter','MaxIter',50);
%Übergabe der Startparameter an die Simplex-Optimierungsroutine fminsearch
paropt = fminsearch(@objective,par0,options);
%letztmaliges Lösen der DGL mit optimierten Parametern
[t,c] = ode45(@DGL_Rkt_ABC,tspan,c0,' ',paropt);
%ausgabe der optimierten Parameter
fprintf('k1= %4.2f\nk2= %4.2f\n',paropt(1),paropt(2))
%plotten
plot(t,c(:,1),'b',v13(1,:),v13(2,:),'bo',t,c(:,2),'r',v13(1,:),v13(4,:),'ro',t,c(:,3),'k',v13(1,:),v13(3,:),'ko');
legend(['A-Simulation'],'A-Experiment',['B-Simulation'],'B-Experiment',['C-Simulation'],'C-Experiment');
xlabel('Zeit in Stunden','Fontsize',10) ylabel('Konzentrationen in mgL-1','Fontsize',10)
%%% Optimierungsroutine fminsearch %%% function J=objective(par) global c0 v13 tspan
%Lösung des DGL-Systems mit Startwerten k1 und k2
[t,c] = ode45(@DGL_Rkt_ABC,tspan,c0,' ',par);
%Bewertungskriterium (wird immer minimiert!)aus der Fehlerquadratsumme
J = sum(abs(c(:,1)-v13(2,:)'))+sum(abs(c(:,2)-v13(4,:)'))+sum(abs(c(:,3)-v13(3,:)'));
%%% DGL_Rkt_ABC (Funktion mit dem DGL) - hier der Code %%% function dcdt = DGL_Rkt_ABC(t,c,par)
Ne ok, hat sich erledigt, habe nicht bemerkt, dass der Datenvektor entsprechend anders ist. Sorry!
Danke @lupie für die schöne Lösung!
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.