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

hilfsgrößen aus odeX plotten

 

Lilith

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.08.2012, 09:04     Titel: hilfsgrößen aus odeX plotten
  Antworten mit Zitat      
Hallo,

ich habe ein System aus 4 ODEs und lass die lösen... möchte nun aber Hilfsgrößen (s.u.) aus der odefun plotten. Es wäre toll wenn jemand eine Idee hat wie ich die Daten aus der odefun bekomme.

Danke schonmal im Vorraus!

Code:

function mathmodelQ
clc;
close all;

%parameter
n.I0 = 1;            
n.z = 2;            
n.a = 3;            
n.wC = 4;          
n.wNmin = 5;      
n.wNmax = 6;      
n.wN0 = 7;          
n.vm = 8;    
n.vh = 9;    
n.rho = 1;          
n.mum = 2;          
n.p0 = 3;            
n.phi = 4;  

%anfangsbedingungen
rhoX0 = 4;            
rhoL0 = 3;              
wChl0 = 2;          
rhoN0 = 1;      

n.rhoX0 = rhoX0;
n.rhoN0 = rhoN0;

x0 = [rhoX0 rhoL0 wChl0 rhoN0];

%solveraufruf
t_span = [0 12];
[t,X] = ode15s(@Mod, t_span, x0, [], n);
rhoX = X(:,1);
rhoL = X(:,2);
wChl = X(:,3);
rhoN = X(:,4);

%daten für weitere plots
tdw = (rhoX+rhoL)/1000;        
TAGP = (rhoL/(rhoL+rhoX))*100;  

%graph
figure(5)
clf;
subplot(2,1,1)
plot(t,rhoX/1000)
subplot(2,1,2)
plot(t,rhoL/1000)

figure(7)
clf;
subplot(2,1,1)
plot(t,wChl)
subplot(2,1,2)
plot(t,rhoN/1000)


figure(6)
clf;
subplot(2,1,1)
plot(t,tdw)
subplot(2,1,2)
plot(t,TAGP)

% figure(8)
% clf;
% plot(t,wN)

function dxdt = Mod(~,x,n)

%zerlegung des zustandsvektors
rhoX = x(1);
rhoL = x(2);
wChl = x(3);
rhoN = x(4);

%Variablen nicht kleiner 0!
rhoX = max(rhoX, 0);
rhoL = max(rhoL, 0);
wChl = max(wChl, 0);
rhoN = max(rhoN, 0);

%berechnung der hilfgroessen  !!!um diese Größen geht es!!!
wN = (n.wN0*n.rhoX0+n.rhoN0-rhoN)/rhoX;
wN = max(wN, n.wNmin); %wN nicht kleiner wNmin
I = (n.I0/(n.a*n.z*rhoX*wChl))*(1-exp(-1*n.a*n.z*rhoX*wChl));
pm = (n.p0*(rhoX*wN)^2)/((rhoX*wN)^2+((n.wNmin^2)*(rhoX+rhoL)^2));
p = pm*wChl*(1-exp((-1*n.a*n.phi*I)/pm));

nitrogen = n.mum*(1-(n.wNmin/wN));
light = p/n.wC;

mu = min(nitrogen,light);
v = ((n.wNmax-wN)/(n.wNmax-n.wNmin))*((n.vm*rhoN)/(rhoN+n.vh));

%berechnung der ableitungen
drhoX_dt = mu*rhoX;
drhoL_dt = (p-n.wC*mu)*rhoX;
dwChl_dt = ((n.wC*n.rho*mu*v)/p)-mu*wChl;
drhoN_dt = -1*v*rhoX;

dxdt = [drhoX_dt; drhoL_dt; dwChl_dt; drhoN_dt;];


 


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 23.08.2012, 12:07     Titel: Re: hilfsgrößen aus odeX plotten
  Antworten mit Zitat      
Hallo Lilith,

Eine Antwort wäre einfacher, wenn Du nur den relevanten Teil des Programms postest. So ist das Suchen, was genau die "Hilfsgrößen" und was die "odefun" ist umständlicher als nötig.

Der Integrator gibt Dir die Werte für X und T zurück. Mit diesen kannst Du dann Mod() nochmal aufrufen. Die geünschten Werte werden dann als 2. Output von Mod() zurückgegeben: Während dies vom Integrator ignoriert wird, benutzt Du es von ausserhalb.

Noch eine Anmerkung: Die Benutzung von MAX und MIN führt zu Unstetigkeiten im der zu integrierenden Funktion. Die Integratoren von Matlab sind (wie fast alle anderen Integratoren auch) aber darauf angewiesen, dass die Funktion glatt ist. Andernfalls versagt die Schrittweitensteuerung und die Ergebnisse können massiv ungenau werden. Aus wissenschaftlicher Sicht ist das grober Unfug.
Bedauerlicherweise ist das Ignorieren der numerischen Spezifikationen der Integratoren weit verbreitet und ich habe schon (zu) viele Papers, Diplom- und sogar Doktorarbeiten gesehen, in denen so etwas zur "Berechnung von Ergebnissen" benutzt wird. Natürlich spuckt der Integrator auch eine Zahl aus und die kann sogar in der Nähe der "korrekten" Lösung liegen. Man kann dies allerdings nicht kontrollieren, so dass das Resultat vorsichtshalber als "zufällig" betrachtet werden muss.

Unstetigkeiten lassen sich nur per Event-Funktion korrekt behandeln, wobei bei Matlab's ODE-Lösern leider umständlich die Integration gestoppt und neu gestartet werden muss. Eine Verbesserung wäre hier sehr hilfreich und nicht schwierig.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Lilith

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.08.2012, 21:31     Titel:
  Antworten mit Zitat      
Danke schonmal.
Auch Danke für die Sache mit den Unstetigkeiten, in diesem Fall können nicht wirklich viele Dummheiten passieren, aber es ist gut zu wissen wie man es richtig macht. Das war mein erstes ernsthaftes Matlab file und ich hatte den Quelltext komplett gepostet, falls jemand an dem file "rumbasteln" wollte.
 
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.