Baeyer’s strain theory: angle strain in planar cycloalkane rings#

Adolf von Baeyer (1885) combined van’t Hoff’s tetrahedral carbon with the assumption that rings are flat. A planar ring of \(n\) carbons has interior angles \(180^\circ(n-2)/n\), so each bond must bend away from the tetrahedral 109.47 degrees by

\[\delta(n) = \tfrac{1}{2}\left[109.47^\circ - \frac{180^\circ\,(n-2)}{n}\right].\]

The theory correctly explains why three- and four-membered rings are strained and five- and six-membered rings are common. It wrongly predicts growing strain for larger rings: real rings pucker. This example computes Baeyer’s \(\delta(n)\) with baeyer_angle_strain(), compares it with measured strain energies, and builds a chair cyclohexane whose angles are exactly tetrahedral.

import matplotlib.pyplot as plt
import numpy as np

from chemistrykit.structure.core.base_system import Molecule, angle_between
from chemistrykit.structure.systems.ring_strain import TETRAHEDRAL_ANGLE, baeyer_angle_strain, chair_cyclohexane_coordinates, planar_ring_angle
from chemistrykit.structure.visualizers.structure_plots import plot_molecule_3d

sizes = np.arange(3, 9)
# Total ring strain energies of the cycloalkanes (CH2)n from heats of
# combustion, kJ/mol (standard textbook values).
measured_strain = {3: 115.0, 4: 110.0, 5: 26.0, 6: 0.0, 7: 26.0, 8: 40.0}

for n in sizes:
    d = baeyer_angle_strain(int(n))
    angle = planar_ring_angle(int(n))
    strain = measured_strain[int(n)]
    print(f"C{n}H{2 * n}: planar angle {angle:6.2f} deg, Baeyer strain {d:+6.2f} deg/bond, measured ring strain {strain:5.0f} kJ/mol")
C3H6: planar angle  60.00 deg, Baeyer strain +24.74 deg/bond, measured ring strain   115 kJ/mol
C4H8: planar angle  90.00 deg, Baeyer strain  +9.74 deg/bond, measured ring strain   110 kJ/mol
C5H10: planar angle 108.00 deg, Baeyer strain  +0.74 deg/bond, measured ring strain    26 kJ/mol
C6H12: planar angle 120.00 deg, Baeyer strain  -5.26 deg/bond, measured ring strain     0 kJ/mol
C7H14: planar angle 128.57 deg, Baeyer strain  -9.55 deg/bond, measured ring strain    26 kJ/mol
C8H16: planar angle 135.00 deg, Baeyer strain -12.76 deg/bond, measured ring strain    40 kJ/mol

Baeyer’s cyclohexane, if planar, would have 120 degree angles and a strain of -5.26 degrees per bond. The chair form removes it entirely: every C-C-C angle is tetrahedral.

chair = chair_cyclohexane_coordinates(bond_length=1.54)
angles = [angle_between(chair[k - 1] - chair[k], chair[(k + 1) % 6] - chair[k]) for k in range(6)]
print(f"\nchair cyclohexane C-C-C angles: {np.round(angles, 4)} (tetrahedral = {TETRAHEDRAL_ANGLE:.4f})")
assert np.allclose(angles, TETRAHEDRAL_ANGLE)
chair cyclohexane C-C-C angles: [109.4712 109.4712 109.4712 109.4712 109.4712 109.4712] (tetrahedral = 109.4712)
fig = plt.figure(figsize=(12, 4.5))
ax1 = fig.add_subplot(1, 2, 1)
ax1.bar(sizes - 0.2, [baeyer_angle_strain(int(n)) for n in sizes], width=0.4, color="C0", label="Baeyer angle strain (deg/bond)")
ax1.axhline(0.0, color="gray", linewidth=0.8)
ax1.set_xlabel("ring size n")
ax1.set_ylabel("Baeyer strain (degrees per bond)", color="C0")
ax1b = ax1.twinx()
ax1b.bar(sizes + 0.2, [measured_strain[int(n)] for n in sizes], width=0.4, color="C1", label="measured strain energy")
ax1b.set_ylabel("measured ring strain (kJ/mol)", color="C1")
ax1.set_title("Baeyer's planar-ring prediction vs experiment")

ax2 = fig.add_subplot(1, 2, 2, projection="3d")
ring = Molecule(symbols=["C"] * 6, coordinates=chair, bonds=[(k, (k + 1) % 6) for k in range(6)])
plot_molecule_3d(ring, ax=ax2)
ax2.set_title("Chair cyclohexane: puckered, no angle strain")
fig.tight_layout()
plt.show()
Baeyer's planar-ring prediction vs experiment, Chair cyclohexane: puckered, no angle strain

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

Gallery generated by Sphinx-Gallery