#!/usr/bin/env python
# coding: utf-8
# ## Beispiel 4.2: Berechnung von Gleichgewichtskonstanten
# _(Dieses Beispiel finden Sie im Lehrbuch auf Seite 42)_
# In diesem Berechnungsbeispiel sollen exemplarisch die thermodynamische Gleichgewichtskonstante K$°$ sowie die spezielle Gleichgewichtskonstante K$_{x}$ für die Ammoniaksynthese berechnet werden. Die erforderlichen Gleichungen (4.1) bis (4.15) sind auf den Seiten 37 bis 43 beschrieben.
# ---
# ### Laden der benötigten Pakete
# Innerhalb dieses Beispiels werden die Pakete _numpy_ und _matplotlib.pyplot_ benötigt. Während _numpy_ wichtige Rechenoperationen und Funktionalitäten bereitstellt, werden mit Hilfe des Pakets _matplotlib.pyplot_ die Ergebnisse grafisch dargestellt.
# In[1]:
import numpy as np
import matplotlib.pyplot as plt
# ---
# ### Definition der Arrays
# Zuerst müssen die jeweiligen Arrays initialisiert werden.
# Die Komponenten Stickstoff (N2), Wasserstoff (H2) und Ammoniak (NH3) werden mit den Indizes 0, 1 und 2 beschrieben.
# In[2]:
comps = np.linspace(0,2,3) # 0: N_2, 1: H_2, 2: NH_3
nu = np.array((comps))
cp = np.array((comps))
H_f = np.array((comps))
S_g = np.array((comps))
# ---
# ### Definition der Konstanten
# #### Stöchiometrische Koeffizienten
# Die stöchiometrischen Koeffizienten $\nu_i$ können in der Reaktionsgleichung (Tabelle 4.1, Seite 38) abgelesen werden:
# N2 + 3 H2 ⇌ 2 NH3
# Während die stöchiometrischen Koeffizienten der Edukte ein negatives Vorzeichen erhalten, ist das Vorzeichen der Produkte positiv.
# In[3]:
nu[0] = -1 # N_2
nu[1] = -3 # H_2
nu[2] = 2 # NH_3
# #### Thermodynamische Daten
# Außerdem werden für die Berechnung einige thermodynamische Daten benötigt, welche folgender Quelle entnommen wurden: https://webbook.nist.gov/chemistry (2017)
# ##### Wärmekapazität $c_\mathrm{p}$
# In[4]:
cp[0] = 29.1 # J / (mol * K)
cp[1] = 28.8 # J / (mol * K)
cp[2] = 35.1 # J / (mol * K)
# ##### Bildungsenthalpie $H_\mathrm{f}$
# In[5]:
H_f[0] = 0 # J / (mol)
H_f[1] = 0 # J / (mol)
H_f[2] = -45.9e3 # J / (mol)
# ##### Entropie $S$
# In[6]:
S_g[0] = 191.61 # J / (mol * K)
S_g[1] = 130.68 # J / (mol * K)
S_g[2] = 192.77 # J / (mol * K)
# ##### Referenztemperatur T$°$, Referenzdruck p$°$ sowie universelle Gaskonstante R
# In[7]:
T_S = 298.15 # K
p_S = 1e5 # Pa
R = 8.314 # J (mol * K)
# ---
# ### Berechnung der Reaktionsdaten
# Die Wärmekapazität $\Delta_\mathrm{R}c_\mathrm{p}$ (Gleichung 4.5), die Reaktionsenthalpie $\Delta_\mathrm{R}H$ (Gleichung 4.1) und die Reaktionsentropie $\Delta_\mathrm{R}S$ (Gleichung 4.11) unter Standardbedingungen sind das Skalarprodukt (_numpy_-Funktion _np.dot()_) aus den thermodynamischen Daten und den stöchiometrischen Koeffizienten.
# In[8]:
Delta_R_cp_S = np.dot(nu,cp) # J / (mol * K)
Delta_R_H_S = np.dot(nu,H_f) # J / (mol * K)
Delta_R_S_S = np.dot(nu,S_g) # J / (mol * K)
# ---
# ### Definition der temperaturabhängigen Funktionen
# Im weiteren Verlauf müssen die temperaturabhängigen Funktionen für die Reaktionsenthalpie $\Delta_\mathrm{R}H(T)$ (Gleichung 4.4), die Reaktionsentropie $\Delta_\mathrm{R}S(T)$ (Gleichung 4.10) sowie für die freie Reaktionsenthalpie $\Delta_\mathrm{R}G(T)$ (Gleichung 4.9) definiert werden.
# In[9]:
def Delta_R_H(T):
return (Delta_R_H_S + Delta_R_cp_S * (T - T_S))
def Delta_R_S(T):
return (Delta_R_S_S + Delta_R_cp_S * np.log(T/T_S))
def Delta_R_G(T):
return( Delta_R_H(T) - T * Delta_R_S(T))
# ### Definition der Gleichgewichtskonstanten
# Die thermodynamische Gleichgewichtskonstante K$°$ berechnet sich nach Gleichung (4.12).
# In[10]:
def K_S(T):
return( np.exp( -Delta_R_G(T) / (R * T) ) )
# Für die spezielle Gleichgewichtskonstante K$_{x}$ kann Gleichung (4.14) herangezogen werden.
# In[11]:
def K_x(T,p):
return (K_S(T) * (p/p_S)**2)
# ---
# ### Darstellung der Ergebnisse
# Für die Darstellung der Ergebnisse muss der zu betrachtende Temperaturbereich $T_\mathrm{range}$ angegeben werden. In diesem Fall ist dies der Bereich von 400 °C bis 500 °C in Schritten von 1 K.
# In[12]:
T_range = np.linspace(273.15 + 400, 273.15 + 500, 101) # K
# Anschließend werden die Funktionen über die Temperatur mit Hilfe des Pakets _matplotlib.pyplot_ dargestellt.
# In[13]:
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12,5))
ax1.plot(T_range-273.15, K_S(T_range)*1e4, color='black')
ax1.set_xlabel("T / °C")
ax1.set_ylabel("K$°$ $\cdot 10^{4}$ / 1")
ax1.set_xlim(400,500)
ax1.set_ylim(0,1.5)
ax2.plot(T_range-273.15, K_x(T_range, 100e5), color='black', linestyle='dotted', label="100 bar")
ax2.plot(T_range-273.15, K_x(T_range, 200e5), color='black', linestyle='dashed', label="200 bar")
ax2.plot(T_range-273.15, K_x(T_range, 300e5), color='black', linestyle='solid', label="300 bar")
ax2.set_xlabel("T / °C")
ax2.set_ylabel("K$_{x}$ / 1")
ax2.set_xlim(400,500)
ax2.set_ylim(0,14)
ax2.legend(loc='best')
plt.show()
# Die Berechnungsergebnisse sind ebenfalls im Lehrbuch in Abbildung 4.1 auf Seite 43 dargestellt.