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

Probleme mit fzero

 

MartinKeppler
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 07.01.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.01.2010, 13:43     Titel: Probleme mit fzero
  Antworten mit Zitat      
Hallo,

Ich habe Probleme mit der fzero funktion im zweiten Teil meines Codes. Ich möchte gerne die Energiebilanz lösen und benutze dazu die folgende Gleichung:

f_energy_balance=F*f_evaldeltaHV(P,Tf,z)+Q-V*f_evaldeltaHV(P,T,y)-L*f_evaldeltaHL(P,T,x);

Nun die Interationsvariable ist T neu (temperatur, Tnew) und ich möchte gerne die Temperatur wissen, wo das alles null ergibt. Also:

Tnew=fzero(f_energy_balance,T,[],F,Q,V,L,P,T,x,y,z,Tf);

Das geht aber nicht!? Liegt es eventuell an f_eval...(P,T,x), welche selber Funktionen sind die T benötigen? Tf ist eine konstante? Wie könnte ich das schreiben, damit ich T finde wo die gleichung null ergibt?

f_evaldeltaHV(P,Tf,z); %Enthalpy of Feed stream in [J/mol]
f_evaldeltaHV(P,T,y); %Enthalpy of Vapor stream in [J/mol]
f_evaldeltaHL(P,T,x); %Enthalpy of Liquid stream in [J/mol]


Code:


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Q,P flash
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%----Input-------------------------------------------------------------------------------

%% Init
clear all
F=110; %[mol/s] flow rate of gaseous mixture
P=1;  % [bar] pressure inside flash unit
Q=-0.55*10^6;  % [W] heat duty of flash
z=[0.17 0.23 0.3 0.1 0.06 0.14]; % molar fraction of feed (row vector)
T=250; %[K] %initial guess temperature of flash

%1. guess V/F (assumed zeta (split fracton of flash)=1 for z1,z2 and z3. Rest zeta=0
    V=sum(F*z(1:3));   %Vapor flow in mol/s
    L=sum(F*z(4:6));    %Liquid flow in mol/s
    VF=V/F;  % V/F= alpha (a)


%% ----Solve T,P flash---------------------------------------------------------------------
timax=1000;
for ti=1:timax
    [VF, x, y] = IdealFlash(P, T, VF, z)
    %3. evaluate K(P, T, x, y) call f_evalK(P,T,x,y)
    K=f_evalK(P,T,x,y)
    %4. solve
    f=inline('sum((K-1).*z./(1+(K-1)*VF))','VF','K','z');
    % LOOP1
    Kchange=1; %just for having an initially large value (see next, "while", line)
    roundmax=1000;
    round=1;
    while (Kchange>1e-5)
        VF=fzero(f,VF,[],K,z);
    %5. evaluate x and y
        x=z./(1+(K-1)*VF)
        y=K.*x
        Knew=f_evalK(P,T,x,y)  
        Kchange=sum(abs(Knew-K));
        K=Knew;
        if round==roundmax
            disp('ERROR: ''round'' reached ''roundmax'', aborting..');
            break;
        end;
        round=round+1
        VF
    end
   
%% Second iteration: Solve the energy balance
    V=F*VF; % Vapor stream in mol/s
    L=F-V; % Liquid stream in in mol/s
    P=1;
    Tf=350; %Temperature of feed
%     Tchange=1000
%     while (abs(Tchange)>1e-5)
%     HF=f_evaldeltaHV(P,Tf,z); %Enthalpy of Feed stream in [J/mol]
%     HV=f_evaldeltaHV(P,T,y); %Enthalpy of Vapor stream in [J/mol]
%     HL=f_evaldeltaHL(P,T,x); %Enthalpy of Liquid stream in [J/mol]
   
    f_energy_balance=F*f_evaldeltaHV(P,Tf,z)+Q-V*f_evaldeltaHV(P,T,y)-L*f_evaldeltaHL(P,T,x);
    Tnew=fzero(f_energy_balance,T,[],F,Q,V,L,P,T,x,y,z,Tf);

     Tchange=T-Tnew;
%     if abs(Tchange)<1e-5
%         break;
%     end;
%     T=Tnew
%end;

if ti==timax
    disp('Error: T-loop did not converge; ''ti'' reached ''timax'' - aborting..');
else
end;


%for i=1:100,vf=i/100,value(i)=f(vf,K,z);end;plot([1:100]/100,value);
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 07.01.2010, 13:56     Titel:
  Antworten mit Zitat      
Hallo,

ein Blick in die Doku sollte eigentlich reichen, um zu sehen, dass es so nicht geht: fzero nimmt max. 3 Argumente an.

Wie es vermutlich geht:

Code:
f_energy_balance= @(T) F*f_evaldeltaHV(P,Tf,z)+Q-V*f_evaldeltaHV(P,T,y)-L*f_evaldeltaHL(P,T,x);


Dazu müssen f_evaldeltaHV etc. Dateien mit jeweils 3 Eingabe- und 1 Rückgabeargument (oder ein entsprechendes Function Handle) sein und alle Variablen außer T (P, Tf, z etc.) vorher im Workspace definiert werden. Alternativ können sie auch direkt in der Code geschrieben werden, z.B.
Code:
f_energy_balance= @(T) F*f_evaldeltaHV(1,2,3)+Q-V*f_evaldeltaHV(4,T,6)-L*f_evaldeltaHL(7,T,9);


In beiden Fällen wäre der Aufruf dann:
Code:
Tnew=fzero(f_energy_balance,T0)

wobei T0 der Anfangswert ist.


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

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 07.01.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.01.2010, 16:07     Titel:
  Antworten mit Zitat      
Hallo Harald,

Vielen Dank, hat nun geklappt. Ich bin wirklich sehr sehr froh über Deine Hilfe.

Wobei, ich habe auch schon gesehen, dass folgende Kombination verwendet wurde:

Code:

function zero = energy_Balance(R,Q,Feed,z,alpha,T1,Hf,A,B,C,D,E,F); %dieser Teil ist in einem separation m file als funktion definiert, deshalb das "function" vor dem "zero". Es handelt sich hier nur um einen Ausschnitt.
R = fzero(@energy_balance_BP, R0, [],Q,Fe,z,alpha,T1,Hf,A,B,C,D,E,F);


und das klappt (Allerdings eine andere Methode, die keine direkte Enthalpy Berechnung macht, sonder nur indirekt über R, ABC...). Ich habe allerdings nie ganz verstanden für was das "@" steht und []. Ich nehme an [] trennt die "normalen Inputs" von der Zielvariable.

Trotzdem noch einmal vielen Dank!!

Gruss,
Martin
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 07.01.2010, 17:04     Titel:
  Antworten mit Zitat      
Hallo,

@ steht für ein Function Handle (gib das mal in der Doku ein).

[] steht für eine leere Matrix und wird oft verwendet, um ein Eingabeargument zu "überspringen" (bzw. eben "nichts" dafür zu übergeben).

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

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 07.01.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.01.2010, 11:42     Titel:
  Antworten mit Zitat      
Danke Harald. Wenn auch die Erklärung im Matlab Help für Function Handle nicht gerade bezaubernd ist, fand ich einen Eintrag hier im Forum, welcher einiges klarer ist.

http://www.gomatlab.de/tutorial-kei.....function-handle-t545.html


MfG,

Martin

Und hier noch wie es funktioniert hat.
Code:

f_energy_balance=@ (T) F*f_evaldeltaHV(P,Tf,z)+Q V*f_evaldeltaHV(P,T,y)-L*f_evaldeltaHL(P,T,x);
Tnew=fzero(f_energy_balance, T)
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 08.01.2010, 11:50     Titel:
  Antworten mit Zitat      
Hallo,

wo ist die MATLAB Help denn konkret unklar?

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

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 07.01.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.01.2010, 12:09     Titel:
  Antworten mit Zitat      
Zum Beispiel:
HANDLE Superclass of all handle classes.
A handle is an object that indirectly references its data. When a
handle is constructed, an object with storage for property values is
created. The constructor returns a handle to this object. When a
handle object is copied, for example during assignment or when passed
to a MATLAB function, the handle is copied but not the underlying
object property values.

The HANDLE class is an abstract class and cannot be directly
constructed. It is the superclass for all classes that follow handle
semantics.

Schon ziemlich kauderwelsch...obwohl ich Englisch praktisch flüssig spreche...

Gruss,
Martin
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 08.01.2010, 12:27     Titel:
  Antworten mit Zitat      
Hallo,

da hast du vielleicht einen ungünstigen Treffer verwendet. Ein Handle ist nicht dasselbe wie ein Function Handle. Schau dir doch mal bitte das hier an:
http://www.mathworks.com/access/hel...../ref/function_handle.html

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

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 07.01.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.01.2010, 12:29     Titel:
  Antworten mit Zitat      
Yop, schon um einiges besser.
Vielen Dank.

Schönes Weekend.

Gruss,
Martin
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.