|
|
fsolve in matlab funktion block nutzen |
|
Gast |
|
|
Beiträge: ---
|
|
|
|
Anmeldedatum: ---
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 29.03.2014, 13:10
Titel: fsolve in matlab funktion block nutzen
|
|
|
|
|
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:
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:
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
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 29.03.2014, 19:51
Titel:
|
|
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
|
|
|
hobbykoch35 |
Forum-Anfänger
|
|
Beiträge: 14
|
|
|
|
Anmeldedatum: 11.10.13
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 31.03.2014, 09:21
Titel:
|
|
|
|
|
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
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...):
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:
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...
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 31.03.2014, 10:07
Titel:
|
|
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:
Für weitere Hilfe wäre es gut, wenn du das Simulink-Modell anhängen könntest.
Grüße,
Harald
|
|
|
hobbykoch35 |
Forum-Anfänger
|
|
Beiträge: 14
|
|
|
|
Anmeldedatum: 11.10.13
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 31.03.2014, 12:37
Titel:
|
|
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
Beschreibung: |
|
Download |
Dateiname: |
realgasfaktor_gesondert.slx |
Dateigröße: |
14.42 KB |
Heruntergeladen: |
418 mal |
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 31.03.2014, 13:06
Titel:
|
|
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
Beschreibung: |
|
Download |
Dateiname: |
realgasfaktor_gesondert.slx |
Dateigröße: |
15.16 KB |
Heruntergeladen: |
387 mal |
Beschreibung: |
|
Download |
Dateiname: |
g.m |
Dateigröße: |
668 Bytes |
Heruntergeladen: |
486 mal |
|
|
|
hobbykoch35 |
Forum-Anfänger
|
|
Beiträge: 14
|
|
|
|
Anmeldedatum: 11.10.13
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 31.03.2014, 14:45
Titel:
|
|
|
|
|
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...
Beschreibung: |
|
Download |
Dateiname: |
Fehlermeldung Realgasfaktor.png |
Dateigröße: |
16.31 KB |
Heruntergeladen: |
449 mal |
Beschreibung: |
|
Download |
Dateiname: |
Formel für Z.png |
Dateigröße: |
77.43 KB |
Heruntergeladen: |
464 mal |
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 31.03.2014, 14:57
Titel:
|
|
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
|
|
|
hobbykoch35 |
Forum-Anfänger
|
|
Beiträge: 14
|
|
|
|
Anmeldedatum: 11.10.13
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 31.03.2014, 15:26
Titel:
|
|
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.
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 31.03.2014, 15:36
Titel:
|
|
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
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
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
| 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.
|
|