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

ein System von ode's an Messwerte fitten

 

Boanerges
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 09.05.10
Wohnort: Dresden
Version: ---
     Beitrag Verfasst am: 09.05.2010, 14:10     Titel: ein System von ode's an Messwerte fitten
  Antworten mit Zitat      
Hallo!

ich habe das folgende Problem.
Ich habe einen kontinuierlichen Rührkessel, in dem 3 Komponenten (A,B,C) reagieren (Gleichgewichtsreaktionen). Für die Stoffe B und C habe ich Messwerte. Jetzt möchte ich die Differentialgleichungen, die den Verlauf der Konzentrationen beschreiben an meine Messwerte fitten.

Ich habe es schon mit fminsearch versucht, bekomme aber kein befriedigendes Ergebnis.

In einem m-file habe ich die DGL's hinterlegt. Der sieht so aus:
Code:

function [dc]=reaktor(t,c,p)
  Vr=15; v=0.5;  % legt das Reaktionsvolumen und den Volumenstrom fest
  tau=Vr/v;
  c10=2.1;c20=0;c30=0; % die Anfangskonzentrationen
  p=abs(p); % p ist der Vektor mit den Reaktionskonstanten k; abs, gegen  negative k
  dc=zeros(3,1);
  dc(1)=c(1)*(-p(1)-p(6))+p(2)*c(2)+p(5)*c(3)+(c10-c(1))/(tau);
  dc(2)=c(2)*(-p(2)-p(3))+p(1)*c(1)+p(4)*c(3)+(c20-c(2))/(tau);
  dc(3)=c(3)*(-p(4)-p(5))+p(6)*c(1)+p(3)*c(2)+(c30-c(3))/(tau);
 


Dann habe ich noch ein m-file, in dem der Fehler berechnet wird.
Code:

function fehler = lsg(tm,cbm,ccm,a)
    p=[a(1) a(2) a(3) a(4) a(5) a(6)]; % Vektor mit den k-Werten die variert werden sollen
    c0=[2.1;0;0];
    [tsim,csim]=ode45(@reaktor,tm,c0,[],p);
    b=[cbm ccm];
    fehler=norm(csim(:,2:3)-b);% Berechnen des Fehler


tm,cbm und ccm sind meine Messwerte, die ich in der Konsole eingebe. Mit
Code:
[a]=fminsearch(@(a) lsg(tm,cbm,ccm),[1 1 1 1 1 1])
lasse ich mir jetzt meine Parameter ausgeben.

Meine Frage, gibt es einen besseren Weg als mit fminsearch die Parameter zu bestimmen. fminsearch ist scheinbar stark von der Anfangsschätzung abhängig. Ich habe aber leider keine Anhaltspunkte um eine ordentliche Schätzung zu machen. Die Parameter sollten außerdem nicht null werden.
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 09.05.2010, 15:58     Titel:
  Antworten mit Zitat      
Hallo,

fminsearch sucht nur nach einem lokalen Minimum. Etwas mehr Vorstellungen über die Parameter sollte man also reinstecken.

Alternativ kann man überlegen, Algorithmen aus der Global Optimization Toolbox (vor 2010a heißt sie Genetic Algorithm and Direct Search Toolbox) zu verwenden, z.B. patternsearch oder ga.

Mir fällt aber noch was auf: Die Zeile
Code:
[a]=fminsearch(@(a) lsg(tm,cbm,ccm),[1 1 1 1 1 1])
sollte wohl so aussehen:
Code:
[a]=fminsearch(@(a) lsg(tm,cbm,ccm, a),[1 1 1 1 1 1])
In der ursprünglichen Form kanns eigtl nicht klappen.

Ich bekomme den Code aber so oder so nicht mal zum Laufen...
Beispielwerte für cbm, ccm und tm würden wohl helfen.

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

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 09.05.10
Wohnort: Dresden
Version: ---
     Beitrag Verfasst am: 09.05.2010, 18:42     Titel:
  Antworten mit Zitat      
ja, dass stimmt bei fminsearch muss noch das a mit hin. wenn ich die folgenden zeilen im command window eingebe läuft der code bei mir

Code:

>> tm=[2 4 6 8 10 12 14 16];
>> ccm=[0.23 0.34 0.45 0.52 0.67 0.73 0.87 1.12]';
>> cbm=[0.17 0.28 0.39 0.48 0.56 0.78 0.80 0.91]';
>> [a]=fminsearch(@(a) lsg(tm,cbm,ccm,a),[1 1 1 1 1 1])

a =

    0.5369    1.4104    2.4210    1.1257   -0.0000    0.1727

>>
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

bist du inzwischen weitergekommen? Ich habe es zwischenzeitlich mit genetischem Algorithmus probiert und schaffe es zwar, den Fehler zu reduzieren, aber nicht, ihn auf 0 zu bringen (und das sollte er wohl sein).
Zusätzlich erreiche ich diesen nicht sehr guten Zielfunktionswert mit mehreren Durchläufen und komme auf versch. Parameterwerte, was mich doch verwundert.
An dieser Stelle kann ich nur raten, die Problemstellung noch einmal zu überprüfen.
Da es sich um eine Art Curvefitting zu handeln scheint, könnte man auch die entsprechenden Algorithmen mal darauf ansetzen.

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.