In Chapter 2, starting from the linear combination of atomic orbitals (LCAO method), we extended the description of electronic states from molecular orbital theory through the tight-binding approximation to band theory. However, that discussion assumed relatively simple systems centered on s and p orbitals, and did not touch on the properties of d orbitals, which are characteristic of transition metals.
In this chapter, we study how the energy of d orbitals splits when a transition metal ion is surrounded by ligands (molecules or ions that donate electron pairs to the metal), forming a complex. Our starting point is crystal field theory (CFT), which treats ligands as simple point charges and explains the splitting of the d orbitals purely through electrostatic interaction. CFT offers a clear physical picture and is a powerful starting point for intuitively understanding the d-orbital splitting patterns associated with different coordination geometries, such as octahedral and tetrahedral.
Next, we introduce the more precise ligand field theory (LFT), which incorporates the covalent character of the metal-ligand bond by extending the LCAO method and molecular orbital theory ideas from Chapter 2. We then learn about the Jahn-Teller effect, in which the structure of a complex distorts when its d orbitals are unequally occupied, and finally use Python to quantitatively compute the magnetism and optical absorption spectrum (color) of complexes that arise from d-orbital splitting.
Through this chapter, we hope you will come to appreciate how the seemingly complex electronic states of d orbitals can be organized remarkably systematically along the single axis of symmetry.
Reading time: 30-35 minutes | Difficulty: Intermediate | Code examples: 12
← Chapter 2 | Series Index | Chapter 4 →
Transition metal ions form complexes surrounded by ligands. The number of ligands directly bonded to the metal ion within a complex is called the coordination number, and the six-coordinate octahedral complex is the most common.
Crystal field theory (CFT) is an approximate model that treats ligands as negative point charges (or ionic dipoles) arranged around the metal ion, and explains the energy splitting of the d orbitals purely through the electrostatic repulsion (Coulomb interaction) between the d electrons and the ligand electrons. It originated in 1929 with Hans Bethe's work on the splitting of ionic energy levels in crystals, and was applied to coordination chemistry in the 1930s by John Van Vleck and others.
In an isolated, gas-phase metal ion, all five d orbitals ($d_{z^2}, d_{x^2-y^2}, d_{xy}, d_{xz}, d_{yz}$) have the same energy (five-fold degeneracy). However, when ligands approach the metal ion with a particular symmetry, the magnitude of repulsion from the ligands' negative charge differs from orbital to orbital, depending on the spatial extent (lobe orientation) of each d orbital. As a result, the five degenerate d orbitals split into multiple energy levels according to the symmetry of the coordination geometry.
The electrostatic potential exerted on a d electron (at position $\mathbf{r}$) by $N$ point-charge ligands (charge $q_i$, position $\mathbf{R}_i$). Expanding this expression in spherical harmonics reveals angle-dependent terms determined by the symmetry of the coordination geometry, and these terms produce the energy differences among the d orbitals (crystal field splitting).
To build a concrete picture of which directions the d-orbital lobes point in, let's visualize the angular part of the five d orbitals in three dimensions.
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
theta = np.linspace(0, np.pi, 60)
phi = np.linspace(0, 2 * np.pi, 60)
theta, phi = np.meshgrid(theta, phi)
def dz2(theta, phi):
"""Angular part of the dz2 orbital (before normalization)"""
return 3 * np.cos(theta)**2 - 1
def dxz(theta, phi):
return np.sin(theta) * np.cos(theta) * np.cos(phi)
def dyz(theta, phi):
return np.sin(theta) * np.cos(theta) * np.sin(phi)
def dxy(theta, phi):
return np.sin(theta)**2 * np.sin(2 * phi)
def dx2y2(theta, phi):
return np.sin(theta)**2 * np.cos(2 * phi)
orbitals = {
'd_z^2': dz2, 'd_xz': dxz, 'd_yz': dyz,
'd_xy': dxy, 'd_x^2-y^2': dx2y2,
}
fig = plt.figure(figsize=(16, 4))
for i, (name, func) in enumerate(orbitals.items()):
f = func(theta, phi)
r = np.abs(f) # radial component representing the lobe shape
x = r * np.sin(theta) * np.cos(phi)
y = r * np.sin(theta) * np.sin(phi)
z = r * np.cos(theta)
ax = fig.add_subplot(1, 5, i + 1, projection='3d')
colors = np.where(f >= 0, 'crimson', 'royalblue') # color-coded by the sign of the wavefunction
ax.plot_surface(x, y, z, facecolors=colors, linewidth=0, antialiased=True)
ax.set_title(name)
ax.set_box_aspect([1, 1, 1])
ax.set_axis_off()
plt.tight_layout()
plt.savefig('d_orbitals_3d.png', dpi=200)
plt.show()
print("Generated 3D plots of the angular parts of the five d orbitals.")
print("d_z^2, d_x^2-y^2 (eg orbitals): lobes point directly along the coordinate axes (ligand directions)")
print("d_xy, d_xz, d_yz (t2g orbitals): lobes point between the coordinate axes (diagonal directions)")
Result: The $d_{z^2}$ orbital has a primary lobe extending along the z axis and a donut-shaped secondary lobe in the equatorial plane, while the $d_{x^2-y^2}$ orbital has four lobes along the x and y axes. The lobes of these $e_g$ orbitals point directly along the coordinate axes (the ligand directions). By contrast, the lobes of the $d_{xy}, d_{xz}, d_{yz}$ orbitals (the $t_{2g}$ orbitals) point between the coordinate axes (the diagonal directions), avoiding the ligand directions. This geometric difference is the origin of the energy splitting in the octahedral field discussed in the next section.
Consider an octahedral field (Octahedral Field, $O_h$ symmetry) in which six ligands are positioned along the positive and negative directions of the x, y, and z axes (±x, ±y, ±z) centered on the metal ion. As we saw in Section 3.1, the $d_{z^2}$ and $d_{x^2-y^2}$ orbitals (together called the $e_g$ orbitals) point directly toward the ligands, so they experience strong electrostatic repulsion from the ligands' negative charge and rise in energy. By contrast, the $d_{xy}, d_{xz}, d_{yz}$ orbitals (together called the $t_{2g}$ orbitals) avoid the ligand directions, so the repulsion is weaker and their energy is lowered.
Here the symbols $e_g$ and $t_{2g}$ are labels for irreducible representations of the molecule's symmetry (the $O_h$ point group), indicating how each set of orbitals transforms under the symmetry operations.
The overall magnitude of the crystal field splitting is called the crystal field splitting energy $\Delta_o$ (the "o" for octahedral) or $10Dq$. The energies of the $e_g$ and $t_{2g}$ orbitals split in such a way that the average energy (barycenter) of the d orbitals as a whole is conserved.
Barycenter rule (Barycenter Rule): $3 \times (-0.4\Delta_o) + 2 \times (+0.6\Delta_o) = 0$. These coefficients ($-0.4$ and $+0.6$, or equivalently $-4Dq$ and $+6Dq$) follow from the requirement that the total energy of the system not change upon splitting.
In a tetrahedral field (Tetrahedral Field, $T_d$ symmetry), where four ligands are positioned along the vertex directions of a tetrahedron, the situation is reversed. Under $T_d$ symmetry, the $d_{xy}, d_{xz}, d_{yz}$ orbitals (the $t_2$ orbitals) lie closer to the ligand directions, while the $d_{z^2}, d_{x^2-y^2}$ orbitals (the $e$ orbitals) avoid them. Consequently, in contrast to the octahedral field, the $e$ orbitals are stabilized and the $t_2$ orbitals are destabilized.
When compared for the same metal ion, ligand, and metal-ligand distance, the tetrahedral splitting energy $\Delta_t$ is approximately 4/9 of the octahedral $\Delta_o$. Both the reduction in ligand number from 6 to 4 and the fact that the ligands lie off the orbital lobes contribute to this factor.
import numpy as np
import matplotlib.pyplot as plt
delta_o = 1.0 # splitting energy of the octahedral field (normalized units)
# Energy in the octahedral field (Oh)
E_t2g = -0.4 * delta_o
E_eg = 0.6 * delta_o
barycenter_Oh = (3 * E_t2g + 2 * E_eg) / 5
print(f"[Oh] t2g: {E_t2g:.2f} Δo, eg: {E_eg:.2f} Δo, barycenter: {barycenter_Oh:.6f} Δo")
# Energy in the tetrahedral field (Td): Δt = (4/9) Δo
delta_t = (4 / 9) * delta_o
E_e_Td = -0.6 * delta_t
E_t2_Td = 0.4 * delta_t
barycenter_Td = (2 * E_e_Td + 3 * E_t2_Td) / 5
print(f"[Td] Δt = {delta_t:.4f} Δo")
print(f"[Td] e: {E_e_Td:.4f} Δo, t2: {E_t2_Td:.4f} Δo, barycenter: {barycenter_Td:.6f} Δo")
# Energy level diagram
fig, axes = plt.subplots(1, 2, figsize=(10, 6), sharey=True)
axes[0].hlines(0, -0.5, 2.5, colors='gray', linestyles='dashed', label='Free ion')
axes[0].hlines(E_t2g, 0.2, 1.0, colors='#f5576c', linewidth=4, label='t2g')
axes[0].hlines(E_eg, 1.2, 2.0, colors='#f093fb', linewidth=4, label='eg')
axes[0].set_title('Octahedral field (Oh)')
axes[0].set_ylabel('Energy (units of Δo)')
axes[0].legend(loc='upper left', fontsize=9)
axes[0].set_xticks([])
axes[1].hlines(0, -0.5, 2.5, colors='gray', linestyles='dashed', label='Free ion')
axes[1].hlines(E_e_Td, 0.2, 1.0, colors='#f093fb', linewidth=4, label='e')
axes[1].hlines(E_t2_Td, 1.2, 2.0, colors='#f5576c', linewidth=4, label='t2')
axes[1].set_title('Tetrahedral field (Td)')
axes[1].legend(loc='upper left', fontsize=9)
axes[1].set_xticks([])
plt.tight_layout()
plt.savefig('cft_splitting_diagram.png', dpi=200)
plt.show()
Result: For both the octahedral and tetrahedral fields, the barycenter comes out to 0.000000 (within normalized numerical error), confirming the barycenter rule numerically. We also obtain $\Delta_t = 0.4444\,\Delta_o$ (= 4/9 $\Delta_o$), showing that a tetrahedral complex has a smaller splitting than an octahedral complex under the same conditions. For this reason, tetrahedral complexes more readily adopt high-spin configurations than octahedral complexes.
Crystal field theory is a simplified model that treats ligands as point charges, and it ignores the covalent character (electron delocalization through orbital overlap) of the chemical bond between metal and ligand. Applying the LCAO method and molecular orbital theory from Chapter 2 to the interaction between the metal's d orbitals and the ligand orbitals gives a more precise model: ligand field theory (LFT).
In LFT, the metal's d orbitals and the ligand orbitals ($\sigma$-donor orbitals, and $\pi$-donor or $\pi$-acceptor orbitals) are considered to combine linearly to form molecular orbitals. The $e_g$ orbitals overlap directly with the ligand $\sigma$ orbitals, and their energy is pushed upward by a strong antibonding interaction. The $t_{2g}$ orbitals are weakly destabilized relative to a nonbonding orbital if the ligand is a $\pi$-donor (e.g., F⁻, O²⁻), or strongly stabilized if the ligand is a $\pi$-acceptor (e.g., CO, CN⁻). This is the origin of the ligand dependence of $\Delta_o$ — namely, the spectrochemical series — which cannot be explained by the simple electrostatic model of CFT.
The spectrochemical series orders ligands from strong field (large $\Delta_o$) to weak field (small $\Delta_o$) based on the experimentally observed magnitude of $\Delta_o$, and it follows approximately the order below (ligands with greater $\pi$-acceptor character produce a stronger field).
The magnitude of $\Delta_o$ determines how the d electrons are arranged among the $t_{2g}$ and $e_g$ orbitals. When the number of d electrons is between 4 and 7, the system must choose between a low-spin configuration, which pairs electrons and packs them into the lower-energy orbitals, and a high-spin configuration, which follows Hund's rule and spreads the electrons out to avoid the pairing energy ($P$). If $\Delta_o$ is greater than $P$, the low-spin configuration is stable; if it is smaller, the high-spin configuration is stable.
import numpy as np
def fill_d_orbitals(n_electrons, spin='high'):
"""
Populate electrons into the five d orbitals (t2g x3, eg x2) in an octahedral field
Parameters:
n_electrons: number of d electrons
spin: 'high' (high spin) or 'low' (low spin)
Returns:
cfse: crystal field stabilization energy (units of Δo, electrostatic term only)
n_pairs: number of orbitals containing a paired electron
n_unpaired: number of unpaired electrons
occ: electron occupation of each of the 5 orbitals [t2g, t2g, t2g, eg, eg]
"""
orbital_energy = np.array([-0.4, -0.4, -0.4, 0.6, 0.6])
occ = np.zeros(5, dtype=int)
order = np.argsort(orbital_energy) # sorted from lowest energy (t2g first)
remaining = n_electrons
if spin == 'low':
for i in order[:3]:
if remaining == 0:
break
occ[i] += 1
remaining -= 1
c = 0
while remaining > 0 and occ[order[:3]].min() < 2:
i = order[c % 3]
if occ[i] < 2:
occ[i] += 1
remaining -= 1
c += 1
for i in order[3:]:
if remaining == 0:
break
occ[i] += 1
remaining -= 1
c = 0
while remaining > 0:
i = order[3 + c % 2]
if occ[i] < 2:
occ[i] += 1
remaining -= 1
c += 1
else:
for i in order:
if remaining == 0:
break
occ[i] += 1
remaining -= 1
c = 0
while remaining > 0:
i = order[c % 5]
if occ[i] < 2:
occ[i] += 1
remaining -= 1
c += 1
cfse = np.sum(occ * orbital_energy)
n_pairs = int(np.sum(occ == 2))
n_unpaired = int(np.sum(occ == 1))
return cfse, n_pairs, n_unpaired, occ
print(f"{'d^n':>4} {'HS CFSE':>9} {'HS unpaired':>12} {'LS CFSE':>9} {'LS unpaired':>12}")
for n in range(1, 10):
hs = fill_d_orbitals(n, 'high')
ls = fill_d_orbitals(n, 'low')
print(f"d{n:<3} {hs[0]:>9.2f} {hs[2]:>12} {ls[0]:>9.2f} {ls[2]:>12}")
# Verification with real complexes: Fe2+ (d6)
P_Fe2 = 17600 # cm^-1, pairing energy of Fe2+ (approximate literature value)
delta_o_aqua = 10400 # cm^-1, [Fe(H2O)6]2+ (weak-field ligand: H2O)
delta_o_cyano = 33800 # cm^-1, [Fe(CN)6]4- (strong-field ligand: CN-)
hs6 = fill_d_orbitals(6, 'high')
ls6 = fill_d_orbitals(6, 'low')
extra_pairs = ls6[1] - hs6[1] # number of additional electron pairs formed in the low-spin configuration
print(f"\nd6 high spin: CFSE={hs6[0]:.2f} Δo, unpaired electrons={hs6[2]}")
print(f"d6 low spin: CFSE={ls6[0]:.2f} Δo, unpaired electrons={ls6[2]}, extra pairs={extra_pairs}")
for name, do in [('[Fe(H2O)6]2+', delta_o_aqua), ('[Fe(CN)6]4-', delta_o_cyano)]:
E_HS = hs6[0] * do
E_LS = ls6[0] * do + extra_pairs * P_Fe2
state = 'high spin' if E_HS < E_LS else 'low spin'
print(f"{name}: Δo={do} cm^-1, E_HS={E_HS:.0f} cm^-1, E_LS={E_LS:.0f} cm^-1 -> {state} is stable")
Result: For d4 through d7, the number of unpaired electrons differs between the high-spin and low-spin configurations (e.g., high-spin d6 has 4 unpaired electrons, low-spin has 0), whereas for d1–d3 and d8–d10 the configuration is uniquely determined regardless of the ligand field strength. Verifying against real complexes: for [Fe(H₂O)₆]²⁺, which has water (H₂O) as a weak-field ligand, $\Delta_o$≈10400 cm⁻¹ is smaller than Fe²⁺'s pairing energy $P$≈17600 cm⁻¹, so the high-spin state (E_HS=-4160 cm⁻¹ < E_LS=10240 cm⁻¹) is stable; for [Fe(CN)₆]⁴⁻, which has the strong-field ligand cyanide (CN⁻), $\Delta_o$≈33800 cm⁻¹ exceeds $P$, so the low-spin state (E_LS=-45920 cm⁻¹ < E_HS=-13520 cm⁻¹) is stable. These predictions agree well with the experimentally observed magnetic susceptibilities ([Fe(H₂O)₆]²⁺ is paramagnetic, [Fe(CN)₆]⁴⁻ is diamagnetic).
import matplotlib.pyplot as plt
# Representative ligands and approximate Δo values (cm^-1, estimated from spectroscopic data of various complexes)
ligands = ['I-', 'Br-', 'Cl-', 'F-', 'H2O', 'NH3', 'en', 'CN-']
delta_o_values = [3000, 3400, 4000, 5500, 10400, 10800, 11500, 26600]
fig, ax = plt.subplots(figsize=(9, 5))
ax.bar(ligands, delta_o_values, color='#7b2cbf')
ax.set_ylabel('Δo (cm⁻¹, approximate)', fontsize=12)
ax.set_title('Spectrochemical Series: Approximate Δo by Ligand', fontsize=14, fontweight='bold')
ax.grid(axis='y', alpha=0.3)
plt.tight_layout()
plt.savefig('spectrochemical_series.png', dpi=200)
plt.show()
print("From weak-field (I-) to strong-field (CN-) ligands, Δo varies by nearly an order of magnitude.")
Result: From weak-field ligands such as halide ions to strong-field ligands such as cyanide, the value of $\Delta_o$ varies by nearly an order of magnitude. The values in this graph are representative estimates obtained from the spectroscopic data of various complexes; in practice, $\Delta_o$ also varies with the identity and oxidation state of the central metal ion.
The Jahn-Teller effect (Jahn-Teller Effect) is the manifestation, in transition metal complexes, of the general principle proved by Hermann Jahn and Edward Teller in 1937 as the Jahn-Teller theorem (Jahn-Teller Theorem): "a nonlinear molecule in a degenerate electronic state will undergo a symmetry-lowering distortion that stabilizes its energy."
When the $e_g$ orbitals (two orbitals) are unequally occupied in a d-orbital configuration in an octahedral field, an energy degeneracy remains if the structure stays perfectly octahedral. The molecule can lift this degeneracy and lower its energy further by undergoing a tetragonal distortion (Tetragonal Distortion) that elongates (or compresses) the bonds along the z axis. This distortion occurs to resolve the ligand-field-theoretically unstable degenerate state, and the system as a whole becomes more stable in the distorted form.
A typical example is a Cu²⁺ complex with a $d^9$ configuration. Because three electrons occupy the $e_g$ orbitals ($e_g^3$, with either $d_{z^2}$ or $d_{x^2-y^2}$ doubly occupied and the other singly occupied), a degeneracy remains in the perfectly octahedral structure. When a distortion that elongates the z-axis bonds occurs, the degeneracy is lifted as $d_{z^2}$ (whose electron density along z decreases) is stabilized and $d_{x^2-y^2}$ is destabilized.
The Jahn-Teller stabilization energy can be estimated with a simple model that assumes, as a function of the distortion parameter $Q$ (a generalized coordinate), a linear term from the electron-lattice interaction (the stabilization from distortion, with coefficient $k$) and a quadratic term from the lattice's elastic energy (the cost of distortion, with coefficient $f$).
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import fminbound
def jt_energy(Q, k, f):
"""Jahn-Teller distortion energy from the linear-quadratic coupling model"""
return -k * Q + 0.5 * f * Q**2
k, f = 2.0, 4.0 # example electron-lattice coupling constants (eV/Å, eV/Å^2)
# Analytical solution
Q_min_analytic = k / f
E_min_analytic = -k**2 / (2 * f)
# Numerical solution (verified with scipy.optimize.fminbound)
Q_min_numeric = fminbound(lambda Q: jt_energy(Q, k, f), -2, 2)
E_min_numeric = jt_energy(Q_min_numeric, k, f)
print(f"Analytical solution: Q_min = k/f = {Q_min_analytic:.4f} Å, E_min = -k^2/(2f) = {E_min_analytic:.4f} eV")
print(f"Numerical solution: Q_min = {Q_min_numeric:.4f} Å, E_min = {E_min_numeric:.4f} eV")
Q = np.linspace(-0.5, 1.5, 200)
E = jt_energy(Q, k, f)
plt.figure(figsize=(7, 5))
plt.plot(Q, E, color='#f5576c', linewidth=2.5)
plt.scatter([Q_min_analytic], [E_min_analytic], color='black', zorder=5,
label=f'Minimum: Q={Q_min_analytic:.2f} Å, E={E_min_analytic:.2f} eV')
plt.axhline(y=0, color='gray', linestyle='--', alpha=0.5)
plt.xlabel('Distortion Q (Å)', fontsize=12)
plt.ylabel('Energy E(Q) (eV)', fontsize=12)
plt.title('Jahn-Teller Distortion Energy (Linear-Quadratic Model)', fontsize=14, fontweight='bold')
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('jahn_teller_energy.png', dpi=200)
plt.show()
Result: For the example k=2.0, f=4.0, the minimum obtained both analytically and by numerical optimization (scipy.optimize.fminbound) agrees exactly at Q_min=0.5000 Å, E_min=-0.5000 eV. As long as the stabilization energy from distortion exceeds the cost of distortion, the system is always energetically favored to adopt a distorted structure rather than remain at Q=0 (perfectly octahedral).
Not all d-electron configurations are Jahn-Teller active. When the $e_g$ orbitals, which interact directly with the ligands, are unequally occupied (e.g., high-spin $d^4$, $d^9$), a strong Jahn-Teller effect appears, with a large energy gain from distortion. On the other hand, when only the $t_{2g}$ orbitals are unequally occupied (their weaker response to distortion stemming from not pointing toward the ligands), the effect remains weak and is often barely observable experimentally.
def jt_activity(occ):
"""Determine unequal occupation within the t2g and eg orbitals (Jahn-Teller activity)"""
t2g_occ = occ[:3]
eg_occ = occ[3:]
t2g_asymmetric = len(set(t2g_occ)) > 1 # weak Jahn-Teller activity
eg_asymmetric = len(set(eg_occ)) > 1 # strong Jahn-Teller activity
return t2g_asymmetric, eg_asymmetric
print(f"{'Config':>10} {'Occupation [t2g,t2g,t2g,eg,eg]':>32} {'Weak JT(t2g)':>13} {'Strong JT(eg)':>14}")
for n in range(1, 10):
for spin in ['high', 'low']:
_, _, _, occ = fill_d_orbitals(n, spin)
t2g_a, eg_a = jt_activity(occ)
label = f"d{n}({'HS' if spin == 'high' else 'LS'})"
print(f"{label:>10} {str(occ.tolist()):>32} {str(t2g_a):>13} {str(eg_a):>14}")
Result: Unequal occupation of the $e_g$ orbitals (strong Jahn-Teller activity) is confirmed for high-spin $d^4$ (Cr²⁺, Mn³⁺, etc., occupation [1,1,1,1,0]), $d^9$ (Cu²⁺, occupation [2,2,2,2,1]), and low-spin $d^7$ (occupation [2,2,2,1,0]). By contrast, only the $t_{2g}$ orbitals are unequal (weak Jahn-Teller activity) for $d^1$, $d^2$, high-spin $d^6$ and $d^7$, and low-spin $d^5$, while $d^3$, high-spin $d^5$, low-spin $d^6$, and $d^8$ have perfectly symmetric occupation and are Jahn-Teller inactive.
The number of unpaired electrons in a complex determines the macroscopic magnetism of the substance. The spin-only magnetic moment (Spin-only Magnetic Moment) $\mu_{eff}$, arising solely from the electrons' spin angular momentum, can be approximated in terms of the number of unpaired electrons $n$ using the following formula.
$\mu_B$ is the Bohr magneton (Bohr Magneton). This formula neglects the contribution of orbital angular momentum, and it is a good approximation for many complexes of first-row transition metals.
import numpy as np
print(f"{'d^n':>4} {'unpaired':>8} {'mu_eff (muB)':>14}")
for n in range(1, 10):
n_unpaired = fill_d_orbitals(n, 'high')[2]
mu_eff = np.sqrt(n_unpaired * (n_unpaired + 2))
print(f"d{n:<3} {n_unpaired:>8} {mu_eff:>14.2f}")
Result: The $d^5$ high-spin configuration (Mn²⁺, Fe³⁺, etc.) has the maximum number of unpaired electrons, 5, reaching $\mu_{eff}$≈5.92 $\mu_B$. The measured value is around 5.9 $\mu_B$, in good agreement. $d^1$ and $d^9$ (1 unpaired electron each) both give the same $\mu_{eff}$≈1.73 $\mu_B$.
The crystal field splitting energy $\Delta_o$ can also be observed directly as the energy of light absorbed during an electronic transition from the $t_{2g}$ orbitals to the $e_g$ orbitals (a metal d-d transition, Metal d-d Transition). When the energy of the absorbed photon equals $\Delta_o$, the wavelength of the absorption maximum $\lambda_{max}$ is given by the following equation.
$\tilde{\nu}$ is the wavenumber (Wavenumber, in cm⁻¹). Converting from wavenumber to a wavelength in nm gives $\lambda_{max}\text{(nm)} = 10^7 / \tilde{\nu}\text{(cm}^{-1}\text{)}$.
import numpy as np
import matplotlib.pyplot as plt
import scipy.constants as const
def delta_o_to_wavelength(delta_o_cm):
"""Simple conversion formula from Δo (cm^-1) to the absorption maximum wavelength (nm)"""
return 1e7 / delta_o_cm
# Example: [Ti(H2O)6]3+ (d1), Δo ≈ 20300 cm^-1
delta_o_Ti = 20300
lam_formula = delta_o_to_wavelength(delta_o_Ti)
# Verify by direct calculation from physical constants
E_photon = const.h * const.c * (delta_o_Ti * 100) # convert cm^-1 -> m^-1, then energy (J)
lam_from_constants = const.h * const.c / E_photon * 1e9 # m -> nm
print(f"[Ti(H2O)6]3+: Δo = {delta_o_Ti} cm^-1")
print(f"Absorption maximum wavelength from the simple formula: {lam_formula:.1f} nm")
print(f"Verification from physical constants: {lam_from_constants:.1f} nm")
delta_o_range = np.linspace(5000, 35000, 200)
lam_range = delta_o_to_wavelength(delta_o_range)
plt.figure(figsize=(8, 5))
plt.plot(delta_o_range, lam_range, color='#2c3e50', linewidth=2.5)
plt.scatter([delta_o_Ti], [lam_formula], color='#f5576c', zorder=5, label='[Ti(H2O)6]3+')
plt.xlabel('Δo (cm⁻¹)', fontsize=12)
plt.ylabel('Absorption maximum wavelength λ_max (nm)', fontsize=12)
plt.title('Relationship Between Crystal Field Splitting Energy and Absorption Wavelength', fontsize=14, fontweight='bold')
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('delta_o_wavelength.png', dpi=200)
plt.show()
Result: For [Ti(H₂O)₆]³⁺ ($d^1$, $\Delta_o$≈20300 cm⁻¹), both the simple wavenumber-conversion formula and the direct calculation from physical constants (Planck's constant and the speed of light) give the same value, $\lambda_{max}$≈492.6 nm. This wavelength corresponds to green-yellow light, and its complementary color, violet to reddish-purple, is observed as the color of this complex.
The absorption spectra of complexes with multiple d electrons ($d^2$ through $d^8$) become more complex due to electron-electron repulsion (the interaction between terms characterized by the Racah parameters $B, C$), and the relationship between $\Delta_o$ and the absorption energy becomes nonlinear. Plotting this relationship as a function of the ligand field strength $Dq$ produces a Tanabe-Sugano diagram (Tanabe-Sugano Diagram), introduced by Y. Tanabe and S. Sugano in 1954. For most d-electron configurations, terms with the same symmetry and the same spin multiplicity mix together, causing the energy-level curves to bend as a function of field strength.
The sole exception is the $d^1$ (and high-spin $d^9$) configuration. Because there is only one electron (or hole), no electron-electron repulsion operates, and the energies of the ground state ($^2T_{2g}$) and excited state ($^2E_g$) are simple linear functions of the ligand field strength. We use this special case to confirm the idea behind the Tanabe-Sugano diagram.
import numpy as np
import matplotlib.pyplot as plt
# d1 system: with no electron-electron repulsion, energy is a linear function of Dq
Dq_over_B = np.linspace(0, 3, 100) # by convention, plot Dq/B on the horizontal axis (independent of B for d1)
E_ground_2T2g = -4 * Dq_over_B # -0.4 * 10Dq = -4Dq
E_excited_2Eg = 6 * Dq_over_B # +0.6 * 10Dq = +6Dq
plt.figure(figsize=(7, 5))
plt.plot(Dq_over_B, E_ground_2T2g, color='#f5576c', linewidth=2.5, label='2T2g (ground state)')
plt.plot(Dq_over_B, E_excited_2Eg, color='#f093fb', linewidth=2.5, label='2Eg (excited state)')
plt.xlabel('Dq/B (ligand field strength, conventional dimensionless representation)', fontsize=11)
plt.ylabel('E/B', fontsize=12)
plt.title('Simplified Tanabe-Sugano Diagram for a d1 System', fontsize=14, fontweight='bold')
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('tanabe_sugano_d1.png', dpi=200)
plt.show()
print("2Eg - 2T2g = 10Dq = Δo, and for a d1 system this is always a linear relationship with field strength.")
Result: The $^2T_{2g}$ (ground state) is plotted as a line with slope $-4$, and the $^2E_g$ (excited state) as a line with slope $+6$; the energy difference between them always equals $10Dq = \Delta_o$. In multi-electron systems with $d^2$ or more electrons, several terms with the same spin multiplicity (for example, there are two $^3T_{1g}$ terms for $d^2$) mix together depending on field strength, so the energy levels trace curves rather than straight lines.
Mn²⁺ ($d^5$) usually adopts a high-spin configuration with both weak-field and strong-field ligands (except for ligands with a very large $\Delta_o$, such as CN⁻). Compute in Python the number of unpaired electrons and the spin-only magnetic moment $\mu_{eff}$ for the high-spin $d^5$ configuration, and compare it with the experimentally known value (approximately 5.9 $\mu_B$).
import numpy as np
n_unpaired = fill_d_orbitals(5, 'high')[2]
mu_eff = np.sqrt(n_unpaired * (n_unpaired + 2))
print(f"Mn2+ (d5, high spin): number of unpaired electrons = {n_unpaired}")
print(f"mu_eff (spin-only) = {mu_eff:.2f} muB")
print(f"Approximate experimental value: about 5.9 muB, difference: {abs(mu_eff - 5.9):.2f} muB")
Result: 5 unpaired electrons, $\mu_{eff}$=5.92 $\mu_B$. This agrees well with the experimental value (about 5.9 $\mu_B$). High-spin $d^5$ places one electron in each of the five d orbitals, the configuration with the maximum number of unpaired electrons, and it exhibits one of the largest magnetic moments among transition metal ions.
Let the pairing energy of Co³⁺ ($d^6$) be $P$≈21000 cm⁻¹. For $[\text{CoF}_6]^{3-}$, which has the weak-field ligand F⁻ ($\Delta_o$≈13000 cm⁻¹), and $[\text{Co(NH}_3)_6]^{3+}$, which has the strong-field ligand NH₃ ($\Delta_o$≈23000 cm⁻¹), determine in Python whether the high-spin or low-spin configuration is stable in each case.
P_Co3 = 21000 # cm^-1, pairing energy of Co3+ (approximate)
delta_o_CoF6 = 13000 # cm^-1, [CoF6]3- (weak field: F-)
delta_o_CoNH3 = 23000 # cm^-1, [Co(NH3)6]3+ (strong field: NH3)
hs6 = fill_d_orbitals(6, 'high')
ls6 = fill_d_orbitals(6, 'low')
extra_pairs = ls6[1] - hs6[1]
for name, do in [('[CoF6]3-', delta_o_CoF6), ('[Co(NH3)6]3+', delta_o_CoNH3)]:
E_HS = hs6[0] * do
E_LS = ls6[0] * do + extra_pairs * P_Co3
state = 'high spin' if E_HS < E_LS else 'low spin'
print(f"{name}: E_HS={E_HS:.0f} cm^-1, E_LS={E_LS:.0f} cm^-1 -> {state} is stable")
Result: For $[\text{CoF}_6]^{3-}$, E_HS=-5200 cm⁻¹ < E_LS=10800 cm⁻¹, so the high-spin state is stable. For $[\text{Co(NH}_3)_6]^{3+}$, E_LS=-13200 cm⁻¹ < E_HS=-9200 cm⁻¹, so the low-spin state is stable. Experimentally, $[\text{CoF}_6]^{3-}$ is known to be paramagnetic (high spin) and $[\text{Co(NH}_3)_6]^{3+}$ diamagnetic (low spin, with complete pairing of the $d^6$ electrons), consistent with the calculation.
Using the fill_d_orbitals function and jt_activity function from Section 3.4, classify every high-spin and low-spin configuration from $d^1$ to $d^9$ into three groups: strong Jahn-Teller activity (unequal occupation of the $e_g$ orbitals), weak Jahn-Teller activity (only the $t_{2g}$ orbitals unequally occupied), and inactive (symmetric configuration). Also explain, in terms of the spatial orientation of the orbitals, why unequal occupation of the $e_g$ orbitals causes a much stronger Jahn-Teller distortion than unequal occupation of the $t_{2g}$ orbitals.
strong_jt = []
weak_jt = []
inactive = []
for n in range(1, 10):
for spin in ['high', 'low']:
_, _, _, occ = fill_d_orbitals(n, spin)
t2g_a, eg_a = jt_activity(occ)
label = f"d{n}({'HS' if spin == 'high' else 'LS'})"
if eg_a:
strong_jt.append(label)
elif t2g_a:
weak_jt.append(label)
else:
inactive.append(label)
print("Strong Jahn-Teller activity (eg orbitals unequally occupied):", strong_jt)
print("Weak Jahn-Teller activity (only t2g orbitals unequally occupied):", weak_jt)
print("Jahn-Teller inactive (symmetric occupation):", inactive)
Result: Strong Jahn-Teller activity ($e_g$ unequal) appears for high-spin $d^4$, low-spin $d^7$, and $d^9$ (both high spin and low spin). Weak activity ($t_{2g}$ unequal only) appears for $d^1$, $d^2$, high-spin $d^6$, high-spin $d^7$, and low-spin $d^5$. $d^3$, high-spin $d^5$, low-spin $d^6$, and $d^8$ have symmetric occupation and are Jahn-Teller inactive. Because the $e_g$ orbitals ($d_{z^2}, d_{x^2-y^2}$) point directly toward the ligands, their unequal occupation produces a direct asymmetry in $\sigma$-bond strength, giving a large stabilization energy from distortion. The $t_{2g}$ orbitals, on the other hand, avoid the ligand directions, so their unequal occupation affects bond strength only indirectly (to the extent of $\pi$ interactions) and weakly, and the resulting distortion observed is usually small enough to be negligible.
1. Jahn, H.A., Teller, E. (1937). "Stability of Polyatomic Molecules in Degenerate Electronic States". Proceedings of the Royal Society A, 161(905), 220-235.
2. Tanabe, Y., Sugano, S. (1954). "On the Absorption Spectra of Complex Ions". Journal of the Physical Society of Japan, 9(5), 753-766.
3. Figgis, B.N., Hitchman, M.A. (2000). Ligand Field Theory and Its Applications. Wiley-VCH, pp. 1-90.
4. Miessler, G.L., Fischer, P.J., Tarr, D.A. (2014). Inorganic Chemistry, 5th Edition. Pearson, pp. 375-430.
5. Housecroft, C.E., Sharpe, A.G. (2018). Inorganic Chemistry, 5th Edition. Pearson, pp. 620-670.
6. Orgel, L.E. (1952). "The Effects of Crystal Fields on the Properties of Transition-Metal Ions". Journal of Chemical Physics, 20, 1819.
7. Bethe, H. (1929). "Termaufspaltung in Kristallen". Annalen der Physik, 395(2), 133-208.
8. Shriver, D.F., Atkins, P.W. (2010). Inorganic Chemistry, 5th Edition. W.H. Freeman, pp. 550-600.
9. SciPy Developers. "scipy.optimize.fminbound — SciPy Documentation". https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fminbound.html
← Chapter 2 | Series Index | Chapter 4 →