Note
Go to the end to download the full example code.
Flory-Stockmayer gelation: the gel point of a branching polymerization#
With trifunctional or higher monomers, step-growth polymerization builds
branched molecules that link into a sample-spanning network at a sharp
gel point. For self-condensation of an \(A_f\) monomer, Flory (1941)
and Stockmayer (1943) found the weight-average degree of polymerization
\(\bar X_w=(1+p)/(1-(f-1)p)\)
(branching_weight_average_DP())
diverges at \(p_c=1/(f-1)\)
(flory_stockmayer_gel_point())
while the number average
(branching_number_average_DP())
stays finite. Carothers’s criterion \(\bar X_n\to\infty\),
\(p_c=2/f\) (carothers_gel_point()),
overestimates the gel point; experiments fall between the two.
import matplotlib.pyplot as plt
import numpy as np
from chemistrykit.polymer.systems.gelation import (
branching_number_average_DP,
branching_weight_average_DP,
carothers_gel_point,
flory_stockmayer_gel_point,
)
for f in (2, 3, 4, 6):
pc = flory_stockmayer_gel_point(f)
Xn_gel = branching_number_average_DP(min(pc, 0.999), f)
print(f"f = {f}: Flory-Stockmayer p_c = {pc:.3f}, Carothers p_c = {carothers_gel_point(f):.3f}, Xn at p_c = {Xn_gel:.2f}")
f = 2: Flory-Stockmayer p_c = 1.000, Carothers p_c = 1.000, Xn at p_c = 1000.00
f = 3: Flory-Stockmayer p_c = 0.500, Carothers p_c = 0.667, Xn at p_c = 4.00
f = 4: Flory-Stockmayer p_c = 0.333, Carothers p_c = 0.500, Xn at p_c = 3.00
f = 6: Flory-Stockmayer p_c = 0.200, Carothers p_c = 0.333, Xn at p_c = 2.50
f = 3
pc = flory_stockmayer_gel_point(f)
p = np.linspace(0, pc - 1e-3, 400)
fig, axes = plt.subplots(1, 2, figsize=(11, 4.2))
axes[0].semilogy(p, branching_weight_average_DP(p, f), label=r"$\bar X_w$ (diverges)")
axes[0].semilogy(p, branching_number_average_DP(p, f), label=r"$\bar X_n$ (finite)")
axes[0].axvline(pc, color="k", ls="--", lw=0.8, label=f"Flory-Stockmayer $p_c$ = {pc:.2f}")
axes[0].axvline(carothers_gel_point(f), color="crimson", ls=":", label=f"Carothers $p_c$ = {carothers_gel_point(f):.2f}")
axes[0].set_xlabel("extent of reaction p")
axes[0].set_ylabel("degree of polymerization")
axes[0].set_title("A$_3$ self-condensation")
axes[0].legend()
fs = np.linspace(2.05, 8, 100)
axes[1].plot(fs, flory_stockmayer_gel_point(fs), label="Flory-Stockmayer 1/(f-1)")
axes[1].plot(fs, carothers_gel_point(fs), "--", label="Carothers 2/f")
axes[1].set_xlabel("functionality f")
axes[1].set_ylabel("gel point $p_c$")
axes[1].set_title("Gel point vs. functionality")
axes[1].legend()
plt.tight_layout()
plt.show()

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