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

while Schleife im Matlab Function Block wird nicht ausgefüh

 

Barracuda_stud
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 31.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.07.2017, 21:26     Titel: while Schleife im Matlab Function Block wird nicht ausgefüh
  Antworten mit Zitat      
Hallo zusammen,

ich habe gerade ein Problem mit einer while-Schleife in einem Matlab Function Block. Ich hoffe ihr könnt mir dabei behilflich sein, da ich schon den ganzen Tag nach dem Fehler suche. Ich bin noch nicht sonderlich fit in Matlab und Simulink, daher entschuldige ich mich jetzt schon dafür.

Mein Problem (siehe auch Code):
Ich möchte in einem Matlab Function Block den Austrittsdruck p_He_aus iterativ berechnen. Dazu habe ich eine while Schleife verwendet, die als Bedingung die relative Abweichung (rel_Abweichung) des Austrittsdrucks von p_He_aus beinhaltet. Wenn ich die Simulation starte, dann kommt die Fehlermeldung "Variable 'y_O2' is not fully defined on some execution paths". Die while Schleife wird also nicht durchlaufen und somit wird y_O2 nicht berechnet. Da ich aber vor der while Schleife rel_Abweichung = 1 setze und die while-Bedingung rel_Abweichung > 0.1 lautet, müsste eigentlich die while-Schleife ausgeführt werden Twisted Evil . Ich habe zum Spaß mal die while Schleife einmal durch eine if-Bedingung und einmal durch eine for-Schleife ersetzt. Komischerweise ist dann das Programm ohne Probleme gelaufen Question Question Question .
Meine Frage an euch: Warum wird die while Schleife nicht ausgeführt?

Der gesamte Code im Matlab Function Block lautet (eigentlich ist nur die while Schleife relevant Laughing ):

Code:

function [xi_O2,xi_H2,p_aus,T_aus,xi_He,xi_H2O_aus,delta_hr]   = Brennkammer(T_ein,T_aus,xi_He_ein,xi_H2O_ein,T_H2,T_O2,p_ein,Epsilon,hmf0_He,hmf0_O2,hmf0_H2,hmf0_H2O,M_He,M_O2,M_H2,M_H2O,p_Werte,T_Werte,hm_He_Werte,hm_O2_Werte,hm_H2_Werte,hm_H2O_Werte)

T0 = 298.15;                % Temperatur bei Standardbedingung
p0 = 1;                     % Druck bei Standardbedingung

% Bestimmung der Drücke
x_He_ein = (xi_He_ein/M_He) / (xi_He_ein/M_He + xi_H2O_ein/M_H2O);                        % Berechnung der Molenbrüche (Molenbrüche Austritt sind Startwerte für Iteration)
x_H2O_ein = (xi_H2O_ein/M_H2O) / (xi_He_ein/M_He + xi_H2O_ein/M_H2O);
x_He_aus = x_He_ein;
x_H2O_aus = x_H2O_ein;

p_aus = p_ein - Epsilon*p_ein;                                                            % Berechnung des Austrittsdrucks

p_He_ein = x_He_ein * p_ein;                                                              % Berechnung der Partialdrücke am Eintritt (Partialdrücke Austritt sind Startwerte für Iteration)
p_H2O_ein = x_H2O_ein * p_ein;
p_He_aus = x_He_aus * p_aus;
p_H2O_aus = x_H2O_aus * p_aus;

% Bestimmung der spez. Formationsenthalpie in J/mol
rel_Abweichung = 1;
while rel_Abweichung > 0.1
    hm_He_Tein = interp2(p_Werte,T_Werte,hm_He_Werte,p_He_ein,T_ein);
    hm_He_T0 = interp2(p_Werte,T_Werte,hm_He_Werte,p0,T0);
    hmf_He_Tein = hmf0_He*1000 + (hm_He_Tein - hm_He_T0);
   
    hm_H2O_Tein = interp2(p_Werte,T_Werte,hm_H2O_Werte,p_H2O_ein,T_ein);
    hm_H2O_T0 = interp2(p_Werte,T_Werte,hm_H2O_Werte,p0,T0);
    hmf_H2O_Tein = hmf0_H2O*1000 + (hm_H2O_Tein - hm_H2O_T0);
   
    hm_O2_Tein = interp2(p_Werte,T_Werte,hm_O2_Werte,p_ein,T_O2);
    hm_O2_T0 = interp2(p_Werte,T_Werte,hm_O2_Werte,p0,T0);
    hmf_O2_Tein = hmf0_O2*1000 + (hm_O2_Tein - hm_O2_T0);
   
    hm_H2_Tein = interp2(p_Werte,T_Werte,hm_H2_Werte,p_ein,T_H2);
    hm_H2_T0 = interp2(p_Werte,T_Werte,hm_H2_Werte,p0,T0);
    hmf_H2_Tein = hmf0_H2*1000 + (hm_H2_Tein - hm_H2_T0);
   
    hm_He_Taus = interp2(p_Werte,T_Werte,hm_He_Werte,p_He_aus,T_aus);
    hmf_He_Taus = hmf0_He*1000 + (hm_He_Taus - hm_He_T0);
   
    hm_H2O_Taus = interp2(p_Werte,T_Werte,hm_H2O_Werte,p_H2O_aus,T_aus);
    hmf_H2O_Taus = hmf0_H2O*1000 + (hm_H2O_Taus - hm_H2O_T0);
   
    % Berechnung der mol-Zahlen (y) und die Masse der Produkte (für eine Reaktionsgleichung mit kleinsten stöchiometrischen Faktoren)
    y_O2 = 1;
    y_H2 = 2;
    y_H2O = 2;
    y_He = (y_H2 * hmf_H2_Tein + y_O2 * hmf_O2_Tein - y_H2O * hmf_H2O_Taus) / (hmf_He_Taus + (x_H2O_ein/(1-x_H2O_ein)) * hmf_H2O_Taus - hmf_He_Tein - (x_H2O_ein/(1-x_H2O_ein)) * hmf_H2O_Tein);
    y_H2O_ein = (x_H2O_ein/(1-x_H2O_ein)) * y_He;
    y_H2O_aus = 2 + (x_H2O_ein/(1-x_H2O_ein)) * y_He;
   
    x_He_aus_neu = y_He / (y_He + y_H2O_aus);
    x_H2O_aus_neu = y_H2O_aus / (y_He + y_H2O_aus);
    p_He_aus_neu = x_He_aus_neu * p_aus;                                        % neuer Partialdruck He Austritt
    p_H2O_aus_neu = x_H2O_aus_neu * p_aus;                                      % neuer Partialdruck H2O Austritt
   
    rel_Abweichung = abs(((p_He_aus_neu - p_He_aus)/p_He_aus)*100);
    p_He_aus = p_He_aus_neu;                                                    % neuer Partialdruck He Austritt für weiteren Iterationsschritt definieren
    p_H2O_aus = p_H2O_aus_neu;                                                  % neuer Partialdruck H2O Austritt für weiteren Iterationsschritt definieren
end

m_O2 = y_O2 * M_O2;
m_H2 = y_H2 * M_H2;
m_He = y_He * M_He;
m_H2O_aus = y_H2O_aus * M_H2O;

end


Ich hoffe Ihr könnt mir dabei behilflich sein, da ich grade ratlos bin Crying or Very sad , woran das liegen könnte.
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 01.08.2017, 09:33     Titel:
  Antworten mit Zitat      
Hallo,

y_O2 ist doch immer gleich. Warum überschreibst du das?

Selbst wenn du das aus welchen Gründen auch immer in der Schleife haben möchtest, kannst du das vor der Schleife noch hinkopieren, um die Fehlermeldung zu beheben.

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

Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 31.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.08.2017, 11:42     Titel:
  Antworten mit Zitat      
Danke für die schnelle Antwort Smile .

Da hast du recht, y_O2 bleibt immer konstant. Ich habe y_O2 (und alle anderen Konstanten) auch schon vor die Schleife geschrieben, allerdings kommt dann die identische Fehlermeldung "Variable 'hmf_He_Taus' is not fully defined on some execution paths". Die Variable 'hmf_He_Taus' ist keine Konstante, sondern soll durch die while Schleife immer geändert werden.

Der Fehler taucht dann an einer Stelle auf, wo als erstes eine unbekannte Variable auftaucht und das ist dann 'hmf_He_Taus'. D.h. die while-Schleife wurde nicht durchlaufen und 'hmf_He_Taus' nicht definiert. Aber wieso wird die while-Schleife nicht durchlaufen Evil or Very Mad ?
Der vollständigkeitshalber nochmal der komplette Code:

Code:

function [xi_O2,xi_H2,p_aus,T_aus,xi_He,xi_H2O_aus,delta_hr]   = Brennkammer(T_ein,T_aus,xi_He_ein,xi_H2O_ein,T_H2,T_O2,p_ein,Epsilon,hmf0_He,hmf0_O2,hmf0_H2,hmf0_H2O,M_He,M_O2,M_H2,M_H2O,p_Werte,T_Werte,hm_He_Werte,hm_O2_Werte,hm_H2_Werte,hm_H2O_Werte)

T0 = 298.15;                % Temperatur bei Standardbedingung
p0 = 1;                     % Druck bei Standardbedingung

% Bestimmung der Drücke
x_He_ein = (xi_He_ein/M_He) / (xi_He_ein/M_He + xi_H2O_ein/M_H2O);                        % Berechnung der Molenbrüche (Molenbrüche Austritt sind Startwerte für Iteration)
x_H2O_ein = (xi_H2O_ein/M_H2O) / (xi_He_ein/M_He + xi_H2O_ein/M_H2O);
x_He_aus = x_He_ein;
x_H2O_aus = x_H2O_ein;

p_aus = p_ein - Epsilon*p_ein;                                                            % Berechnung des Austrittsdrucks

p_He_ein = x_He_ein * p_ein;                                                              % Berechnung der Partialdrücke am Eintritt (Partialdrücke Austritt sind Startwerte für Iteration)
p_H2O_ein = x_H2O_ein * p_ein;
p_He_aus = x_He_aus * p_aus;
p_H2O_aus = x_H2O_aus * p_aus;

% Bestimmung der spez. Formationsenthalpie in J/mol
rel_Abweichung = 1;
while rel_Abweichung > 0.1
    hm_He_Tein = interp2(p_Werte,T_Werte,hm_He_Werte,p_He_ein,T_ein);
    hm_He_T0 = interp2(p_Werte,T_Werte,hm_He_Werte,p0,T0);
    hmf_He_Tein = hmf0_He*1000 + (hm_He_Tein - hm_He_T0);
   
    hm_H2O_Tein = interp2(p_Werte,T_Werte,hm_H2O_Werte,p_H2O_ein,T_ein);
    hm_H2O_T0 = interp2(p_Werte,T_Werte,hm_H2O_Werte,p0,T0);
    hmf_H2O_Tein = hmf0_H2O*1000 + (hm_H2O_Tein - hm_H2O_T0);
   
    hm_O2_Tein = interp2(p_Werte,T_Werte,hm_O2_Werte,p_ein,T_O2);
    hm_O2_T0 = interp2(p_Werte,T_Werte,hm_O2_Werte,p0,T0);
    hmf_O2_Tein = hmf0_O2*1000 + (hm_O2_Tein - hm_O2_T0);
   
    hm_H2_Tein = interp2(p_Werte,T_Werte,hm_H2_Werte,p_ein,T_H2);
    hm_H2_T0 = interp2(p_Werte,T_Werte,hm_H2_Werte,p0,T0);
    hmf_H2_Tein = hmf0_H2*1000 + (hm_H2_Tein - hm_H2_T0);
   
    hm_He_Taus = interp2(p_Werte,T_Werte,hm_He_Werte,p_He_aus,T_aus);
    hmf_He_Taus = hmf0_He*1000 + (hm_He_Taus - hm_He_T0);
   
    hm_H2O_Taus = interp2(p_Werte,T_Werte,hm_H2O_Werte,p_H2O_aus,T_aus);
    hmf_H2O_Taus = hmf0_H2O*1000 + (hm_H2O_Taus - hm_H2O_T0);
   
    % Berechnung der mol-Zahlen (y) und die Masse der Produkte (für eine Reaktionsgleichung mit kleinsten stöchiometrischen Faktoren)
    y_O2 = 1;
    y_H2 = 2;
    y_H2O = 2;
    y_He = (y_H2 * hmf_H2_Tein + y_O2 * hmf_O2_Tein - y_H2O * hmf_H2O_Taus) / (hmf_He_Taus + (x_H2O_ein/(1-x_H2O_ein)) * hmf_H2O_Taus - hmf_He_Tein - (x_H2O_ein/(1-x_H2O_ein)) * hmf_H2O_Tein);
    y_H2O_ein = (x_H2O_ein/(1-x_H2O_ein)) * y_He;
    y_H2O_aus = 2 + (x_H2O_ein/(1-x_H2O_ein)) * y_He;
   
    x_He_aus_neu = y_He / (y_He + y_H2O_aus);
    x_H2O_aus_neu = y_H2O_aus / (y_He + y_H2O_aus);
    p_He_aus_neu = x_He_aus_neu * p_aus;                                        % neuer Partialdruck He Austritt
    p_H2O_aus_neu = x_H2O_aus_neu * p_aus;                                      % neuer Partialdruck H2O Austritt
   
    rel_Abweichung = abs(((p_He_aus_neu - p_He_aus)/p_He_aus)*100);
    p_He_aus = p_He_aus_neu;                                                    % neuer Partialdruck He Austritt für weiteren Iterationsschritt definieren
    p_H2O_aus = p_H2O_aus_neu;                                                  % neuer Partialdruck H2O Austritt für weiteren Iterationsschritt definieren
end

m_O2 = y_O2 * M_O2;
m_H2 = y_H2 * M_H2;
m_He = y_He * M_He;
m_H2O_aus = y_H2O_aus * M_H2O;

% Berechnung der Massenbrüche von Edukte und Produkte (bezogen auf 1 kg Produkte)
xi_O2 = m_O2/(m_He + m_H2O_aus);
xi_H2 = m_H2/(m_He + m_H2O_aus);
xi_He = m_He/(m_He + m_H2O_aus);
xi_H2O_aus = m_H2O_aus/(m_He + m_H2O_aus);

% Berechnung der spez. Rekationsenthalpie in kJ/kg_Produkte
delta_Hr = (y_He * hmf_He_Taus + y_H2O_aus * hmf_H2O_Taus) - (y_He * hmf_He_Tein + y_H2 * hmf_H2_Tein + y_O2 * hmf_O2_Tein + y_H2O_ein * hmf_H2O_Tein);     % Berechnung der Reaktionsenthalpie in J für eine Reaktionsgleichung mit kleinsten stöchiometrischen Faktoren
delta_hr = delta_Hr / (y_He * M_He + y_H2O_aus * M_H2O);                                                                                                    % Berechnung der spez. Reaktionsenthalpie bezogen auf 1 kg Produkte in kJ/kg
end
 
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.