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

fsolve in matlab funktion block nutzen

 

Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.03.2014, 13:10     Titel: fsolve in matlab funktion block nutzen
  Antworten mit Zitat      
Hallo,
ich möchte in meinem Modell an anderer Stelle einen Faktor Z_1o nutzen welcher über die fsolve funktion bestimmt wird.

Ich hatte mir dazu ein m.file geschrieben mit welchem, dass in Matlab funktioniert, jedoch fällt es mir schwer dieses in einen Matlabfuntion Block zu integrieren.

Beim einfachen copy-paste ist es zu einem Fehler gekommen, der sagt die Funtion welche gelöst werden soll (g_=) ist unbekannt aber eins nach dem Anderen:

Hier ist das m.file um den Faktor Z zu berechen:
Code:
%Einheiten Umrechnen
atm=1.01325e5; % pa
l=10e-3; %Volumen in m^3
%Konstanten
a=-9.2211e-3*atm*l^3;   %pa*m^9/mol^3
A=9.7319e-2*atm*l^2;    %pa*m^6/mol^2
b=1.7976e-4*l^2;        %m^6/mol^2
B=1.9041e-2*l;          %m^3/mol
c=-2.4613e2*atm*l^3;    %pa*K^2*m^9/mol^3
C=3.8914e2*atm*l^2;     %pa*K*m^6/mol^2
alpha=-3.4215e-6*l^3;   %m^9/mol^3
gamma=1.89e-3*l^2;      %m^6/mol^2
R= 8.3144621;           % allgemeine Gaskonstante   [J/mol*K]

%% 1. Verdichterstufe
    T=514.1326;           % T nach der 1. Verdichterstufe
    p=6e5;                % p nach der 1. Verdichterstufe
   
  g_1o=@(Z) -Z+1 + (B -(A/(R*T))-(C/T^3))*(p/(Z*R*T)) + (b-(a/(R*T)))*(p/(Z*R*T))^2+((a*alpha)/(R*T))*(p/(Z*R*T))^5+((c*(p/(Z*R*T))^2)/(R*T^3))*(1+gamma*(p/(Z*R*T))^2)*exp(-gamma*(p/(Z*R*T))^2);
    Z0=1;
    Z_1o=fsolve(g_1o,Z0);
 


Dass klappt soweit alles. ich definiere mir die Hilfsfunktion g die dann mit dem fsolve befehl gelöst wird und der Faktor Z_1o ist das Ergebniss. es gilt hier also Z_1o=F(g(Z)).

Ich möchte nun aber den Wert für Z_1o in der Abhängigkeit der Temperatur für jeden Schritt bestimmen lassen. Mein erster Ansatz war daher die Funktion aus den M-file in einem Matlabfunktion block in Simulink zu kopieren und dann T nicht fix vor zu geben, sonders dafür den FunktionsInput T zu verwenden.
Dieser Ansatz hat allerdings nicht geklappt. In der Fehlermeldung wurde gesagt die Funktion g ist unbekannt. Daher wollte ich ich nun g als Subfunktion definieren...
das habe ich dann so gemacht:
Code:

...
Z0=1;
    Z_1i=fsolve(g(T),Z0)
 Verdichterstufen  
end
function  fnk = g(T)
fnk= -Z+1 + (B -(A/(R*T))-(C/T^3))*(p/(Z*R*T)) + (b-(a/(R*T)))*(p/(Z*R*T))^2+((a*alpha)/(R*T))*(p/(Z*R*T))^5+((c*(p/(Z*R*T))^2)/(R*T^3))*(1+gamma*(p/(Z*R*T))^2)*exp(-gamma*(p/(Z*R*T))^2);
 end


Die Fehlermeldung lautet hierbei das Z eine undefinierte Variable ist. Was ja stimmt, da ich Z erst bestimmen lassen möchte.
Da sie aber als Variable in der definierten Funktion g(T) steht möchte Matlab diese auch als Input / Wert haben..

Ich frage mich nun wie ich mir den jeweils von T abhängige Lösung von g(t) also Z von einer Funktion berechnen lassen kann.

Über Anregungen bin ich sehr dankbar, da ich bei dem Umgang mit eigenen Funktionen in Matlab bzw. Simulink bei allem was über das Nutzen von einfachen Matlabfuntion Blöcken hinaus geht unerfahren bin. Grüße


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.03.2014, 19:51     Titel:
  Antworten mit Zitat      
Hallo,

Fehlermeldungen bitte kopieren, nicht übersetzen oder interpretieren.

Da fsolve nicht zur Codegenerierung unterstützt wird, musst du das als extrinsic definieren.

Ich würde sämtliche Parameter in einer Struktur zusammenfassen. Dies erleichtert ggf. die Übergabe.

Am einfachsten dürfte es hier sein, wenn du die Parameter innerhalb von g definierst, also die entsprechenden Zeilen nach unten verschiebst.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
hobbykoch35
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 11.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.03.2014, 09:21     Titel:
  Antworten mit Zitat      
Hallo,
gerenell ist es übersichtlicher wenn ich die Konstanten in einen Struct packe. Generell liegen alle Parameter für das Modell in einem Strct, sodass nur dieser eingelesen werden muss um das Modell zu nutzen, jedoch wollte ich erstmal sehen ob der Teil so funktioniert(was es ja momentan leider noch nicht macht) bevor ich mich an der "optische" mache. Also erst inhalt dann Form Wink

Ja das stimmt selbst interpretierte Fehlermeldungen sind nicht sehr dienlich. Hier also die echten fehlermeldunge:

Übertragung des Codes aus dem M-file in einen M-Function-Block; T als Inputparameter:

This kind of expression is not supported.

Function 'Produktgasspeicher /Realgasfaktor sim' (#45.770.956), line 26, column 10:
"@(Z) -Z+1 + (B -(A/(R*T))-(C/T^3))*(p/(Z*R*T)) + (b-(a/(R*T)))*(p/(Z*R*T))^2+((a"
Launch diagnostic report.

Dann mein Versuch, dass als Subfuntion auf zu rufen:
Hier nochmal der Code(Ich habe mal die Entsprechenden Zahlen vor die Zeilen geschrieben, dass besser ersichtlich ist auf welche sich die Fehler beziehen...):
Code:
function  Z_1i=fun(T)
%Einheiten Umrechnen
atm=1.01325e5; %pa
l=10e-3; %Volumen
%Konstanten
a=-9.2211e-3*atm*l^3;   %pa*m^9/mol^3
A=9.7319e-2*atm*l^2;    %pa*m^6/mol^2
b=1.7976e-4*l^2;        %m^6/mol^2
B=1.9041e-2*l;          %m^3/mol
c=-2.4613e2*atm*l^3;    %pa*K^2*m^9/mol^3
C=3.8914e2*atm*l^2;     %pa*K*m^6/mol^2
alpha=-3.4215e-6*l^3;   %m^9/mol^3
gamma=1.89e-3*l^2;      %m^6/mol^2

p= 1.02925e5             % p vor der 1. Verdichterstufe
Z0=1;

 #25  Z_1i=fsolve(g(T),Z0);
 #26  Z_1i

end
function  fnk = g(T)
 #34  fnk= -Z+1 + (B -(A/(R*T))-(C/T^3))*(p/(Z*R*T)) + (b-(a/(R*T)))*(p/(Z*R*T))^2+((a*alpha)/(R*T))*(p/(Z*R*T))^5+((c*(p/(Z*R*T))^2)/(R*T^3))*(1+gamma*(p/(Z*R*T))^2)*exp(-gamma*(p/(Z*R*T))^2);
 end      
 


Undefined function or variable 'Z'.

Function 'Produktgasspeicher /Realgasfaktor sim' (#45.955.956), line 34, column 7:
"Z"
Launch diagnostic report.

Function call failed.

Function 'Produktgasspeicher /Realgasfaktor sim' (#45.756.760), line 25, column 13:
"g(T)"
Launch diagnostic report.

Undefined function or variable 'Z_1i'. The first assignment to a local variable determines its class.

Function 'Produktgasspeicher /Realgasfaktor sim' (#45.766.770), line 26, column 1:
"Z_1i"
Launch diagnostic report.

Jetzt noch der versuch das ganze mit der Empfohlenden extrinsic Umgebung zu lösen:
Code:
function  Z_1i=fun(T)

Z0=1;
coder.extrinsic('-sync:off','fsolve');

Z_1i=fsolve(g(T),Z0);
Z_1i
%Z_1o=0.9879;
%   Z_1m=(Z_1o+Z_1i)/2;
%   Z_2m=0.9262;
%   Z_3m=1.0585;
 % Z_m=[Z_1m, Z_2m, Z_3m];  % Mittlere Realgasfaktoren für die Verdichterstufen  
end
function  fnk = g(T)
%Einheiten Umrechnen
atm=1.01325e5; %pa
l=10e-3; %Volumen
%Konstanten
a=-9.2211e-3*atm*l^3;   %pa*m^9/mol^3
A=9.7319e-2*atm*l^2;    %pa*m^6/mol^2
b=1.7976e-4*l^2;        %m^6/mol^2
B=1.9041e-2*l;          %m^3/mol
c=-2.4613e2*atm*l^3;    %pa*K^2*m^9/mol^3
C=3.8914e2*atm*l^2;     %pa*K*m^6/mol^2
alpha=-3.4215e-6*l^3;   %m^9/mol^3
gamma=1.89e-3*l^2;      %m^6/mol^2

p= 1.02925e5             % p vor der 1. Verdichterstufe


fnk= -Z+1 + (B -(A/(R*T))-(C/T^3))*(p/(Z*R*T)) + (b-(a/(R*T)))*(p/(Z*R*T))^2+((a*alpha)/(R*T))*(p/(Z*R*T))^5+((c*(p/(Z*R*T))^2)/(R*T^3))*(1+gamma*(p/(Z*R*T))^2)*exp(-gamma*(p/(Z*R*T))^2);
 end      
 


Die Fehler die Dabei auftreffen sind die Gleichen wie der Variante ohjne extrinsic. So wie ich es verstanden habe kann ich mit dem extrinsic Befehl fsolve verwenden. Die Fehler scheinen aber zu sagen das fsolve erst gar nicht aufgerufen und angewandt werden kann da die Funktion g(T) nicht aufgerufen werden kann da diese über die Fehlende Variable Z nicht definneirt ist...
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 31.03.2014, 10:07     Titel:
  Antworten mit Zitat      
Hallo,

Z wird ja auch nirgends definiert.

In deinem allerersten Ansatz hattest du Z als Input der Zielfunktion und T konstant, danach hattest du T als Input der Zielfunktion. Was ist richtig?

Der letzte Ansatz sieht gut aus, allerdings würde ich schreiben:
Code:


Für weitere Hilfe wäre es gut, wenn du das Simulink-Modell anhängen könntest.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
hobbykoch35
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 11.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.03.2014, 12:37     Titel:
  Antworten mit Zitat      
Ich möchte wie gesagt Z berechnen es gilt dabei, dass der Realgasfaktor Z von der Temperatur abhängt. Da in der Berechnungsformel die Z beschreibt, Z selbst enthalten ist und ein Umstellen sehr komplex, wollte ich die Gleichung/Funktion von matlab lösen lassen, dann also der Anstaz mit der Hilfsfunktion g.

g ist nun eine Funktion von Z(und damit von T) jedoch nur weil ich, das ja mit dem Ansatz für fsolve diese so initiiere.

Hört sich jetzt irgendwie koimpliziert an, hofe jedoch dass es verständlich ist.

Ich habe jetzt mal die Modellkomponente angehangen. Diese beinhaltet die problematische Stelle. Im vollständigen Modell soll dann die Temperatur über eine Timeline vorgegeben werden. Der Output der Funktion wird dann für weitere Berechnungen an das Modell übergeben(Anstelle des Displays).

Grüße Sebastian

realgasfaktor_gesondert.slx
 Beschreibung:

Download
 Dateiname:  realgasfaktor_gesondert.slx
 Dateigröße:  14.42 KB
 Heruntergeladen:  418 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
Hört sich jetzt irgendwie koimpliziert an, hofe jedoch dass es verständlich ist.

Mir ist noch nicht 100%ig klar, nach was die Gleichung nun aufgelöst werden soll. Wenn nach Z, dann ist Z Input von g und T muss vorgegeben werden.

Falls für T der Eingang des MATLAB Function Blocks verwendet werden soll, siehe Anhang. R hatte ich aus einem deiner vorherigen Beiträge übernommen.

Grüße,
Harald

realgasfaktor_gesondert.slx
 Beschreibung:

Download
 Dateiname:  realgasfaktor_gesondert.slx
 Dateigröße:  15.16 KB
 Heruntergeladen:  387 mal
g.m
 Beschreibung:

Download
 Dateiname:  g.m
 Dateigröße:  668 Bytes
 Heruntergeladen:  486 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
hobbykoch35
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 11.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.03.2014, 14:45     Titel:
  Antworten mit Zitat      
Entschuldigung,
dass :
1. R mir immer durch die Lappen geht wenn die Funktionen/skripte übertrage
2. ich nicht so konkret das Problem formulieren kann. Anbei mal ein screenshot aus meiner Dokumetation zum Modell in dem ich das auch beschreibe. Ich möchte mit der Formel 3.5 gerne den Faktor Z berechnen. Da jedoch Z sowohl auf der linken als auch rechten Seite der Gleichung steht kann ich es ja mit der Formel nicht berechnen. Hier gilt Z=f(T,p=konst).
Daher habe ich die Formel in Matlab eingegeben. So dann die Hilfsfunktion g erstellt. Dazu habe ich das Z von der linken Seite auf die rechte geholt. Es ergbit sich also g=0=-Z+1+(B.........

In der Simulation möchte ich nun in einem Matlabfunktion Block, in den T als Input geht, den Wert für Z berechnen lassen, also je nach Temperaturwert g mit fsolve lösen und einen neuen Wert von Z bestimmen.

Zu deinem Anhang:
g.m : Die funktion g ist nun von Z und T abhängig . T kommt aus dem Inputport des Matlabfunktion blocks. Ja So würde ich es gern machen.

Ich habe nun den Inhalt aus dem g.m File(ergänzt um den Wert für R) in die Funktion des Funtionblock kopiert. sodass diese dei Funktion g kennt wenn fsolve aufgerufen wird. Beim ausführen ist nun ein weiterer fehler aufgetreten. Dieser ist auch im Anhang...

Fehlermeldung Realgasfaktor.png
 Beschreibung:

Download
 Dateiname:  Fehlermeldung Realgasfaktor.png
 Dateigröße:  16.31 KB
 Heruntergeladen:  449 mal
Formel für Z.png
 Beschreibung:

Download
 Dateiname:  Formel für Z.png
 Dateigröße:  77.43 KB
 Heruntergeladen:  464 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 31.03.2014, 14:57     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Ich habe nun den Inhalt aus dem g.m File(ergänzt um den Wert für R) in die Funktion des Funtionblock kopiert. sodass diese dei Funktion g kennt wenn fsolve aufgerufen wird. Beim ausführen ist nun ein weiterer fehler aufgetreten. Dieser ist auch im Anhang...

Es hatte schon seinen Grund, dass ich g.m als separate Datei angehängt habe: wenn ich es in den MATLAB Function-Block hineinkopiere, habe ich dasselbe Problem wie du.
Deswegen: die beiden Dateien so, wie sie sind, in ein Verzeichnis speichern, und es müsste gehen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
hobbykoch35
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 11.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.03.2014, 15:26     Titel:
  Antworten mit Zitat      
Ja es klappt!!!

Vielen Dank! Für die sehr gute Beratung und Hilfe. Was ich mich allerdings frage ist, warum es nur klappt wenn es in einem extra matfile liegt und nicht wenn die Funktion in der Überfunktion intern gespeichert ist. Für den Fall, dass ich sowas nochmal nutzen möchte, weiß ich ja jetzt bescheid.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 31.03.2014, 15:36     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Was ich mich allerdings frage ist, warum es nur klappt wenn es in einem extra matfile liegt und nicht wenn die Funktion in der Überfunktion intern gespeichert ist.

In MATLAB Function Blocks können im Zusammenhang mit extrinsic functions keine Function Handles verwendet werden, weshalb ich die Funktion als String übergeben habe ('g'). Wenn das aber nun an fsolve übergeben wird, dann besteht für fsolve keine Möglichkeit mehr, die lokale Funktion g im MATLAB Function Block einzusehen. Deswegen habe ich das in einer separaten .m-Datei gespeichert.

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 - 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.