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

Event function ode45

 

Hubix92

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.03.2018, 10:11     Titel: Event function ode45
  Antworten mit Zitat      
[/code]Guten Tag liebe Matlab-Community,

Steh etwas auf dem Schlauch und brauche eure Hilfe.
Hoffe jemand kann mein Problem lösen.

Ich versuche die folgende Differentialgleichung mit dem ode45-Solver zu lösen.

Code:

function dfdt=df_dz_Validierung(tspan,y0)

T=453;
R=8.314;
rho_b=1100;
P_total=1;
Ac=(0.16^2*pi/4);
k_SR=6e6*exp(-77000/(R*T));
k_rWGS=4.8e8*exp(-108500/(R*T));
k_WGS=8e6*exp(-72000/(R*T));

dfadt=(k_rWGS*(P_total*(y0(3)/M_c)/(y0(1)/M_a+y0(2)/M_b+y0(3)/M_c+y0(4)/M_d+y0(5)/M_e))*...
    (P_total*(y0(4)/M_d)/(y0(1)/M_a+y0(2)/M_b+y0(3)/M_c+y0(4)/M_d+y0(5)/M_e))-k_WGS*...
    (P_total*(y0(2)/M_b)/(y0(1)/M_a+y0(2)/M_b+y0(3)/M_c+y0(4)/M_d+y0(5)/M_e))*...
    (P_total*(y0(1)/M_a)/(y0(1)/M_a+y0(2)/M_b+y0(3)/M_c+y0(4)/M_d+y0(5)/M_e)))*m_cat*M_a

dfbdt=(k_rWGS*(P_total*(y0(3)/M_c)/(y0(1)/M_a+y0(2)/M_b+y0(3)/M_c+y0(4)/M_d+y0(5)/M_e))*...
    (P_total*(y0(4)/M_d)/(y0(1)/M_a+y0(2)/M_b+y0(3)/M_c+y0(4)/M_d+y0(5)/M_e))-k_WGS*...
    (P_total*(y0(2)/M_b)/(y0(1)/M_a+y0(2)/M_b+y0(3)/M_c+y0(4)/M_d+y0(5)/M_e))*...
    (P_total*(y0(1)/M_a)/(y0(1)/M_a+y0(2)/M_b+y0(3)/M_c+y0(4)/M_d+y0(5)/M_e))-k_SR*...
    (P_total*(y0(5)/M_e)/(y0(1)/M_a+y0(2)/M_b+y0(3)/M_c+y0(4)/M_d+y0(5)/M_e))^0.6*...
    (P_total*(y0(2)/M_b)/(y0(1)/M_a+y0(2)/M_b+y0(3)/M_c+y0(4)/M_d+y0(5)/M_e))^0.4)*m_cat*M_b

dfcdt=(k_SR*(P_total*(y0(5)/M_e)/(y0(1)/M_a+y0(2)/M_b+y0(3)/M_c+y0(4)/M_d+y0(5)/M_e))^0.6*...
    (P_total*(y0(2)/M_b)/(y0(1)/M_a+y0(2)/M_b+y0(3)/M_c+y0(4)/M_d+y0(5)/M_e))^0.4-...
    (k_rWGS*(P_total*(y0(3)/M_c)/(y0(1)/M_a+y0(2)/M_b+y0(3)/M_c+y0(4)/M_d+y0(5)/M_e))*...
    (P_total*(y0(4)/M_d)/(y0(1)/M_a+y0(2)/M_b+y0(3)/M_c+y0(4)/M_d+y0(5)/M_e))-...
    k_WGS*(P_total*(y0(2)/M_b)/(y0(1)/M_a+y0(2)/M_b+y0(3)/M_c+y0(4)/M_d+y0(5)/M_e))*...
    (P_total*(y0(1)/M_a)/(y0(1)/M_a+y0(2)/M_b+y0(3)/M_c+y0(4)/M_d+y0(5)/M_e))))*m_cat*M_c

dfddt=(3*(k_SR*(P_total*(y0(5)/M_e)/(y0(1)/M_a+y0(2)/M_b+y0(3)/M_c+y0(4)/M_d+y0(5)/M_e))^0.6*...
    (P_total*(y0(2)/M_b)/(y0(1)/M_a+y0(2)/M_b+y0(3)/M_c+y0(4)/M_d+y0(5)/M_e))^0.4)-...
    (k_rWGS*(P_total*(y0(3)/M_c)/(y0(1)/M_a+y0(2)/M_b+y0(3)/M_c+y0(4)/M_d+y0(5)/M_e))*...
    (P_total*(y0(4)/M_d)/(y0(1)/M_a+y0(2)/M_b+y0(3)/M_c+y0(4)/M_d+y0(5)/M_e))-...
    k_WGS*(P_total*(y0(2)/M_b)/(y0(1)/M_a+y0(2)/M_b+y0(3)/M_c+y0(4)/M_d+y0(5)/M_e))*...
    (P_total*(y0(1)/M_a)/(y0(1)/M_a+y0(2)/M_b+y0(3)/M_c+y0(4)/M_d+y0(5)/M_e))))*m_cat*M_d

dfedt=-(k_SR*(P_total*(y0(5)/M_e)/(y0(1)/M_a+y0(2)/M_b+y0(3)/M_c+y0(4)/M_d+y0(5)/M_e))^0.6*...
    (P_total*(y0(2)/M_b)/(y0(1)/M_a+y0(2)/M_b+y0(3)/M_c+y0(4)/M_d+y0(5)/M_e))^0.4)*m_cat*M_e

dfdt=[dfadt dfbdt dfcdt dfddt dfedt];
dfdt=dfdt(:)

end
 


Dies funktioniert auch einwandfrei wenn ich kein Abbruchkriterium mittels Eventfuntkion einfüge

Hier der Code, für die Matlab-Function in Simulink welche die Berechnung startet:

Code:

function f  = d(y0,T,P)

    t_Verweilzeit=1e-3    
    t_Start=1e-5;
    tspan=[t_Start t_Verweilzeit];
 
    opt=odeset('Events',@Abbruch);
    [t,y,te,ye,ie] =ode45(@df_dz_Validierung,tspan,y0,opt);
 
    f=y(end,:)

end
 


Die Event function sieht wie folgt aus:

Code:

function [value,isterminal,direction] = Abbruch(t,y)
value=y(5);
isterminal=1;
direction=0;
    end
 


Ich erhalte immer folgende Fehlermeldung:

To use an event function with ode45, you must enable variable sizing and dynamic memory allocation.

Function 'MATLAB Function1' (#23.149.203), line 8, column 5:
"[t,y,te,ye,ie] =ode45(@df_dz_Validierung,tspan,y0,opt)"
Launch diagnostic report.

Wie muss ich meinen Code verändern damit die Berechnung entweder durch das erreichen von y(5)=0 oder Ablauf der Verweilzeit endet und mir diesen Wert für mein Simulinkmodell weitergibt

Schon eimal danke im Voraus


Hubix92

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.03.2018, 10:38     Titel:
  Antworten mit Zitat      
Ich habe soeben festgestellt dass die Abbruchfunktion einwandfrei in einem reinen Matlab Skript läuft.

Problem liegt also an der Kommunikation mit Simulink.

Hier jemand Erfahrung ?
 
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.