Wert aus einer Menge benutzen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
adr1an0
User
Beiträge: 10
Registriert: Sonntag 13. Januar 2019, 13:52

Hallo,

ich möchte gerade den Luftbedarf für eine Verbrennung ermitteln. Und dazu muss ich auf einzelne Komponenten meines Gasgemisches zugreifen können.

Mein Erdgas besteht aus ca 88% Methan, 7% Ethan usw. und wird in Python mit Hife von Cantera so %anteilig definiert:

gasH.Y = { 'CH4':0.8866, 'C2H6':0.0685,'C3H8':0.0101, \
'CO2':0.0101, 'O2':0.0001, 'N2':0.0133}

Jetzt möchte ich die 0,8866 mit 2 multiplizieren um den Sauerstoffbedarf für Methan zu rechnen.

O2_Bedarf = 2 * 0,8866 = 1,77. Das funktioniert natürlich.

Wie kann ich das automatisch mit Bezug auf den ersten Eintrag von gasH programmieren ? Ich habe nach einen Befehl gesucht aber keinen gefunden.
Ich würde gerne so etwas haben .

O2_Bedarf = gasH(1_1) * 2 + gasH(1_2) * 3,5 + gasH(1_3) *5
gasH(1_1) sollte den Wert 0,8866 haben.
gasH(1_2) sollte dann den Wert 0,0685 haben.
gasH(1_3) sollte dann den Wert 0,0101 haben.

Welche Befehle kann man da nehmen ?

Gruß
Adrian
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

gasH.Y ist ein Dictionary, man erhält die Werte über den Schlüssel:

o2_bedarf = gasH.Y['CH4'] * 2 + gasH.Y['C2H6'] * 3.5 + gasH.Y['C3H8'] * 5
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
adr1an0
User
Beiträge: 10
Registriert: Sonntag 13. Januar 2019, 13:52

Danke für die schnelle Antwort.

Leider kommt da ein Syntaxfehler ...
o2_bedarf = gasH.Y['CH4'] * 2 + gasH.Y['C2H6'] * 3.5 + gasH.Y['C3H8'] * 5
IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices



auch bei der Abfrage kommt da eine Syntaxmeldung:
print (gasH.Y['CH4'])
IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices

und bei runden Klammern...
print (gasH.Y('CH4'))
TypeError: 'numpy.ndarray' object is not callable
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist kein SyntaxFehler. Das ist ein IndexError. Und das ist nicht Korinthenkackerei, sondern wichtig sowas zu unterscheiden. Das eine sagt 'der Interpreter hat keine Ahnung was du von ihm willst. Das andere sagt, dass du einen Fehler in der Angabe des Index machst.

Und einfach Klammern durchzuraten ist auch nicht wirklich hilfreich.

Laut Fehlermeldung versuchst du mit einem String ( zb 'CH4') auf ein numpy.array zuzugreifen, das aber nur Zahlen, Bereiche oder andere Arrays zulaesst. Was ja auch Sinn macht, es ist ja eine Tabelle.

Was genau ist das fuer eine Bibliothek? Und was ist die Ausgabe von

Code: Alles auswählen

print(gasH.Y)
nachdem du die wie von dir oben gezeigt mit deinem Gasgemisch-Woerterbuch gefuettert hast?
adr1an0
User
Beiträge: 10
Registriert: Sonntag 13. Januar 2019, 13:52

Das ist eine Bibliothek wo mein Gas als eine "Solution" gespeichert wird.

print (gasH.Y)
[0.00000000e+00 0.00000000e+00 0.00000000e+00 1.01142915e-04
0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00
0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00
0.00000000e+00 8.96733084e-01 0.00000000e+00 1.02154344e-02
0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00
0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00
0.00000000e+00 0.00000000e+00 6.92828967e-02 0.00000000e+00
0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00
0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00
0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00
0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00
0.00000000e+00 0.00000000e+00 0.00000000e+00 1.34520077e-02
0.00000000e+00 0.00000000e+00 1.02154344e-02 0.00000000e+00
0.00000000e+00]

Viele Einträge sind 0, weil Cantera ein Gas nie als 100% rein sieht sondern immer mit kleine Verunreinigengen. Ich habe aber explizit mein Gas definiert und deswegen kommen auch nur 6 Einträge vor die nicht 0 sind.

mit gasH.X werden die (Molanteile) Massenanteile angegeben
mit gasH.Y werden die Voluemnanteile in % angeben.

Das heißt gasH.Y besteht aus 88% Methan, 6,8% Ethan, etc...
adr1an0
User
Beiträge: 10
Registriert: Sonntag 13. Januar 2019, 13:52

oder gibt es eine andere Möglichkeit eine Art Tabelle zu erstellen wo man sich dann mit einen Befehl eine bestimmte Zelle abrufen kann ? wie zB bei Excel,, Zelle D6 + G7 = ... ?
Benutzeravatar
__blackjack__
User
Beiträge: 13080
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@adr1an0: Also wenn sich das dermassen komisch verhält, das man dem Attribut `Y` ein Wörterbuch zuweist, dann aber danach beim Zugriff ein Numpy-Array erhält, kann man Deine Fragen nicht ohne Kenntnisse/Dokumentation zu der tatsächlich verwendeten Bibliothek beantworten. Was Code *bedeutet* hängt letztlich ja nicht von der Syntax ab, sondern was die Syntax im Zusammenspiel mit den verwendeten Datentypen bedeutet. Diese Bedeutung legen die Leute fest, die die Datentypen programmiert haben.

Hier sieht das jetzt also so aus, dass Du von einer Zeichenkette die einer chemischen Strukturformel ähnlich sieht, zu einem Indexwert kommen musst, über den Du dann auf den Volumenanteil zugreifen kannst. Ich vermute mal die Bibliothek wird da irgend etwas anbieten um diesen Weg zu ermöglichen, aber das musst Du schon selbst wissen/heraus finden, oder mindestens mal verraten wo man die Dokumentation finden kann und was `gasH` für ein Datentyp ist.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich finde die Bibliothek etwas verwirrend. Das mag aber am fehlenden Domaenen-Wissen liegen. Laut https://cantera.org/tutorials/python-tutorial.html koennte es sein, dass der Zugriff direkt ueber das Gas erfolgt:

Code: Alles auswählen

gasH['CH4'].Y
So zumindest lese ich das. Und hier https://cantera.org/documentation/docs- ... ction_dict steht, dass es Methoden

mass_fraction_dict

und

mole_fraction_dict

gibt, welche dir wieder das Dictionary zurueck geben:

Code: Alles auswählen

gas1.mole_fraction_dict()['CH4']
adr1an0
User
Beiträge: 10
Registriert: Sonntag 13. Januar 2019, 13:52

Ich habe mich wirklich durch die Cantera Documentatin durchgelesen, aber es ist sehr umfassend, und ich finde mich da echt nicht zurecht.

@__deets__ danke danke danke... beide "Befehle" sind richtig und ich komme damit weiter... vielen vielen Dank..

gas['CH4'].X
Out[8]: array([0.8239])

gas.mole_fraction_dict()['CH4']
Out[9]: 0.8239

Gruß
Adrian
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

adr1an0 hat geschrieben: Freitag 15. Februar 2019, 11:56 ich möchte gerade den Luftbedarf für eine Verbrennung ermitteln. Und dazu muss ich auf einzelne Komponenten meines Gasgemisches zugreifen können.
Nach einem schnellen Blick scheint mir Cantera eine Bibliothek zur Kinetik chemischer Reaktionen zu sein. Deine Frage aber betrifft die Stöchiometrie. Und die Zusammensetzung des Gasgemisches kennst Du bereits (der Input als dict an Cantera). Was Du jetzt ausliest ist nichts anderes als der Input.
Antworten