Why a new equation?¶
Classical mechanics works at large scales and fails for atoms and molecules. Chapter 1 collected the evidence, and any new equation of motion has to build in two facts from it:
Energy comes in quanta. Blackbody radiation, the photoelectric effect and atomic spectra all require .
Matter is a wave. Electron diffraction and the double slit show that a particle with momentum carries a wavelength .
Chapter 2 gave us the language of waves: complex exponentials, the wave equation, separation of variables, normal modes. In 1926 Erwin Schrödinger, an expert on the physics of waves, put the two quantum relations into that language and found the equation that the matter wave obeys.
The Schrödinger equation is a fundamental law. It cannot be derived from anything more basic; it can only be motivated and then tested. In the century since, it has passed every test it was given, from the spectrum of hydrogen to the structure of molecules and solids.

Figure 1:Fig. Entering the quantum world.
Building the equation¶
We follow Schrödinger’s reasoning in three steps: write down the wave of a free particle, see what its derivatives give back, and then demand that energy is conserved.
Step 1: the wave of a free particle¶
The complex traveling wave of Chapter 2 moves to the right with wavenumber and angular frequency :
Now insert the two quantum relations. De Broglie ties the wavenumber to the momentum, and Planck ties the frequency to the energy:
The wave has to be complex, and the reason is physical. A free particle with a definite momentum has no preferred position, so the chance of finding it must be the same everywhere and at all times. A real wave cannot do that: its square vanishes at nodes that sweep along with the wave. The complex wave can. Its real and imaginary parts run a quarter cycle apart, so when one is zero the other is at its maximum, and stays perfectly flat.
Source
# synced: complex_plane_wave
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from IPython.display import HTML
TEAL, CARDINAL, GRAY, PURPLE, ORANGE = "#107895", "#C8102E", "#6c757d", "#6a3d9a", "#e07b00"
plt.rcParams.update({"axes.spines.top": False, "axes.spines.right": False})
k, w = 2 * np.pi / 4.0, 2 * np.pi # lambda = 4, one period per loop
x = np.linspace(0, 12, 600)
ts = np.linspace(0, 1, 36, endpoint=False)
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(8, 4.0), sharex=True,
gridspec_kw={"height_ratios": [1.25, 1]})
(re,) = ax1.plot([], [], color=TEAL, lw=2.4, label=r"Re $\Psi = \cos(kx-\omega t)$")
(im,) = ax1.plot([], [], color=ORANGE, lw=2.0, ls="--", label=r"Im $\Psi = \sin(kx-\omega t)$")
ax1.axhline(0, color=GRAY, lw=0.6)
ax1.set_ylim(-1.3, 1.95); ax1.set_yticks([-1, 0, 1]); ax1.set_ylabel(r"$\Psi$")
ax1.legend(loc="upper right", frameon=False, fontsize=9.5, ncol=2)
ax1.set_title(r"free particle $\Psi = e^{i(kx-\omega t)}$: two real waves, a quarter cycle apart",
loc="left", fontsize=11)
real2 = ax2.fill_between(x, 0 * x, color=GRAY, alpha=0.25, lw=0)
(real2_line,) = ax2.plot([], [], color=GRAY, lw=1.4, label=r"a real wave, $\cos^2(kx-\omega t)$: moving dead spots")
ax2.plot(x, np.ones_like(x), color=CARDINAL, lw=2.8, label=r"$|\Psi|^2 = \mathrm{Re}^2 + \mathrm{Im}^2 = 1$ everywhere")
ax2.set_xlim(0, 12); ax2.set_ylim(0, 1.75); ax2.set_yticks([0, 1])
ax2.set_xlabel("x"); ax2.set_ylabel("probability density")
ax2.legend(loc="upper right", frameon=False, fontsize=9.5, ncol=1)
fig.tight_layout()
def update(i):
ph = k * x - w * ts[i]
re.set_data(x, np.cos(ph)); im.set_data(x, np.sin(ph))
real2_line.set_data(x, np.cos(ph) ** 2)
real2.set_data(x, 0 * x, np.cos(ph) ** 2)
ani = FuncAnimation(fig, update, frames=len(ts), interval=85, blit=False)
plt.close(fig)
HTML(ani.to_jshtml())Fig. A free particle moving to the right. Top: the real and imaginary parts of are two ordinary traveling waves a quarter cycle apart. Bottom: their squares add up to a constant, so the particle is equally likely to be found anywhere, while the square of a single real wave would have dead spots moving along .
Step 2: derivatives pull out the energy and the momentum¶
Differentiate the free-particle wave with respect to time. The exponential comes back multiplied by . Moving the constants to the left side:
Differentiate with respect to position. One derivative returns the momentum, two derivatives return the kinetic energy:
Read these three lines as questions put to the wave. The operation asks “what is your energy?”, asks “what is your momentum?”, and the wave answers by returning itself times the number. This is the first appearance of operators, to which we return at the end of the lecture.
Step 3: demand that energy is conserved¶
A particle moving in a potential has total energy equal to kinetic plus potential energy:
Multiply both sides by , then replace and with the derivatives from Step 2:
Every term of the equation is an energy acting on the wavefunction, so the equation is energy conservation written in the language of waves:
What we did is a motivation and not a derivation. The steps hold for one plane wave and a constant . Schrödinger’s postulate is that the same equation governs any wavefunction in any potential . Only the agreement with experiment justifies that leap.
We work in one dimension for simplicity. In three dimensions the second derivative becomes the Laplacian, , and depends on .
Why not reuse the classical wave equation?
The classical wave equation has two derivatives in space and two in time. Acting on they bring down and , so the equation enforces : frequency proportional to wavenumber.
A free quantum particle obeys a different rule. With and , the energy reads
so the frequency goes as the square of the wavenumber. An equation that produces one power of and two powers of needs one time derivative and two space derivatives. The single time derivative returns , which is imaginary, while the two space derivatives return , which is real. The factor in the Schrödinger equation is there to balance the two sides.
Quantum versus classical wave equation¶
| classical wave equation | Schrödinger equation | |
|---|---|---|
| equation | ||
| time derivative | second | first, with a factor |
| the wave | real displacement , directly measurable | complex , only is measurable |
| frequency and wavenumber | for a free particle | |
| what defines the system | wave speed and the boundaries | mass , potential and the boundaries |
| time dependence of a mode | real oscillation | rotating phase |
| linear, so solutions add | yes | yes |
Solving the equation: separation of variables¶
The equation is linear and, as long as does not depend on time, it separates. The recipe is the one we used for the vibrating string.
Step 1: plug in a product¶
Look for solutions in which the dependence on and on factorizes, . Each derivative acts on one factor only:
Divide both sides by :
The left side depends only on and the right side only on , so both must equal the same constant. It has units of energy, and we call it . One PDE has become two ODEs.
Step 2: the time part is a rotating phase¶
The time equation is first order, . The trial function gives a single root , which is purely imaginary. In Chapter 2 imaginary roots meant oscillation, and the same holds here:
This is a point moving around the unit circle of the complex plane with angular frequency . The separation constant is the energy of Planck’s relation , which justifies its name.
Step 3: the spatial part is the time-independent Schrödinger equation¶
Almost all of the work in this course goes into this equation. The potential defines the system, and solving the equation gives the shapes and the energies the system can have.
Stationary states: the phase turns, the density stays¶
The name comes from the probability density. The time factor has absolute value one, so it drops out:
The real and imaginary parts of slosh back and forth forever, yet nothing measurable moves. A string mode of Chapter 2 passes through the flat shape twice per period. A stationary state never goes flat, because its imaginary part is at its largest when its real part vanishes.
The animation uses the two lowest states of a particle held between two walls. Their shapes are the sines of the string modes, as we will show in the next lecture. The second state has four times the energy, so its phase clock runs four times faster.
Source
# synced: phase_clock
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from IPython.display import HTML
TEAL, CARDINAL, GRAY, PURPLE, ORANGE = "#107895", "#C8102E", "#6c757d", "#6a3d9a", "#e07b00"
plt.rcParams.update({"axes.spines.top": False, "axes.spines.right": False})
x = np.linspace(0, 1, 300)
ts = np.linspace(0, 1, 36, endpoint=False) # one full turn of the n = 1 clock
th = np.linspace(0, 2 * np.pi, 200)
fig = plt.figure(figsize=(8, 4.3))
gs = fig.add_gridspec(2, 2, width_ratios=[3.4, 1], hspace=0.5, wspace=0.08)
rows = []
for r, n in enumerate((1, 2)):
ax, axc = fig.add_subplot(gs[r, 0]), fig.add_subplot(gs[r, 1])
psi = np.sqrt(2) * np.sin(n * np.pi * x)
ax.fill_between(x, psi**2, color=CARDINAL, alpha=0.12, lw=0)
ax.plot(x, psi**2, color=CARDINAL, lw=1.8, label=r"$|\Psi|^2$ (does not move)")
(re,) = ax.plot([], [], color=TEAL, lw=2.4, label=r"Re $\Psi$")
(im,) = ax.plot([], [], color=ORANGE, lw=2.0, ls="--", label=r"Im $\Psi$")
ax.axhline(0, color=GRAY, lw=0.6)
ax.set_xlim(0, 1); ax.set_ylim(-1.7, 2.3); ax.set_yticks([-1, 0, 1, 2])
ax.set_xticks([0, 0.5, 1]); ax.set_xticklabels(["0", "L/2", "L"])
ax.set_title(rf"$\Psi_{n}(x,t) = \psi_{n}(x)\,e^{{-iE_{n}t/\hbar}}$" + ("" if n == 1 else r", $E_2 = 4E_1$"),
loc="left", fontsize=11)
if r == 0:
ax.legend(loc="upper right", frameon=False, fontsize=9, ncol=3, bbox_to_anchor=(1.0, 1.32))
axc.plot(np.cos(th), np.sin(th), color=GRAY, lw=1, ls="--")
axc.axhline(0, color=GRAY, lw=0.6); axc.axvline(0, color=GRAY, lw=0.6)
(hand,) = axc.plot([], [], color=PURPLE, lw=2.8)
(tip,) = axc.plot([], [], "o", color=PURPLE, ms=7)
axc.set_aspect("equal"); axc.set_xlim(-1.25, 1.25); axc.set_ylim(-1.25, 1.25); axc.set_axis_off()
axc.set_title("phase clock" if r == 0 else "4 times faster", fontsize=10, color=PURPLE)
rows.append((n, psi, re, im, hand, tip))
fig.subplots_adjust(left=0.06, right=0.99, top=0.86, bottom=0.08)
def update(i):
for n, psi, re, im, hand, tip in rows:
z = np.exp(-2j * np.pi * n**2 * ts[i])
re.set_data(x, psi * z.real); im.set_data(x, psi * z.imag)
hand.set_data([0, z.real], [0, z.imag]); tip.set_data([z.real], [z.imag])
ani = FuncAnimation(fig, update, frames=len(ts), interval=110, blit=False)
plt.close(fig)
HTML(ani.to_jshtml())Fig. Two stationary states of a particle between walls at 0 and . The real and imaginary parts oscillate at the rate set by the phase clock on the right, while the probability density stays fixed.
The time-independent equation is a curvature equation¶
Solve the time-independent equation for the second derivative:
This is the spatial equation of the string, , with . There the sign of decided between sines and exponentials. Here the sign of decides, and it can change from place to place:
Allowed region, . The kinetic energy is positive. The curvature has the opposite sign to , so the wavefunction always bends back toward the axis and oscillates. The larger , the stronger the curvature and the shorter the wavelength, in line with de Broglie: .
Forbidden region, . A classical particle could never be here, since its kinetic energy would be negative. The curvature has the same sign as , so the wavefunction bends away from the axis: it decays or grows exponentially. It is not zero there, a fact that leads to tunneling.
Source
# synced: allowed_forbidden
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from IPython.display import HTML
TEAL, CARDINAL, GRAY, PURPLE, ORANGE = "#107895", "#C8102E", "#6c757d", "#6a3d9a", "#e07b00"
plt.rcParams.update({"axes.spines.top": False, "axes.spines.right": False})
a, V0, N = 1.2, 30.0, 700 # half width, depth (units hbar^2/2m = 1)
x = np.linspace(-3.4, 3.4, N); h = x[1] - x[0]
V = np.where(np.abs(x) < a, 0.0, V0)
H = (np.diag(2.0 / h**2 + V) - np.diag(np.ones(N - 1) / h**2, 1)
- np.diag(np.ones(N - 1) / h**2, -1))
En, vec = np.linalg.eigh(H)
n = 3 # fourth level: three nodes, long tails
E, psi = En[n], vec[:, n] / np.abs(vec[:, n]).max()
psi = psi * np.sign(psi[np.argmax(np.abs(psi))])
fig, ax = plt.subplots(figsize=(8, 3.4))
ax.axvspan(-a, a, color=TEAL, alpha=0.08, lw=0)
ax.axvspan(-3.4, -a, color=CARDINAL, alpha=0.06, lw=0)
ax.axvspan(a, 3.4, color=CARDINAL, alpha=0.06, lw=0)
ax.plot(x, V, color="k", lw=2.0)
ax.axhline(E, color=GRAY, lw=1.2, ls="--")
ax.plot(x, E + 7.5 * psi, color=TEAL, lw=2.6)
ax.text(3.35, E + 0.9, "E", color=GRAY, fontsize=11, ha="right")
ax.text(3.35, V0 + 0.9, "V(x)", color="k", fontsize=11, ha="right")
ax.text(0, 38.5, r"allowed, $E > V$" + "\n" + r"$\psi$ curves toward the axis: oscillates",
ha="center", va="top", fontsize=10, color=TEAL)
for xc in (-2.35, 2.35):
ax.text(xc, 38.5, r"forbidden, $E < V$" + "\n" + "curves away: decays",
ha="center", va="top", fontsize=10, color=CARDINAL)
ax.set_xlim(-3.4, 3.4); ax.set_ylim(-2, 39.5)
ax.set_xlabel("x"); ax.set_ylabel("energy"); ax.set_yticks([])
fig.tight_layout()
plt.show()
Fig. The fourth state of a particle in a well of finite depth, drawn on its energy level. Inside the well and oscillates; in the walls and decays.
Why only some energies are allowed¶
In a forbidden region the general solution is a mix of a decaying and a growing exponential. A wavefunction that grows without limit cannot describe a particle, so the growing part has to be absent on the left and on the right.
For most energies this is impossible. Start the solution so that it decays properly on the left and follow the curvature equation across the well: it arrives on the right side with some of the growing exponential mixed in, and it blows up. Only at special energies does the solution arrive with the right slope to decay on both sides. These are the allowed energies.
Try it for a particle on a spring, . The cell below starts from a tiny value on the far left and integrates the curvature equation to the right for the trial energy you choose. Find the energies between 0 and for which the right tail comes down to the axis, and count the nodes of each solution.
Fig. A trial solution of the time-independent equation for a particle on a spring, drawn on its energy level. It is bounded only at in units of .
The pattern is the one we met on the string, where clamped ends allowed only the wavelengths that fit. Here the requirement that stays finite allows only the energies that fit. The Schrödinger equation does not contain quantization; the boundary conditions put it there. Each new allowed state has one more node than the one below it.
The allowed energies of the spring turn out to be evenly spaced, . We derive this in Chapter 4, where it explains molecular vibrations.
What does the wavefunction mean?¶
We now have the equation and a strategy for solving it. What we do not have yet is the meaning of the object the equation keeps handing us.
In the classical wave equation, is something you can see: the height of a guitar string above its resting position. The quantum wavefunction is complex, so it cannot stand for any measurable quantity by itself.
The interpretation that survived every experimental test was proposed by Max Born in 1926. The wavefunction is a probability amplitude, and its absolute square is a probability density:
One measurement of position gives one dot at one place, and the wavefunction does not say where the next dot lands. Its content shows up only in the statistics: repeat the experiment on many identically prepared particles, and the dots pile up in proportion to . Where has a node, no particle is ever found.
Source
# synced: born_buildup
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from IPython.display import HTML
TEAL, CARDINAL, GRAY, PURPLE, ORANGE = "#107895", "#C8102E", "#6c757d", "#6a3d9a", "#e07b00"
plt.rcParams.update({"axes.spines.top": False, "axes.spines.right": False})
rng = np.random.default_rng(7)
cand = rng.random(14000)
hits = cand[rng.random(14000) < np.sin(2 * np.pi * cand) ** 2][:3000] # samples of 2 sin^2(2 pi x)
yj = rng.random(3000)
counts = np.unique(np.round(np.geomspace(1, 3000, 40)).astype(int))
edges = np.linspace(0, 1, 31); mid = 0.5 * (edges[1:] + edges[:-1]); dx = edges[1] - edges[0]
xs = np.linspace(0, 1, 300)
fig, (ax_s, ax_h) = plt.subplots(2, 1, figsize=(8, 4.0), sharex=True,
gridspec_kw={"height_ratios": [1, 2.3]})
scat = ax_s.scatter([], [], s=5, color=TEAL, alpha=0.6, lw=0)
ax_s.set_ylim(0, 1); ax_s.set_yticks([])
for sp in ("left", "bottom"):
ax_s.spines[sp].set_visible(False)
ax_s.tick_params(bottom=False)
bars = ax_h.bar(mid, np.zeros_like(mid), width=0.92 * dx, color=TEAL, alpha=0.5, label="detections per bin")
(curve,) = ax_h.plot([], [], color=CARDINAL, lw=2.6, label=r"prediction $N\,|\psi(x)|^2\,\Delta x$")
ax_h.set_xlim(0, 1); ax_h.set_yticks([])
ax_h.set_xticks([0, 0.5, 1]); ax_h.set_xticklabels(["0", "L/2", "L"])
ax_h.set_xlabel("position x"); ax_h.set_ylabel("detections")
ax_h.legend(loc="upper center", frameon=False, fontsize=9.5, ncol=2, bbox_to_anchor=(0.5, 1.17))
ax_s.set_title("N = 1 detection, one dot each", loc="left", fontsize=11)
fig.tight_layout()
def update(i):
N = counts[i]
scat.set_offsets(np.column_stack([hits[:N], yj[:N]]))
hist = np.histogram(hits[:N], bins=edges)[0]
for b, c in zip(bars, hist):
b.set_height(c)
curve.set_data(xs, N * dx * 2 * np.sin(2 * np.pi * xs) ** 2)
ax_h.set_ylim(0, 1.3 * max(1.0, hist.max(), 2 * N * dx))
ax_s.set_title(f"N = {N} detection" + ("" if N == 1 else "s") + ", one dot each", loc="left", fontsize=11)
ani = FuncAnimation(fig, update, frames=len(counts), interval=160, blit=False)
plt.close(fig)
HTML(ani.to_jshtml())Fig. Position measurements on particles that were all prepared in the same state . Single detections look random; the histogram of many detections converges to , with a gap at the node.
The same holds in three dimensions, where is the probability of finding the particle in a small volume. The “electron cloud” pictures of chemistry are this statement: each dot below is one position measurement on a hydrogen atom in its ground state, and the cloud of many dots traces out the 1s orbital.
Source
# synced: h1s_cloud
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from IPython.display import HTML
TEAL, CARDINAL, GRAY, PURPLE, ORANGE = "#107895", "#C8102E", "#6c757d", "#6a3d9a", "#e07b00"
plt.rcParams.update({"axes.spines.top": False, "axes.spines.right": False})
rng = np.random.default_rng(11)
N = 5000
r = 0.5 * rng.gamma(shape=3.0, scale=1.0, size=N) # P(r) = 4 r^2 exp(-2r), r in units of a0
cos_t = 1 - 2 * rng.random(N); phi = 2 * np.pi * rng.random(N)
xx, zz = r * np.sqrt(1 - cos_t**2) * np.cos(phi), r * cos_t
rr = np.linspace(0, 6, 300)
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(8, 3.5), gridspec_kw={"width_ratios": [1, 1.35]})
ax1.scatter(xx, zz, s=2, color=TEAL, alpha=0.45, lw=0)
ax1.plot([0], [0], "+", color=CARDINAL, ms=9, mew=1.8)
ax1.set_aspect("equal"); ax1.set_xlim(-5, 5); ax1.set_ylim(-5, 5)
ax1.set_xlabel(r"x / $a_0$"); ax1.set_ylabel(r"z / $a_0$")
ax1.set_title(f"{N} position measurements", loc="left", fontsize=11)
ax2.hist(r, bins=np.linspace(0, 6, 49), density=True, color=TEAL, alpha=0.45, label="measured distances")
ax2.plot(rr, 4 * rr**2 * np.exp(-2 * rr), color=CARDINAL, lw=2.6, label=r"$4\pi r^2\,|\psi_{1s}|^2$")
ax2.set_xlim(0, 6); ax2.set_xlabel(r"distance from the nucleus r / $a_0$"); ax2.set_ylabel("probability density")
ax2.legend(frameon=False, fontsize=10)
ax2.set_title("the dots follow the wavefunction", loc="left", fontsize=11)
fig.tight_layout()
plt.show()
Fig. Left: simulated position measurements of the electron in the hydrogen 1s state, projected on a plane. Right: the measured distances from the nucleus follow the radial distribution computed from the wavefunction (Chapter 5).
Probability refresher
A random variable assigns a number to the outcome of an experiment. It can be discrete (a die roll, a coin flip) or continuous (the position of a particle). A continuous random variable is described by a probability density with these properties:
Non-negative: .
Normalized: , because the outcome is certain to lie somewhere.
Mean: , and for any function .
Variance: , the squared width of the distribution.
For a discrete variable the integrals become sums, .
Fair coin, with : the mean is , and since the variance is .
Uniform density on , : the mean is , the mean square is , and .
Gaussian, : normalized, with mean and variance .
More practice: a video overview and an interactive probability explorer.
Normalization¶
The particle is certain to be found somewhere, so the probabilities must add up to one:
The Schrödinger equation is linear, so if solves it then does too, for any constant . The equation therefore never fixes the overall size of a wavefunction. Normalization does: substitute into the condition and solve for .
A wavefunction that cannot be normalized, because the integral of is infinite, does not describe a particle. This is the requirement that ruled out the diverging solutions in the slider above.
In three dimensions the integral runs over all of space, .
Source
# synced: normalization_area
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from IPython.display import HTML
TEAL, CARDINAL, GRAY, PURPLE, ORANGE = "#107895", "#C8102E", "#6c757d", "#6a3d9a", "#e07b00"
plt.rcParams.update({"axes.spines.top": False, "axes.spines.right": False})
x = np.linspace(0, 1, 300)
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(8, 2.9), sharey=True)
for ax, c, col, lab, area in ((ax1, 1.0, GRAY, r"$\psi' = x$", "area = 1/3"),
(ax2, 3.0, TEAL, r"$\psi = \sqrt{3}\,x$", "area = 1")):
ax.fill_between(x, c * x**2, color=col, alpha=0.25, lw=0)
ax.plot(x, c * x**2, color=col, lw=2.6)
ax.text(0.06, 2.55, lab, fontsize=12, color=col)
ax.text(0.80, 0.18 * c + 0.05, area, fontsize=11, ha="center", color="k")
ax.set_xlim(0, 1); ax.set_ylim(0, 3.1); ax.set_xlabel("x")
ax1.set_ylabel(r"$|\psi(x)|^2$")
ax1.set_title("not normalized", loc="left", fontsize=11)
ax2.set_title("normalized: a probability density", loc="left", fontsize=11)
fig.tight_layout()
plt.show()
Fig. Normalization rescales the wavefunction until the area under equals one.
Probability of finding the particle in a region¶
Once is normalized, the probability of finding the particle anywhere between and is the area under over that interval:
In three dimensions the same integral runs over a volume.
Move the edges of the region and check the example.
Fig. The probability of finding the particle in a region is the shaded area under .
Mean and spread of position¶
A probability density also predicts averages. The mean of many position measurements is the expectation value of , and the spread of the results around it is the standard deviation :
is the balance point of the density. It is not the most likely position, and it need not even be a position where the particle can be found: for in the animation above, sits exactly on the node.
Source
# synced: mean_and_spread
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from IPython.display import HTML
TEAL, CARDINAL, GRAY, PURPLE, ORANGE = "#107895", "#C8102E", "#6c757d", "#6a3d9a", "#e07b00"
plt.rcParams.update({"axes.spines.top": False, "axes.spines.right": False})
x = np.linspace(0, 1, 2001)
fig, axes = plt.subplots(1, 2, figsize=(8, 3.0), sharey=True)
for ax, p, col, lab in ((axes[0], 3 * x**2, TEAL, r"$|\psi|^2 = 3x^2$"),
(axes[1], 2 * np.sin(np.pi * x) ** 2, ORANGE, r"$|\psi_1|^2 = 2\sin^2(\pi x)$")):
mu = np.trapezoid(x * p, x)
sig = np.sqrt(np.trapezoid(x**2 * p, x) - mu**2)
ax.fill_between(x, p, color=col, alpha=0.2, lw=0); ax.plot(x, p, color=col, lw=2.6)
ax.axvspan(mu - sig, mu + sig, color=PURPLE, alpha=0.12, lw=0)
ax.axvline(mu, color=PURPLE, lw=1.6)
ax.plot([mu], [-0.16], marker="^", color=PURPLE, ms=11, clip_on=False, zorder=6)
ax.set_title(lab + rf": $\langle x\rangle = {mu:.2f}$, $\sigma_x = {sig:.2f}$", loc="left", fontsize=10.5)
ax.set_xlim(0, 1); ax.set_ylim(0, 3.2); ax.set_xlabel("x")
ax.set_xticks([0, 0.25, 0.5, 0.75, 1]); ax.tick_params(axis="x", pad=9)
axes[0].set_ylabel("probability density")
axes[0].text(0.75 - 0.21, 2.75, r"$\pm\sigma_x$", color=PURPLE, fontsize=11, ha="right")
fig.tight_layout()
plt.show()
Fig. The mean (line and triangle) is the balance point of the probability density, and the band marks one standard deviation on each side. Left: the density of the example. Right: the ground state of a particle between walls, whose mean sits at the center by symmetry.
Operators: a first look¶
Position was easy, because is just a number that multiplies . Momentum and energy are different. In Step 2 we extracted them from the wave by differentiating, and that idea organizes the rest of quantum mechanics. This section is a preview; Operators 1, Operators 2 and Eigenvalues and Expectation Values develop it in full.
An operator is an instruction that turns one function into another, written with a hat. Every observable of classical mechanics has a quantum operator. The recipe: write the classical expression in terms of and , then replace with .
| observable | classical | quantum operator |
|---|---|---|
| position | ||
| momentum | ||
| potential energy | ||
| kinetic energy | ||
| total energy |
The operator of the total energy is the Hamiltonian, named after the total energy function of classical mechanics. With it both Schrödinger equations fit on one line.
Different systems differ only in : is a free particle, a particle on a spring (a vibrating bond), the electron of a hydrogen atom.
Eigenfunctions and eigenvalues¶
An operator usually changes the shape of the function it acts on. The special functions that come back unchanged, multiplied by a constant, are its eigenfunctions, and the constant is the eigenvalue:
Source
# synced: eigen_test
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from IPython.display import HTML
TEAL, CARDINAL, GRAY, PURPLE, ORANGE = "#107895", "#C8102E", "#6c757d", "#6a3d9a", "#e07b00"
plt.rcParams.update({"axes.spines.top": False, "axes.spines.right": False})
x = np.linspace(-3, 3, 500); a = 1.5
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(8, 3.0))
ax1.plot(x, np.sin(a * x), color=TEAL, lw=2.6, label=r"$f = \sin(ax)$")
ax1.plot(x, -a**2 * np.sin(a * x), color=CARDINAL, lw=2.2, ls="--", label=r"$f'' = -a^2 \sin(ax)$")
ax1.set_title(r"same shape, rescaled: eigenfunction of $d^2/dx^2$", loc="left", fontsize=10.5)
ax2.plot(x, np.exp(-x**2), color=TEAL, lw=2.6, label=r"$f = e^{-x^2}$")
ax2.plot(x, (4 * x**2 - 2) * np.exp(-x**2), color=CARDINAL, lw=2.2, ls="--", label=r"$f'' = (4x^2-2)\,e^{-x^2}$")
ax2.set_title("new shape: not an eigenfunction", loc="left", fontsize=10.5)
for ax in (ax1, ax2):
ax.axhline(0, color=GRAY, lw=0.6); ax.set_xlim(-3, 3); ax.set_ylim(-2.6, 3.6); ax.set_xlabel("x")
ax.legend(loc="upper right", frameon=False, fontsize=9.5)
fig.tight_layout()
plt.show()
Fig. Testing two functions against the operator . Left: comes back with the same shape, multiplied by , so it is an eigenfunction. Right: the Gaussian comes back with a different shape, so it is not.
The time-independent Schrödinger equation is exactly such a problem. The slider above was a search for its eigenvalues by hand.
Expectation values¶
For position we averaged over the density . An operator such as has to act on before we multiply by , so it sits between the two:
| average | operator inside the integral |
|---|---|
Linearity and superposition¶
is a linear operator, so any sum of solutions is again a solution. As for the string, the general solution is a sum over the stationary states, each turning at its own rate:
A single stationary state has a frozen probability density. A sum of two does not, because their phase clocks run at different rates and the relative phase changes in time (Problem 2). All motion in quantum mechanics comes from superposition, the subject of Time Dependence.
Looking ahead¶
The next lecture carries out this program for the simplest potential there is: a particle in a box, between two impenetrable walls. The curvature equation gives sines, the walls pick out the allowed ones, normalization fixes their height, and the expectation values of this lecture turn them into predictions.
Problems¶
Problem 1: The plane wave solves the free equation¶
Show that solves the time-dependent Schrödinger equation with only if .
Solution
Problem 2: One stationary state stands still, two do not¶
Let and be real, normalized stationary states with energies and . Compute the probability density of the superposition
and find the frequency at which it oscillates.
Solution
Problem 3: Normalize and locate¶
Normalize on the interval , then compute the probability of finding the particle in .
Solution
Problem 4: Eigenfunctions of momentum and kinetic energy¶
Decide whether each function is an eigenfunction of the momentum operator, of the kinetic energy operator, of both, or of neither:
Solution
Apply the momentum operator to the first function:
The sine turned into a cosine, so is not an eigenfunction of momentum. The kinetic energy operator gives
The same function came back, so is an eigenfunction of kinetic energy with eigenvalue .
For the second function:
It is an eigenfunction of momentum with eigenvalue : a wave moving to the left. Applying the momentum operator twice gives , so it is an eigenfunction of kinetic energy too.
A state of definite momentum always has a definite kinetic energy. The reverse is not true: is an equal mix of and , waves moving right and left with the same kinetic energy.
Problem 5: Testing a Gaussian¶
Check whether is an eigenfunction of .
Solution
The factor in front depends on , so the result is not a constant times : the Gaussian is not an eigenfunction of . This is the right panel of the eigenfunction figure, with . Notice, though, that : the Gaussian is an eigenfunction once a potential proportional to is added. It is the ground state of the particle on a spring that you found with the slider.
Problem 6: Find the levels by hand¶
Use the trial-energy slider to find every allowed energy of the particle on a spring below . For each one record the number of nodes. How is the number of nodes related to the order of the levels? Compare with the modes of a string.
Problem 7: Allowed and forbidden regions¶
A particle with energy moves in . Find the two turning points where . Sketch the state with two nodes and mark where oscillates and where it decays. Where is the local wavelength shortest, and why?
Problem 8: A particle in a cube¶
Let inside the unit cube and zero outside. Verify that is normalized, then find the probability that the particle is in the corner box . Compare with the fraction of the volume that the box takes up.
Problem 9: Symmetry does the integrals¶
For the state on , evaluate and , and explain both results using symmetry alone.
Problem 10: Spread of the ground state¶
For on compute and , and compare with the value quoted in the figure on mean and spread. (Integrate by parts, or use .)