Note
Go to the end to download the full example code.
The Eley-Rideal mechanism: a gas molecule strikes an adsorbed one#
In the Eley-Rideal mechanism (Eley and Rideal, 1940) only reactant A
adsorbs. B reacts with adsorbed A straight from the gas phase, so the
rate is \(k\theta_AP_B\)
(er_rate()). A and B never
compete for sites, so raising \(P_A\) can only help: the rate rises
and levels off, and it stays first order in \(P_B\). In the dual-site
Langmuir-Hinshelwood mechanism
(lh_rate_dual_site()),
too much A pushes B off the surface and the rate turns over. That
difference is the standard kinetic test for telling the two mechanisms
apart.
import matplotlib.pyplot as plt
import numpy as np
from chemistrykit.surface.systems.eley_rideal import er_rate
from chemistrykit.surface.systems.langmuir_hinshelwood import lh_rate_dual_site
k, K_A, K_B, P_B = 4.0, 2.0, 5.0, 0.2
P_A = np.linspace(0.001, 20.0, 400)
rate_er = er_rate(k, K_A, P_A, P_B)
rate_lh = lh_rate_dual_site(k, K_A, P_A, K_B, P_B)
print(f"Eley-Rideal rate is monotonic in P_A: {bool(np.all(np.diff(rate_er) > 0))}")
print(f"Eley-Rideal saturates at k*P_B = {k * P_B:.2f}; at P_A=20: {rate_er[-1]:.3f}")
print(f"Langmuir-Hinshelwood peaks at P_A = {P_A[np.argmax(rate_lh)]:.3f}, then falls")
Eley-Rideal rate is monotonic in P_A: True
Eley-Rideal saturates at k*P_B = 0.80; at P_A=20: 0.780
Langmuir-Hinshelwood peaks at P_A = 1.003, then falls
fig, axes = plt.subplots(1, 2, figsize=(11, 4))
axes[0].plot(P_A, rate_er / rate_er.max(), label="Eley-Rideal")
axes[0].plot(P_A, rate_lh / rate_lh.max(), label="Langmuir-Hinshelwood")
axes[0].set_xlabel("$P_A$")
axes[0].set_ylabel("rate (normalized)")
axes[0].set_title("Rate vs. pressure of adsorbed reactant A")
axes[0].legend()
axes[1].plot(P_B_scan, er_vs_B / er_vs_B.max(), label="Eley-Rideal: first order in $P_B$")
axes[1].plot(P_B_scan, lh_vs_B / lh_vs_B.max(), label="Langmuir-Hinshelwood")
axes[1].set_xlabel("$P_B$")
axes[1].set_ylabel("rate (normalized)")
axes[1].set_title("Rate vs. pressure of gas-phase reactant B")
axes[1].legend()
plt.tight_layout()
plt.show()

Total running time of the script: (0 minutes 0.072 seconds)