Note
Go to the end to download the full example code.
Arrhenius and Ostwald: a catalyst speeds a reaction but leaves its equilibrium alone#
Arrhenius’s \(k = Ae^{-E_a/RT}\) explains why a catalyst’s lower
activation energy multiplies the rate by \(e^{\Delta E_a/RT}\)
(compare_catalyzed_rate()).
Ostwald’s definition adds the key condition that a catalyst cannot move
the equilibrium. It lowers the barrier for the forward and the reverse
reaction by the same amount, so both rate constants grow by the same
factor and \(K = k_f/k_r\) does not change. Below, the reversible
reaction \(A \rightleftharpoons B\) reaches equilibrium far sooner
with the catalyst, and it reaches exactly the same equilibrium.
import matplotlib.pyplot as plt
import numpy as np
from chemistrykit.surface.systems.catalysis import compare_catalyzed_rate
T = 298.15
Ea_forward, delta_H = 100.0e3, -20.0e3 # J/mol; reverse barrier is Ea_forward - delta_H
Rate enhancement grows exponentially with the activation-energy drop.
delta_Ea_values = np.linspace(0.0, 50e3, 26)
enhancements = [compare_catalyzed_rate(Ea_forward, Ea_forward - d, T, A_uncatalyzed=1e13).rate_enhancement for d in delta_Ea_values]
print(f"Lowering Ea by 30 kJ/mol at {T} K speeds the reaction up {enhancements[15]:.2e}-fold")
Lowering Ea by 30 kJ/mol at 298.15 K speeds the reaction up 1.80e+05-fold
Ostwald: the same barrier drop for forward and reverse steps.
delta_Ea = 30e3
fwd = compare_catalyzed_rate(Ea_forward, Ea_forward - delta_Ea, T, A_uncatalyzed=1e13)
rev = compare_catalyzed_rate(Ea_forward - delta_H, Ea_forward - delta_H - delta_Ea, T, A_uncatalyzed=1e13)
K_uncat = fwd.k_uncatalyzed / rev.k_uncatalyzed
K_cat = fwd.k_catalyzed / rev.k_catalyzed
print(f"Forward enhancement {fwd.rate_enhancement:.3e}, reverse enhancement {rev.rate_enhancement:.3e}")
print(f"K without catalyst = {K_uncat:.4f}, K with catalyst = {K_cat:.4f}")
def approach(kf, kr, t, A0=1.0):
A_eq = A0 * kr / (kf + kr)
return A_eq + (A0 - A_eq) * np.exp(-(kf + kr) * t)
t_cat = np.linspace(0.0, 5.0 / (fwd.k_catalyzed + rev.k_catalyzed), 300)
t_uncat = t_cat * fwd.rate_enhancement
Forward enhancement 1.802e+05, reverse enhancement 1.802e+05
K without catalyst = 3190.4240, K with catalyst = 3190.4240
fig, axes = plt.subplots(1, 3, figsize=(15, 4))
axes[0].semilogy(delta_Ea_values / 1e3, enhancements, "o-")
axes[0].set_xlabel(r"$\Delta E_a$ (kJ/mol)")
axes[0].set_ylabel(r"$k_{cat}/k_{uncat}$")
axes[0].set_title("Arrhenius: exponential rate enhancement")
axes[1].plot(t_cat, approach(fwd.k_catalyzed, rev.k_catalyzed, t_cat), label="catalyzed")
axes[1].plot(t_cat, approach(fwd.k_uncatalyzed, rev.k_uncatalyzed, t_cat), label="uncatalyzed")
axes[1].set_xlabel("time (s)")
axes[1].set_ylabel("[A] / [A]$_0$")
axes[1].set_title("Same time axis: only the catalyzed run moves")
axes[1].legend()
axes[2].plot(t_cat / t_cat[-1], approach(fwd.k_catalyzed, rev.k_catalyzed, t_cat), label="catalyzed")
axes[2].plot(t_uncat / t_uncat[-1], approach(fwd.k_uncatalyzed, rev.k_uncatalyzed, t_uncat), "--", label="uncatalyzed (time rescaled)")
axes[2].axhline(1.0 / (1.0 + K_cat), color="gray", linewidth=0.8)
axes[2].set_xlabel("time / run length")
axes[2].set_ylabel("[A] / [A]$_0$")
axes[2].set_title("Ostwald: identical equilibrium")
axes[2].legend()
plt.tight_layout()
plt.show()

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