ECE 606 Lecture 4.2
Strange experimental results: the advent of quantum mechanics
In the lecture
- black-body radiation: the measured spectrum, the Rayleigh–Jeans and Wien laws that each fit only one side of it, and Planck's formula that fits all of it
- Planck's formula read as number of modes × energy of a mode × occupation, with light emitted in quanta \(E = hf\); the COBE measurement of the 2.725 K cosmic background
- discrete optical spectra: the hydrogen series \(E_{mn} = 13.6\ \text{eV}\,(1/m^2 - 1/n^2)\), the Bohr model with quantized angular momentum, and electrons as standing waves bound to a core
- the photoelectric effect: electron energy set by the light's frequency, not its intensity; Einstein's \(E_\text{kin} = hf - W\) (1905, Nobel prize 1921)
- wave–particle duality: \(E^2 = m_0^2c^4 + p^2c^2\) gives the photon momentum \(p = h/\lambda = \hbar k\)
In this notebook
computes the Planck, Rayleigh–Jeans and Wien spectra and checks Wien's displacement and the Stefan–Boltzmann law, counts the standing-wave modes of a cavity, evaluates the 2.725 K cosmic background, solves the hydrogen atom's radial Schrödinger equation with open-nemo's eigensolver and compares the levels and the Balmer lines with Bohr's formula, tabulates photoelectric thresholds, and compares photon and electron wavelengths.
Run it on your own machine
The notebook needs open-nemo (Python ≥ 3.10 and a C++20 compiler; BLAS/LAPACK).
git clone https://github.com/denphi/open-nemo.git && cd open-nemo
python3 -m venv .venv && source .venv/bin/activate
pip install -e ".[notebooks]"
jupyter lab From_Atoms_to_Devices/02_materials_and_quantum_mechanics/04_2_advent_of_quantum_mechanics.ipynb
Code
import numpy as np
import matplotlib.pyplot as plt
import opennemo as nemo
from opennemo.visualization import style
style.use(notebook=True)
from opennemo.core.units import COULOMB, C_LIGHT, H, HBAR2_2M0, KB, M0, Q
1. Black-body radiation#
Around 1900 three experiments did not fit classical physics. The first is the light emitted by a hot body. A cavity with a small hole is the ideal emitter (a black body): the radiation that leaves through the hole has a spectrum that depends only on the temperature. The measured intensity rises steeply at short wavelengths, peaks, and falls off at long wavelengths, and the peak moves to shorter wavelengths as the temperature rises.
Two classical formulas each describe one side. Rayleigh and Jeans gave every standing-wave mode of the cavity the classical thermal energy \(k_BT\), which fits the long wavelengths and diverges at short ones (the "ultraviolet catastrophe"). Wien's empirical exponential fits the short wavelengths and fails at long ones. Planck found the formula that fits everything. Per unit wavelength, for the spectral radiance (W m⁻³ sr⁻¹),
The slide's \(\beta\) is \(hc/k_B\). The emittance of the slide's plot, in W/(cm² µm), is \(\pi B_\lambda\) converted to those units. The cell draws the three formulas, finds the peak of Planck's curve, and integrates it to the total emitted power, which must give Wien's displacement law \(\lambda_\text{max}T = hc/(4.965\,k_B)\) and the Stefan–Boltzmann law \(\sigma T^4\).
Code
h, kB = H * Q, KB * Q # J s, J/K
c = C_LIGHT
def planck(lam, T):
return 2 * h * c**2 / lam**5 / np.expm1(h * c / (lam * kB * T))
def rayleigh_jeans(lam, T):
return 2 * c * kB * T / lam**4
def wien(lam, T):
return 2 * h * c**2 / lam**5 * np.exp(-h * c / (lam * kB * T))
lam = np.logspace(-7, -3, 4001) # m
to_slide = np.pi * 1e-4 * 1e-6 # W m^-3 sr^-1 -> emittance in W / (cm^2 µm)
sigma = 2 * np.pi**5 * kB**4 / (15 * h**3 * c**2)
print(" T (K) λ_max (µm) hc/(4.965 kB T) (µm) peak (W/cm² µm) ∫πB dλ (W/m²) σT⁴ (W/m²)")
for T in (300.0, 1000.0, 2000.0):
B = planck(lam, T)
total = np.pi * np.trapezoid(B, lam)
print(
f"{T:6.0f} {1e6 * lam[np.argmax(B)]:9.3f} {1e6 * h * c / (4.965114 * kB * T):17.3f} "
f"{to_slide * B.max():15.3g} {total:13.4g} {sigma * T**4:10.4g}"
)
fig, ax = plt.subplots(figsize=(7, 4.4))
for T, col in zip((300.0, 1000.0, 2000.0), style.sweep(3)):
ax.loglog(1e6 * lam, to_slide * planck(lam, T), color=col, label=f"Planck, T = {T:.0f} K")
ax.loglog(
1e6 * lam,
to_slide * rayleigh_jeans(lam, 2000.0),
"--",
color=style.REFERENCE,
label="Rayleigh–Jeans, 2000 K",
)
ax.loglog(1e6 * lam, to_slide * wien(lam, 2000.0), ":", color=style.CONTEXT, lw=2, label="Wien, 2000 K")
ax.set(
xlim=(0.03, 300),
ylim=(1e-3, 1e4),
xlabel="wavelength λ (µm)",
ylabel="spectral emittance (W cm⁻² µm⁻¹)",
title="black-body radiation, as on the slide",
)
ax.legend(frameon=False, fontsize=8)
fig.tight_layout();
T (K) λ_max (µm) hc/(4.965 kB T) (µm) peak (W/cm² µm) ∫πB dλ (W/m²) σT⁴ (W/m²) 300 9.661 9.659 0.00313 459.3 459.3 1000 2.897 2.898 1.29 5.67e+04 5.67e+04 2000 1.449 1.449 41.2 9.073e+05 9.073e+05

The curves reproduce the slide: at 2000 K the peak is 41.2 W/(cm² µm) at 1.449 µm, the Rayleigh–Jeans line runs through the long-wavelength flank and shoots up past it, and Wien's curve follows Planck's at short wavelengths but falls below it at long ones. The peak positions agree with Wien's displacement law (9.661, 2.897 and 1.449 µm on the wavelength grid, against 9.659, 2.898 and 1.449 µm), and the integrated power agrees with \(\sigma T^4\) (459.3 W/m² at 300 K: the heat a room-temperature body radiates per square metre).
What Planck's formula means#
Klimeck reads the formula per unit frequency as a product of three factors,
The first factor counts the standing waves of Lecture 4.1 in a three-dimensional cavity. In a cube of side \(L\) the allowed waves have \(\mathbf{k} = (\pi/L)(n_x, n_y, n_z)\) with positive integers and two polarizations, so the number of modes below frequency \(f = c|\mathbf{k}|/2\pi\) is
and its derivative gives the \(f^2\). Classically every mode holds \(k_BT\), and with \(f^2\) modes the energy diverges. Planck's assumption is that a mode of frequency \(f\) can only hold energy in quanta \(E = nhf\), \(n = 0, 1, 2, \ldots\) Then the average energy per mode is \(hf/(e^{hf/k_BT} - 1)\), which is \(k_BT\) for \(hf \ll k_BT\) and vanishes exponentially for \(hf \gg k_BT\): the high-frequency modes are too expensive to excite. The cell counts the cavity modes directly and compares the two mode energies.
Code
print(" n_max counted modes 8πL³f³/3c³ ratio")
for n_max in (10, 30, 100):
g = np.arange(1, n_max + 1)
nx, ny, nz = np.meshgrid(g, g, g, indexing="ij", sparse=True)
counted = 2 * np.count_nonzero(nx**2 + ny**2 + nz**2 <= n_max**2)
formula = 2 * np.pi / 6 * n_max**3 # N(f) with 2Lf/c = n_max
print(f"{n_max:5d} {counted:13d} {formula:12.0f} {counted / formula:.4f}")
x = np.linspace(0.01, 8, 400) # hf / kT
quantum = x / np.expm1(x) # average energy per mode in units of kT
fig, (a1, a2) = plt.subplots(1, 2, figsize=(11, 3.8))
a1.plot(x, np.ones_like(x), "--", color=style.REFERENCE, label="classical: k_BT")
a1.plot(x, quantum, color=style.OPEN_NEMO, label="quanta E = nhf")
a1.set(xlabel="hf / k_BT", ylabel="average energy per mode (k_BT)", title="energy of a mode")
a1.legend(frameon=False, fontsize=8)
a2.plot(x, x**2, "--", color=style.REFERENCE, label="modes × k_BT (Rayleigh–Jeans)")
a2.plot(x, x**2 * quantum, color=style.OPEN_NEMO, label="modes × quantum energy (Planck)")
a2.set(
xlabel="hf / k_BT",
ylabel="u(f) (arbitrary units)",
ylim=(0, 6),
title="number of modes × energy per mode",
)
a2.legend(frameon=False, fontsize=8)
fig.tight_layout()
print(f"Planck's u(f) peaks at hf = {x[np.argmax(x**2 * quantum)]:.2f} k_BT (exact 2.821 k_BT)")
n_max counted modes 8πL³f³/3c³ ratio 10 820 1047 0.7830 30 26200 28274 0.9266 100 1023552 1047198 0.9774 Planck's u(f) peaks at hf = 2.81 k_BT (exact 2.821 k_BT)

The counted modes approach the formula as the cube holds more of them (ratio 0.7830 for \(n_\text{max} = 10\), 0.9774 for 100). The shortfall is a surface effect: the octant formula also counts lattice points on the coordinate planes, where one index is zero and the wave vanishes everywhere, and it shrinks as \(1/n_\text{max}\). The product of \(f^2\) modes with the quantized mode energy peaks at \(hf = 2.81\,k_BT\) on the grid (exactly \(2.821\,k_BT\)), the peak of Planck's spectrum per unit frequency.
The cosmic background: a 2.725 K black body#
The most precise black-body spectrum ever measured comes from the sky. The FIRAS instrument on the COBE satellite measured the cosmic microwave background, and its data fall on Planck's curve for 2.725 K so closely that the error bars hardly show; the fit is a strong confirmation that the radiation is a remnant of the hot early universe. FIRAS plotted the spectrum per unit frequency against a wavelength axis, which is why its peak is near 2 mm, not at the 1.06 mm that Wien's law gives per unit wavelength.
Code
T_cmb = 2.725
f = np.linspace(1e9, 700e9, 7000)
B_f = 2 * h * f**3 / c**2 / np.expm1(h * f / (kB * T_cmb))
f_peak = f[np.argmax(B_f)]
print(
f"T = {T_cmb} K: peak per unit frequency at {f_peak / 1e9:.1f} GHz, i.e. at c/f = "
f"{1e3 * c / f_peak:.3f} mm"
)
print(f"peak per unit wavelength (Wien): {1e3 * h * c / (4.965114 * kB * T_cmb):.3f} mm")
print(
f"photon energy at the peak frequency: {1e3 * H * f_peak:.3f} meV = {H * f_peak / (KB * T_cmb):.3f} k_BT"
)
T = 2.725 K: peak per unit frequency at 160.2 GHz, i.e. at c/f = 1.871 mm peak per unit wavelength (Wien): 1.063 mm photon energy at the peak frequency: 0.663 meV = 2.821 k_BT
The 2.725 K spectrum peaks at 160.2 GHz, which is 1.871 mm on FIRAS's wavelength axis, and at 1.063 mm per unit wavelength. A photon at the peak carries only 0.663 meV.
2. Discrete optical spectra and the Bohr atom#
The second puzzle: a hot gas of a single element does not emit a continuous spectrum but sharp lines, characteristic of the element like a fingerprint (hydrogen has a few, iron very many). The bright yellow sodium lamps once used for street lighting convert much of their excitation energy into a single pair of lines. The hydrogen lines follow a simple rule found empirically by Balmer and Rydberg,
with the series named after Lyman (\(m = 1\), ultraviolet), Balmer (\(m = 2\), visible) and Paschen (\(m = 3\), infrared).
Bohr explained the rule in 1913 by assuming that the angular momentum of the electron circling the proton is quantized, \(m_0 v r_n = n\hbar\). With the Coulomb force as the centripetal force, \(m_0v^2/r_n = q^2/(4\pi\varepsilon_0 r_n^2)\), this gives
Quantum mechanics replaces the orbits by standing waves bound to the nucleus, and discrete transition energies follow from discrete standing waves. That can be checked with open-nemo now. For states without angular momentum the radial function \(u(r) = r\,R(r)\) obeys a one-dimensional Schrödinger equation with \(u(0) = 0\),
which is a particle in a box (hard wall at \(r = 0\)) with a Coulomb potential added. The cell builds
an 8 nm effective-mass box with \(m = m_0\) and spacing 0.002 nm, passes the potential
\(-q^2/4\pi\varepsilon_0 r\) (with \(q^2/4\pi\varepsilon_0\) = 1.440 eV nm) to open-nemo's eigensolver,
and compares the levels with Bohr's formula. The constants of opennemo.core.units give the
Rydberg energy and the Bohr radius.
Code
Ry = COULOMB**2 / (4 * HBAR2_2M0) # m0 q^4 / 2(4π ε0 ħ)^2 in eV
a0 = 2 * HBAR2_2M0 / COULOMB # 4π ε0 ħ^2 / m0 q^2 in nm
print(f"Rydberg energy {Ry:.4f} eV, Bohr radius {a0:.5f} nm")
dx = 0.002
vac = nemo.structures.materials.EffectiveMassMaterial("vacuum", 1.0, 1.0, conduction_band_edge=0.0)
box = nemo.Heterostructure1D([nemo.Layer(vac, 8.0)], spacing=dx)
r = box.x + dx / 2 # distance from the hard wall at r = 0
st = nemo.eigenstates(box.hamiltonian.sparse, num=4, potential=-COULOMB / r)
order = np.argsort(st["energies"])
En, vec = np.asarray(st["energies"])[order], np.asarray(st["vectors"])[:, order]
print(" n open-nemo (eV) Bohr −Ry/n² (eV) <r> (nm) 1.5 a0 n² (nm)")
for n in range(1, 5):
p = abs(vec[:, n - 1]) ** 2
print(
f"{n:2d} {En[n - 1]:13.4f} {-Ry / n**2:15.4f} {np.sum(p * r) / np.sum(p):8.4f} "
f"{1.5 * a0 * n**2:12.4f}"
)
# Balmer lines; the reduced mass of the electron–proton pair lowers Ry by m0/M_p
Ry_H = Ry / (1 + 1 / 1836.15267)
print("\nBalmer line n λ (nm), Ry λ (nm), reduced mass measured, vacuum (nm)")
for name, n, meas in (("H-α", 3, 656.47), ("H-β", 4, 486.27), ("H-γ", 5, 434.17), ("H-δ", 6, 410.29)):
lam_nm = [1e9 * H * c / (R * (1 / 4 - 1 / n**2)) for R in (Ry, Ry_H)]
print(f"{name:10s} {n:2d} {lam_nm[0]:10.2f} {lam_nm[1]:16.2f} {meas:16.2f}")
print(f"Lyman-α: {1e9 * H * c / (Ry_H * 0.75):.2f} nm")
fig, (a1, a2) = plt.subplots(1, 2, figsize=(11, 3.8))
for n, col in zip(range(1, 4), style.sweep(3)):
p = abs(vec[:, n - 1]) ** 2
a1.plot(r / a0, p / p.sum() / dx * a0, color=col, label=f"n = {n}, E = {En[n - 1]:.3f} eV")
a1.set(
xlim=(0, 30),
xlabel="r / a₀",
ylabel="radial probability |u(r)|² (1/a₀)",
title="hydrogen s states (open-nemo)",
)
a1.legend(frameon=False, fontsize=8)
for m, col in zip((1, 2, 3), style.sweep(3)):
nn = np.arange(m + 1, m + 8)
a2.plot(1e9 * H * c / (Ry_H * (1 / m**2 - 1 / nn**2)), np.full(nn.shape, m), "|", ms=18, color=col)
a2.set(
xscale="log",
yticks=[1, 2, 3],
yticklabels=["Lyman", "Balmer", "Paschen"],
ylim=(0.5, 3.5),
xlabel="wavelength λ (nm)",
title="hydrogen emission lines",
)
a2.axvspan(380, 750, color=style.CONTEXT, alpha=0.15)
fig.tight_layout();
Rydberg energy 13.6057 eV, Bohr radius 0.05292 nm n open-nemo (eV) Bohr −Ry/n² (eV) <r> (nm) 1.5 a0 n² (nm) 1 -13.6008 -13.6057 0.0794 0.0794 2 -3.4011 -3.4014 0.3175 0.3175 3 -1.5117 -1.5117 0.7144 0.7144 4 -0.8503 -0.8504 1.2700 1.2700 Balmer line n λ (nm), Ry λ (nm), reduced mass measured, vacuum (nm) H-α 3 656.11 656.47 656.47 H-β 4 486.01 486.27 486.27 H-γ 5 433.94 434.17 434.17 H-δ 6 410.07 410.29 410.29 Lyman-α: 121.57 nm

open-nemo's ground state is −13.6008 eV against Bohr's −13.6057 eV; the 0.04 % difference comes from the grid near the Coulomb singularity and shrinks as the spacing is refined. The higher levels, −3.4011, −1.5117 and −0.8503 eV, follow \(-R/n^2\) as closely, and the mean radius of the \(s\) states, \(\langle r\rangle = 1.5\,a_0 n^2\), grows as \(n^2\) like Bohr's orbits. Nobody put the levels in by hand: they appear because a wave bound to the proton can only take discrete shapes. With the reduced mass of the electron–proton pair the Balmer lines come out at 656.47, 486.27, 434.17 and 410.29 nm, the measured vacuum wavelengths to 0.01 nm; Lyman-α is at 121.57 nm in the ultraviolet.
3. The photoelectric effect#
The third puzzle: light ejects electrons from a clean metal surface. Researchers observed this from 1839 on (1839, 1873, 1887, 1899, 1901), and for over 55 years it remained unexplained, because:
- the electrons come out immediately, with no time lag;
- more intense light ejects more electrons, but not faster ones;
- red light does not eject electrons at all, however intense;
- weak violet light ejects a few electrons, but with high energy.
The light needs a minimum frequency, and the energy of the electrons depends on the frequency of the light, not on its intensity. Einstein's solution of 1905 (Nobel prize 1921) is that light consists of particles, photons of energy \(E = hf\), Planck's constant times the frequency. A photon is not divisible; it gives all its energy to one electron, which needs at least the work function \(W\) to leave the metal:
The retarding voltage rises linearly with frequency with slope \(h/q\), independent of the metal; this is how Millikan measured Planck's constant in 1916. The cell uses work functions of the alkali metals (CRC Handbook) and the colours of the lecture.
Code
W = {"Cs": 2.14, "K": 2.29, "Na": 2.36} # work function (eV)
colours = {"red": 700, "green": 530, "blue": 450, "violet": 400} # nm
print("metal W (eV) threshold λ_m = hc/W (nm)")
for metal, w in W.items():
print(f"{metal:5s} {w:6.2f} {1e9 * H * c / w:10.0f}")
print("\nlight (nm) photon hf (eV) Na: E_kin = hf − W (eV) photons/s in 1 mW")
for name, l_nm in colours.items():
hf = 1e9 * H * c / l_nm
ek = hf - W["Na"]
print(
f"{name:6s} {l_nm:4d} {hf:12.3f} {('%.3f' % ek) if ek > 0 else 'none (below W)':>22s} "
f"{1e-3 / (hf * Q):.2e}"
)
f_ = np.linspace(3e14, 1.2e15, 200)
fig, ax = plt.subplots(figsize=(6.5, 3.8))
for (metal, w), col in zip(W.items(), style.sweep(3)):
ax.plot(f_ / 1e14, np.clip(H * f_ - w, 0, None), color=col, label=f"{metal}, W = {w} eV")
ax.set(
xlabel="light frequency f (10¹⁴ Hz)",
ylabel="retarding voltage V_R (V)",
title="slope h/q = 4.14×10⁻¹⁵ V s for every metal",
)
ax.legend(frameon=False, fontsize=8)
fig.tight_layout();
metal W (eV) threshold λ_m = hc/W (nm) Cs 2.14 579 K 2.29 541 Na 2.36 525 light (nm) photon hf (eV) Na: E_kin = hf − W (eV) photons/s in 1 mW red 700 1.771 none (below W) 3.52e+15 green 530 2.339 none (below W) 2.67e+15 blue 450 2.755 0.395 2.27e+15 violet 400 3.100 0.740 2.01e+15

Sodium needs light shorter than 525 nm. Red light (1.771 eV photons) ejects no electron, however many photons a beam carries (\(3.52\times10^{15}\) per second at 1 mW); violet light (3.100 eV) ejects electrons with 0.740 eV, and a weaker violet beam ejects fewer of them with the same energy. Planck's quanta of emission are matched by quanta of absorption.
4. Wave–particle duality#
Light interferes and diffracts like a wave (Lecture 4.1) and is absorbed in indivisible quanta like a particle. All particles have wave properties (they interfere, diffract and form standing waves) and all waves have particle properties (momentum, energy, they can be created and destroyed). One describes them by an energy \(E\), a frequency \(f\), a momentum \(\hbar k\) and a set of discrete quantum numbers, and chooses the wave or particle picture according to the problem. The relativistic energy relation joins the two pictures:
De Broglie applied \(p = h/\lambda\) to electrons in 1924. The cell compares the wavelength of a photon and of an electron with the same energy, using the full relativistic relation for the electron.
Code
mc2 = M0 * c**2 / Q # electron rest energy (eV)
print(f"electron rest energy m0 c² = {mc2 / 1e3:.2f} keV")
print(" E (eV) photon λ = hc/E electron λ = h/p (relativistic) non-relativistic 2π/k")
for E_ in (1.0, 10.0, 100.0, 1e5):
pc = np.sqrt((E_ + mc2) ** 2 - mc2**2) # kinetic energy E_ -> momentum (eV)
lam_e = H * c / pc * 1e9
lam_nr = 2 * np.pi / np.sqrt(E_ / HBAR2_2M0) # E = ħ²k²/2m0, as in open-nemo's effective-mass model
print(f"{E_:10.0f} {1e9 * H * c / E_:12.4g} nm {lam_e:22.4g} nm {lam_nr:22.4g} nm")
electron rest energy m0 c² = 511.00 keV
E (eV) photon λ = hc/E electron λ = h/p (relativistic) non-relativistic 2π/k
1 1240 nm 1.226 nm 1.226 nm
10 124 nm 0.3878 nm 0.3878 nm
100 12.4 nm 0.1226 nm 0.1226 nm
100000 0.0124 nm 0.003701 nm 0.003878 nmAn electron of 1 eV has a wavelength of 1.226 nm, a photon of 1 eV 1240 nm. At 100 eV the electron wavelength, 0.1226 nm, is comparable to the 0.235 nm bond length of Si, so electrons diffract from crystals (Davisson and Germer, 1927). This is the reason the electrons in a semiconductor have to be treated as waves: their wavelengths at the energies of interest are a few nanometres, the size of the atomic lattice and of modern devices. Relativity matters only far above these energies; at 100 keV, as in an electron microscope, the relativistic wavelength (3.701 pm) is 4.6 % shorter than the non-relativistic one.
Summary#
- Black-body spectra follow Planck's formula; at 2000 K the peak is 41.2 W/(cm² µm) at 1.449 µm, and the peaks and the total power reproduce Wien's displacement and the Stefan–Boltzmann law.
- Planck's formula = (number of cavity standing-wave modes ∝ \(f^2\)) × (quantum \(hf\)) × (occupation \(1/(e^{hf/k_BT}-1)\)). The 2.725 K cosmic background peaks at 160.2 GHz.
- Hydrogen's discrete lines follow \(13.6\ \text{eV}(1/m^2 - 1/n^2)\). open-nemo's eigensolver gives −13.6008 eV for the ground state of the radial Schrödinger equation (Bohr: −13.6057 eV) and the Balmer lines at the measured wavelengths.
- Photoelectrons have \(E_\text{kin} = hf - W\): red light ejects none from Na, violet light ejects electrons with 0.740 eV.
- \(p = h/\lambda\) for photons and electrons; a 1 eV electron has \(\lambda\) = 1.226 nm.
Exercises#
- Compute the fraction of the Sun's radiation (a black body at 5800 K) that lies in the visible, 380–750 nm, and the fraction that a Si solar cell can absorb (\(\lambda < 1.1\) µm).
- Refine the hydrogen calculation with spacings 0.004, 0.002 and 0.001 nm. How does the error of the ground state scale with the spacing?
- Add the centrifugal term \(\hbar^2 l(l+1)/(2m_0r^2)\) to the potential and find the \(2p\) level (\(l = 1\)). Is it degenerate with \(2s\)?
- Which metal of the table would eject electrons with green light at 530 nm, and with what retarding voltage?
Further reading#
- Lecture 4.1: Classical systems
- Lecture 4.3: Why do we need quantum mechanics?
- Lecture 5: Analytical solutions for free and bound electrons
- Lecture 8: Bonding and antibonding states
- Black-body radiation: https://en.wikipedia.org/wiki/Black-body_radiation
- J. C. Mather et al., Astrophys. J. 354, L37 (1990): the COBE FIRAS spectrum.
- Photoelectric effect: https://en.wikipedia.org/wiki/Photoelectric_effect
- CRC Handbook of Chemistry and Physics, "Electron work function of the elements".



