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

Variable limitieren/begrenzen

 

Onno
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 05.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.10.2011, 15:32     Titel: Variable limitieren/begrenzen
  Antworten mit Zitat      
Hallo,

kann mir jemand sagen wie ich eine Variable in einer Differenzialgleichung begrenzen kann z.B. die Sauerstoffkonzentration kann nie unter null fallen?

Vielen Dank schonmal

Grüße
Private Nachricht senden Benutzer-Profile anzeigen


Kevin
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 93
Anmeldedatum: 18.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.10.2011, 16:56     Titel:
  Antworten mit Zitat      
Hallo
Code:

if konzentration<=0 then
konzentration=0;
end;
 

Gruß
Kevin
_________________

1000 Buchstaben? Warum nur 6?
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 05.10.2011, 18:11     Titel:
  Antworten mit Zitat      
oder auch so

Code:

konzentration = max(konzentration, 0);
 
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: 05.10.2011, 22:10     Titel:
  Antworten mit Zitat      
Hallo,

wenn die Sauerstoffkonzentration Teil des Modells ist, sollte schon durch das Modell sichergestellt sein, dass die Sauerstoffkonzentration nicht negativ wird. Ansonsten bzw. bei numerischen Problemen hilft der Vorschlag von denny.

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

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 05.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.10.2011, 14:15     Titel:
  Antworten mit Zitat      
Danke schonmal für die Antworten,

Die Sauerstoffkonzentration ist Teil des Modells und sollte eigentlich im Realfall nicht unter null gehen (regelungsbedingt), allerdings kann sie das unter bestimmten Umständen. Allerdings nur bis null und nicht darunter da in der Realität keine negative Sauerstoffkonzentration existiert. Ich hab beide Vorschläge probiert, kriegs aber nicht hin das wenn cO2 über eine Differenzialgleichung berechnet wird null als Untergrenze angenommen wird. Ich hab die Files mal beigefügt sind noch nicht fertig aber man kann in der Graphik erkennen das cO2 unter null geht.


________________________________________________________
Code:

% bioreaktor1.m

% Definition der Modellparameter
mumax=0.1;           % max. spezifische Wachstumsrate [1/h]
Ks=500;               % Sättigungskonstante Substrat [g/m^3]
YXS=0.55;             % Ausbeutekoeffizient Biomasse/Substrat[g/g]
alpha=0.2;            % Luedeking-Piret Parameter qp=alpha*mu+beta;
beta=0;               % Luedeking-Piret Parameter qp=alpha*mu+beta;
cse=300000;           % [g/m^3] Feed Substratkonz.
F=0;                  % [m^3/h] Feedrate
kd=0.08;              % [1/h] Sterberate
qms=0.0;              % [1/h] Substratverbrauch für den Erhaltungsstoffwechsel
kl=3000;              % Stofftransportkoeffizient [1/h]
Vf=0.001;             % Volumen des Fermenters [m^3]
c20=1.568;            % O2 Konzentration die 20% O2 Sättigung von H2O entspricht [g/m^3]
A=10;                 % Blasenoberfläche im Reaktor [m^2]

tsim = [0; 30]; % Simulationszeitraum (0 bis 15 h)          
options = odeset('RelTol',1e-5); % Definition der Toleranz (Genauigkeit der Simulation)

% Setzen der Anfangsbedingungen (Vektor y0)
cx0=2000;        %  Biomassekonz. zu Beginn der Kultivierung [g/m^3]
cs0=4000;           % Startkonzentration des Substrats [g/m^3]
V0=0.001;             % Anfangsvolumen [m^3]        
cO20=7.84;    % Anfangskonz O2 in Wasser gesättigt bei 30°C [g/m^3]

% Die Reihenfolge der Zustände wird durch die Differentialgleichungen
% im File monod.m festgelegt

y0(1) = cx0; % Biocmasse
y0(2) = cs0; % Substrat
y0(3) = 0;   % Produkt
y0(4) = V0;  % Volumen
y0(5) = cO20; % Sauerstoffkonzentration im Medium
y0(6) = 0;   % Belüftungsrate

% Aufruf der Simulation (Zustandsvektor y)
[t,y] = ode15s(@monod,tsim,y0,options,mumax,YXS,Ks,alpha,beta,kd,qms,F,cse,kl,Vf,c20,A);

% Ergebnisse werden von y in andere Variablen kopiert
cx=y(:,1); % Biomassenkonz. [g/l]
cs=y(:,2); % Substratkonz. [g/l]
cp=y(:,3); % Produktkonz. [g/l]
V=y(:,4);  % Volumen [l]
cO2=y(:,5); % Sauerstoffkonzentration[g/l]
flow=y(:,6); % Belüftungsrate mit Raumluft[l/h]

% Erzeugen eines Diagramms
figure;
plot(t,cx,t,cs,t,cp,t,cO2,t, flow,'linewidth',2);
title('Batchprozess');
xlabel('Zeit [h]');
ylabel('Konzentration [g/m^3]');
legend('Biomasse','Substrat','Produkt','cO2','flow',2);
grid % erzeugt Gitter
 

_________________________________________________

Code:

function dydt = monod(t,y,mumax,YXS,Ks,alpha,beta,kd,qms,F,cse,kl,Vf,c20,A)
% Definition der Differentialgleichungen
% dy/dt = f(y)

cx=y(1); % Biomassenkonz. [g/l]
cs=y(2); % Substratkonz. [g/l]
cp=y(3); % Produktkonz. [g/l]
V=y(4);  % Volumen [l]
cO2=y(5); % Sauertstoffkonz. [g/l]
flow=y(6); % Belüftungsrate mit Raumluft [l/h]

% Monodkinetik
mu = mumax*cs/(cs+Ks);

% Luedeking-Piret Ansatz für die Produktbildung
qp = alpha*mu + beta;       % Produkt ist CO2
qO2=-qp;                    % Die Sauerstoffverbrauchsrate ist bei Glucose erbrauch

dydt=ones(6,1);            % definiert ein Vektor mit der Länge 6
dydt(1) = mu*cx - kd*cx - F/V*cx;                   % dcx/dt
dydt(2) = -mu/YXS*cx - qms*cx + F/V*(cse-cs);       % dcs/dt
dydt(3) = qp*cx - F/V*cp;                           % dcp/dt
dydt(4) = F;                                        % dV/dt
dydt(5) = -(qp*cx - F/V*cp); % dcO2/dt
dydt(6) = 10^-((c20-cO2)+2.5);% dflow/dt
 



Grüße
Stephan
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: 06.10.2011, 19:49     Titel:
  Antworten mit Zitat      
Hallo,

ich habe mal folgende Zeilen hinzugefügt:
Code:
if y(5) < 0 && dydt(5) < 0
    dydt(5) = 0;
end

Erklärung: wenn y(5) "ein wenig negativ" geworden ist und ich noch mehr davon wegnehmen würde, dann nehme ich nichts weg.

Ich vermute allerdings, dass die Ursache des Problems hier ein Modellierungsfehler ist. Also: Gleichungen und insbesondere Vorzeichen und Einheiten kontrollieren. Es kann auch sein, dass einfach nicht alle relevanten Effekte enthalten sind.

Was ich hier gemacht habe, ist schließlich nur eine Notlösung, und es bleibt offen, ob der Rest der Lösung sinnvoll ist. Wie gesagt, ich kann ja nicht mehr Sauerstoff rausziehen als da ist. Insbesondere würde ich erwarten, dass es mit sinkender Sauerstoffkonzentration auch schwieriger wird, weiteren Sauerstoff zu entziehen.

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

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 05.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.10.2011, 11:40     Titel:
  Antworten mit Zitat      
Hi Harald,

du hast recht der Einfachheit halber hab ich die Produktbildung gleich der Sauerstoffverbrauchsrate gesetzt ohne Abhängigkeit voneinander, deshalb kommts auch zu einer negativen Sauerstoffkonzentration. Ist 'n unsauberes modell aber für manche Fragestellungen einfacher als alles voneinander abhängig zu machen. Bei dem Differentialgleichungslöser Berkeley Madonna gibts einen einfachen Befehl limit(variable) >= um genau solche Dinge zu vereinfachen, dachte bei Matlab wäre das auch möglich. Sind allerdings auch meine ersten Gehversuche mit Programmen wie diesen.

Besten Dank
Grüße Stephan
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: 07.10.2011, 22:57     Titel:
  Antworten mit Zitat      
Hallo,

eine Minimallösung habe ich ja angegeben.
Man könnte sicher über Events gehen, um das genauer zu machen (siehe Doku von odexy), aber das wäre hier wohl überzogen.

Um einen störenden Effekt negativer Konzentrationen zu verhindern, könnte man zusätzlich noch

Code:
cO2=max(0, y(5));

einbauen.

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.