Operators 1 turned functions into vectors and operators into matrices. This lecture answers the two questions it left open: which matrices may stand for something we can measure, and what happens when two of them do not commute. Both answers are properties of matrices.
Hermitian operators¶
The matrix version of a real number¶
A complex number has a conjugate: flip the sign of , . A number is real when it equals its own conjugate.
A matrix has an adjoint, written : swap rows and columns, then conjugate every entry, . A matrix is Hermitian when it equals its own adjoint.
| numbers | matrices |
|---|---|
| conjugate : flip the sign of | adjoint : swap rows and columns, then conjugate |
| real: | Hermitian: |
Source
# synced: real_vs_hermitian
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"
from matplotlib.patches import Rectangle, FancyArrowPatch
plt.rcParams.update({"axes.spines.top": False, "axes.spines.right": False})
fig, (a1, a2) = plt.subplots(1, 2, figsize=(10.4, 3.9), gridspec_kw={"width_ratios": [1, 1.25], "wspace": 0.12})
a1.axhline(0, color=GRAY, lw=1.8, zorder=1); a1.axvline(0, color=GRAY, lw=0.8, zorder=1) # a number: the real axis is the mirror
a1.text(5.2, 0.15, "real axis = mirror", color=GRAY, fontsize=12, ha="right", va="bottom")
a1.annotate("", xy=(3, -1.75), xytext=(3, 1.75), arrowprops=dict(arrowstyle="<->", color=GRAY, lw=1.4, ls=(0, (3, 2))))
a1.plot(3, 2, "o", color=TEAL, ms=12, zorder=3); a1.text(3.3, 2, r"$z = 3 + 2i$", color=TEAL, fontsize=15, va="center")
a1.plot(3, -2, "o", color=CARDINAL, ms=12, zorder=3); a1.text(3.3, -2, r"$z^* = 3 - 2i$", color=CARDINAL, fontsize=15, va="center")
a1.plot(1.2, 0, "o", color=PURPLE, ms=12, zorder=3)
a1.text(1.2, -0.5, r"real: $w^* = w$", color=PURPLE, fontsize=14, ha="center", va="top")
a1.set_xlim(-0.4, 5.6); a1.set_ylim(-2.7, 2.7); a1.axis("off")
s0 = 1.25 # a matrix: the diagonal is the mirror
for r in range(2):
for c in range(2):
a2.add_patch(Rectangle((c * s0, (1 - r) * s0), s0, s0, fc="#f1ecf7" if r == c else "white", ec=GRAY, lw=1.2, zorder=1))
a2.plot([-0.15, 2 * s0 + 0.15], [2 * s0 + 0.15, -0.15], color=PURPLE, lw=1.6, ls=(0, (4, 3)), zorder=2)
for (xc, yc, lab, col, bg) in ((0.5, 1.5, r"$2$", PURPLE, "#f1ecf7"), (1.5, 0.5, r"$3$", PURPLE, "#f1ecf7"),
(1.55, 1.68, r"$1 - i$", TEAL, "white"), (0.45, 0.32, r"$1 + i$", CARDINAL, "white")):
a2.text(xc * s0, yc * s0, lab, color=col, fontsize=17, ha="center", va="center", zorder=4,
bbox=dict(boxstyle="round,pad=0.15", fc=bg, ec="none"))
a2.add_patch(FancyArrowPatch((1.36 * s0, 1.36 * s0), (0.64 * s0, 0.64 * s0), arrowstyle="<->", mutation_scale=16,
color=GRAY, lw=1.5, zorder=3))
a2.text(2 * s0 + 0.35, 1.75 * s0, "diagonal: on the mirror,\nso it must be real", color=PURPLE, fontsize=13, va="center")
a2.text(2 * s0 + 0.35, 0.95 * s0, r"partners: $(1 - i)^* = 1 + i$", color="k", fontsize=13, va="center")
a2.text(2 * s0 + 0.35, 0.3 * s0, r"$A^\dagger = A$: Hermitian", color="k", fontsize=15, va="center")
a2.set_xlim(-0.3, 6.4); a2.set_ylim(-0.5, 2 * s0 + 0.3); a2.set_aspect("equal"); a2.axis("off")
fig.text(0.01, 0.95, "a number: conjugate = mirror in the real axis", fontsize=13.5, va="top")
fig.text(0.47, 0.95, "a matrix: mirror in the diagonal, then conjugate", fontsize=13.5, va="top")
fig.subplots_adjust(left=0.01, right=0.99, top=0.86, bottom=0.03)
plt.show()
Fig. Left: conjugation mirrors a complex number in the real axis, and a real number sits on the mirror. Right: the adjoint mirrors a matrix in its diagonal and conjugates the entries. In a Hermitian matrix every entry’s mirror partner is its conjugate, and the diagonal entries, which sit on the mirror, must be real.
The adjoint of an operator¶
For an operator, the adjoint is whatever you get by moving from the ket to the bra of an inner product:
For a matrix this is the rule above: swap rows and columns, then conjugate, . An operator that moves across unchanged is Hermitian, or self-adjoint.
The three grid matrices at the end of Operators 1 are Hermitian. Position and energy are real and symmetric. Momentum is imaginary and antisymmetric: transposing flips the sign of every entry and conjugating flips it back.
Why observables must be Hermitian¶
A measurement needs three things from its operator, and Hermitian operators deliver all three.
Real eigenvalues. The eigenvalues are the values a measurement can return, and measured values are real numbers.
Orthogonal eigenfunctions. Eigenfunctions with different eigenvalues satisfy : distinct outcomes are mutually exclusive.
A complete basis. Every state can be written as a sum of the eigenfunctions, so every state has a definite probability for each outcome. That is the subject of Measurement.
Example: real eigenvalues from the quadratic formula
Every Hermitian matrix has the form with and real. Its eigenvalues solve
Under the square root sits a sum of squares, which is never negative, so both eigenvalues are real. For the matrix of the previous example, and 1. The coupling also pushes the two eigenvalues apart, which is why the bonding and antibonding orbitals of ethylene split evenly around the orbital energy (Operators 1, Problem 3).
Proof: the eigenvalues are real
Let with normalized. Use the Hermitian property with both functions equal to :
The bra conjugates the constant it carries. Hermitian means the two are equal, so .
Proof: eigenfunctions with different eigenvalues are orthogonal
Let and with . Both eigenvalues are real. Move across the inner product:
The two are equal, so , and since the overlap vanishes. When several eigenfunctions share one eigenvalue (degeneracy) the argument says nothing, but they can always be combined into orthogonal ones.
The orthogonality is easy to see in the plane:
Source
# synced: eigen_directions
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})
t = np.linspace(0, 2 * np.pi, 400); circ = np.array([np.cos(t), np.sin(t)])
arrow = lambda ax, tip, col, lw: ax.annotate("", xy=tip, xytext=(0, 0), arrowprops=dict(
arrowstyle="-|>", color=col, lw=lw, mutation_scale=16, shrinkA=0, shrinkB=0))
mats = [(np.array([[2.0, 1.0], [1.0, 2.0]]), r"$\binom{2\ \ 1}{1\ \ 2}$", "symmetric"),
(np.array([[1.0, 1.0], [0.0, 2.0]]), r"$\binom{1\ \ 1}{0\ \ 2}$", "not symmetric"),
(np.array([[0.0, 1.0], [-1.0, 0.0]]), r"$\left(\genfrac{}{}{0}{}{\ \ 0\quad 1}{-1\ \ \ 0}\right)$", "a rotation")] # = the two-point d/dx = FS
notes = ["eigen-directions at 90°", "eigen-directions at 45°", "every arrow turns 90° clockwise:\nno eigen-direction"]
fig, axs = plt.subplots(1, 3, figsize=(9.6, 3.9))
for k, (ax, (M, lab, title)) in enumerate(zip(axs, mats)):
ax.plot(*circ, color=GRAY, lw=1, ls=":")
ax.axhline(0, color=GRAY, lw=0.6); ax.axvline(0, color=GRAY, lw=0.6)
w, V = np.linalg.eig(M)
if k < 2:
for j in range(2):
d = V[:, j].real / np.linalg.norm(V[:, j].real); d = d if d[0] >= 0 else -d
ax.plot([-2.6 * d[0], 2.6 * d[0]], [-2.6 * d[1], 2.6 * d[1]], color=TEAL, lw=2.4, ls="--")
ax.text(*(2.75 * d), rf"$\lambda = {w[j].real:.0f}$", color=TEAL, fontsize=13,
ha="left", va="bottom" if d[1] >= 0 else "top")
else:
for deg in (20, 235): # turned clockwise to 290 and 145 degrees, clear of the originals
vv = 1.6 * np.array([np.cos(np.radians(deg)), np.sin(np.radians(deg))])
arrow(ax, vv, TEAL, 2.6); arrow(ax, M @ vv, CARDINAL, 2.6)
arc = np.radians(np.linspace(deg - 8, deg - 80, 30))
ax.plot(0.75 * np.cos(arc), 0.75 * np.sin(arc), color=CARDINAL, lw=1.3)
ax.annotate("", xy=(0.75 * np.cos(np.radians(deg - 86)), 0.75 * np.sin(np.radians(deg - 86))),
xytext=(0.75 * np.cos(arc[-1]), 0.75 * np.sin(arc[-1])),
arrowprops=dict(arrowstyle="-|>", color=CARDINAL, lw=1.3, mutation_scale=12))
ax.set_xlim(-2.9, 3.6); ax.set_ylim(-2.9, 2.9); ax.set_aspect("equal"); ax.axis("off")
ax.set_title(title, fontsize=14.5)
ax.text(0.0, 0.98, lab, transform=ax.transAxes, fontsize=15, va="top")
ax.text(0.5, -0.02, notes[k], transform=ax.transAxes, fontsize=13, ha="center", va="top",
color=CARDINAL if k == 2 else "k")
fig.subplots_adjust(left=0.01, right=0.99, top=0.9, bottom=0.17, wspace=0.08)
plt.show()
Fig. Eigen-directions of three matrices. A symmetric (real Hermitian) matrix has perpendicular eigen-directions. A matrix that is not symmetric can still have real eigenvalues, but its eigen-directions are skewed, here 45° apart. A rotation turns every arrow, so no direction survives and the eigenvalues are complex.
Try the three matrices yourself. For each one, hunt for the eigen-directions or sweep once around the circle, and read off the angle between the directions you find.
What goes wrong without Hermiticity? Take a Hermitian matrix and add a growing non-Hermitian part:
Source
# synced: hermitian_dial
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"
from matplotlib.colors import LinearSegmentedColormap
plt.rcParams.update({"axes.spines.top": False, "axes.spines.right": False})
wt = LinearSegmentedColormap.from_list("wt", ["white", TEAL])
rng = np.random.default_rng(3)
N = 8
A = rng.normal(size=(N, N)) + 1j * rng.normal(size=(N, N))
Hm, K = (A + A.conj().T) / 2, (A - A.conj().T) / 2 # Hermitian part plus anti-Hermitian part
ss = np.concatenate([np.zeros(5), np.linspace(0, 1, 30), np.ones(6)])
vals, ovl = [], []
for s in ss:
w, V = np.linalg.eig(Hm + s * K)
o = np.argsort(w.real)
V = V[:, o] / np.linalg.norm(V[:, o], axis=0)
vals.append(w[o]); ovl.append(np.abs(V.conj().T @ V))
allv = np.concatenate(vals)
fig, (ax, axo) = plt.subplots(1, 2, figsize=(8, 3.6), gridspec_kw={"width_ratios": [1.55, 1], "wspace": 0.25})
ax.axhline(0, color=GRAY, lw=1.2)
ax.text(allv.real.max() + 0.2, 0.15, "real axis", color=GRAY, fontsize=11, ha="right", va="bottom")
scat = ax.scatter(vals[0].real, vals[0].imag, s=70, color=TEAL, zorder=5)
ax.set_xlim(allv.real.min() - 0.5, allv.real.max() + 0.5)
lim = 1.15 * max(0.5, np.abs(allv.imag).max())
ax.set_ylim(-lim, lim)
ax.set_xlabel("Re (eigenvalue)", fontsize=12); ax.set_ylabel("Im (eigenvalue)", fontsize=12)
img = axo.imshow(ovl[0], cmap=wt, vmin=0, vmax=1)
axo.set_xticks([]); axo.set_yticks([])
for sp in axo.spines.values():
sp.set_visible(False)
axo.set_title(r"overlaps $|\langle v_j | v_k \rangle|$", fontsize=13)
fig.subplots_adjust(left=0.09, right=0.98, top=0.84, bottom=0.15)
def update(i):
w, s = vals[i], ss[i]
scat.set_offsets(np.column_stack([w.real, w.imag]))
scat.set_color([TEAL if abs(v.imag) < 1e-6 else CARDINAL for v in w])
img.set_data(ovl[i])
off = (ovl[i] - np.diag(np.diag(ovl[i]))).max()
ax.set_title(rf"$A = H + s\,K$, $s = {s:.2f}$: " + ("eigenvalues real" if s == 0 else f"largest |Im| = {np.abs(w.imag).max():.2f}"),
loc="left", fontsize=12.5)
axo.set_xlabel("eigenvectors orthonormal" if s == 0 else f"largest overlap {off:.2f}", fontsize=12)
ani = FuncAnimation(fig, update, frames=len(ss), interval=110, blit=False)
plt.close(fig)
HTML(ani.to_jshtml())Fig. A Hermitian matrix () has real eigenvalues (left, all on the real axis) and orthonormal eigenvectors, so their overlaps (right) form the identity. Adding times a non-Hermitian part , with , pushes the eigenvalues into the complex plane, and the eigenvectors start to overlap. Neither could describe a measurement.
Hermitian is more than “real eigenvalues”. The matrix has the real eigenvalues 1 and 2, but its eigenvectors overlap (Problem 4). Its outcomes would not be mutually exclusive, so it cannot represent an observable.
Momentum and its ¶
Example: the derivative on two points
On two grid points, with beyond the ends, the derivative matrix is . It turns every arrow by 90°, like the rotation in the figure above, so no direction survives and its eigenvalues are imaginary:
Multiplying by gives the momentum matrix and real eigenvalues:
is times the Hermitian matrix of the example above. The factor in turns the imaginary eigenvalues of the derivative into real momenta. The grid derivative of a plane wave in Operators 1 showed the same on a large grid: eigenvalue , made real by .
Commutators: the order of operations¶
Order matters¶
means: apply first, then . For numbers the order never matters, . For operators, as for matrices, it often does.
Can two observables be sharp at once?¶
A state with a sharp value of an observable is an eigenfunction, . Sharp values of two observables at once need as well. Then the order does not matter on that state:
So two observables can be sharp together only on states where their commutator gives zero. When the commutator gives zero on no state at all, as for position and momentum below, no state is sharp in both.
Two matrices that do not commute¶
The matrix flips an arrow in the axis, and swaps its two components, a mirror in the line . Applied one after the other, the order decides the result:
Source
# synced: flip_swap
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"
from matplotlib.patches import FancyArrowPatch
plt.rcParams.update({"axes.spines.top": False, "axes.spines.right": False})
F = np.array([[1.0, 0.0], [0.0, -1.0]]) # flip: mirror in the x axis
S = np.array([[0.0, 1.0], [1.0, 0.0]]) # swap: mirror in the line y = x
strokes = [np.array([[0.25, 0.2], [0.25, 1.0]]), np.array([[0.25, 1.0], [0.8, 1.0]]),
np.array([[0.25, 0.6], [0.65, 0.6]])] # the letter F, each stroke as rows [x, y]
draw = lambda ax, M, col, lw, ls, alpha: [ax.plot(*(M @ s.T), color=col, lw=lw, ls=ls, alpha=alpha,
solid_capstyle="round") for s in strokes]
fig, axs = plt.subplots(1, 3, figsize=(9.6, 3.7))
panels = [(None, None, "start", ""),
(S, F @ S, r"swap, then flip: $F\,S$", "turned 90° clockwise"),
(F, S @ F, r"flip, then swap: $S\,F$", "turned 90° counterclockwise")]
for ax, (M1, M2, title, note) in zip(axs, panels):
ax.axhline(0, color=GRAY, lw=0.8); ax.axvline(0, color=GRAY, lw=0.8)
draw(ax, np.eye(2), TEAL, 7, "-", 1.0 if M1 is None else 0.3)
if M1 is not None:
draw(ax, M1, GRAY, 3.5, (0, (1.5, 2.5)), 0.8) # after the first step
draw(ax, M2, CARDINAL, 7, "-", 1.0) # after both steps
ax.set_xlim(-1.5, 1.5); ax.set_ylim(-1.5, 1.5); ax.set_aspect("equal"); ax.axis("off")
ax.set_title(title, fontsize=14.5)
ax.text(0.5, -0.02, note, transform=ax.transAxes, fontsize=13, ha="center", va="top", color=CARDINAL)
for ax, (a0, a1) in ((axs[1], (78, -12)), (axs[2], (72, 162))): # the net turn, drawn outside the letters
arc = np.radians(np.linspace(a0, a1, 60))
ax.plot(1.38 * np.cos(arc), 1.38 * np.sin(arc), color=CARDINAL, lw=1.6)
ax.add_patch(FancyArrowPatch((1.38 * np.cos(arc[-4]), 1.38 * np.sin(arc[-4])), (1.38 * np.cos(arc[-1]), 1.38 * np.sin(arc[-1])),
arrowstyle="-|>", mutation_scale=18, color=CARDINAL, lw=1.6))
fig.subplots_adjust(left=0.01, right=0.99, top=0.88, bottom=0.12, wspace=0.08)
plt.show()
Fig. The letter F mirrored twice. Swapping first and then flipping () turns it 90° clockwise; flipping first and then swapping () turns it 90° counterclockwise. Same two steps, opposite results.
Try it: press F and S in either order and watch the letter turn over each mirror. The panel keeps the product of the matrices, written right to left like operators. Play both orders to see the two results side by side, then try F twice, or F S twice.
Both matrices are Hermitian, so both could stand for observables, yet they do not commute, and they share no eigenvector: keeps and , while keeps . These two matrices measure the spin of an electron along and along (Spin); Operators as Matrices works the same product in its Problem 3.
Position and momentum¶
The recipe for any commutator of differential operators: act on a test function , use the product rule, and drop at the end.
Multiply by and the example becomes the most important commutator in quantum mechanics:
Example: on three grid points
On three points spaced apart, , and the momentum matrix has just above the diagonal and just below it. Entry by entry, and , so
Only neighbors survive, and they differ by , which cancels the in :
Acting on a vector, this matrix replaces each value by times the average of its two neighbors. For a smooth function that average is close to the value itself, so : the canonical commutator, as accurate as the grid.
With many points, numpy confirms it. Build on 400 points and apply it to a smooth function:
import numpy as np
N = 400; x = np.linspace(-8, 8, N); dx = x[1] - x[0]
X = np.diag(x)
P = -1j * (np.eye(N, k=1) - np.eye(N, k=-1)) / (2 * dx) # hbar = 1
C = X @ P - P @ X
psi = np.exp(-x**2 / 2) * (1 + 0.3 * x) # any smooth function
print(f"largest |C psi - i psi|: {np.abs(C @ psi - 1j * psi)[5:-5].max():.1e}")
print("largest diagonal entry of C:", np.abs(np.diag(C)).max())largest |C psi - i psi|: 9.0e-04
largest diagonal entry of C: 0.0
matches to about 10-3, the accuracy of the grid, yet the diagonal of is zero. That is no accident:
Why no finite matrices can obey exactly
You might expect to be times the identity matrix. It cannot be. The trace of a product does not depend on the order, , so , while . No pair of matrices satisfies the canonical commutator; only operators on infinitely many dimensions can.
Rules for commutators¶
An operator commutes with itself and its powers: . So .
Swapping the order flips the sign: , so .
Functions of commute with each other: .
A product rule: (Problem 5).
Commuting operators share eigenfunctions¶
Why, in three steps. Suppose no other eigenfunction of has the eigenvalue .
Start from .
Swap the order, which is allowed because the operators commute: .
So is also an eigenfunction of with the eigenvalue . The only such function is itself, up to a constant: .
If several eigenfunctions share an eigenvalue (degeneracy), can mix them, and the shared eigenfunctions are particular combinations, as in the free-particle example above.
The converse: shared eigenfunctions mean the operators commute
Suppose and share a complete set of eigenfunctions, and . Expand an arbitrary function in that set, , and use linearity:
The numbers and are equal, so for every : the operators commute. The argument needs the set to be complete, because the commutator must vanish on every function, not just on a few.
Commuting observables can have sharp values at the same time: a state of definite momentum also has a definite kinetic energy. Position and momentum do not commute, and no state has sharp values of both. Measurement turns this into the uncertainty principle.
The labels of chemistry are shared eigenvalues. The quantum numbers , , of a hydrogen orbital label simultaneous eigenfunctions of three commuting operators, , and (Chapter 5).
The translation table of Operators 1 gains two rows:
| integral | Dirac | numpy on a grid | |
|---|---|---|---|
| adjoint | A.conj().T | ||
| commutator | A @ B - B @ A |
Problems¶
Problem 1: Complete the Hermitian matrix¶
Fill in the missing entries so that each matrix is Hermitian, or explain why it cannot be done:
Solution
Every off-diagonal entry must be the conjugate of its mirror partner, and every diagonal entry must be real.
: the missing entry is .
: , and can be any real number.
: impossible. The diagonal entry is not real, whatever goes in the blank (which would have to be 7).
: , and .
Problem 2: The parity operator¶
The parity operator reflects a function through the origin, . Show that is Hermitian, and find its eigenvalues and eigenfunctions. Which states of the finite square well of Tunneling and the Finite Square Well are eigenfunctions of ?
Solution
Hermitian. Substitute , which maps the interval onto itself:
Eigenvalues. Reflecting twice gives back the function, . If then , so and , real as promised. The eigenfunctions with are the even functions, , and those with the odd ones.
The well. The bound states of the finite well came out even (cosines inside) or odd (sines inside), so each is an eigenfunction of . That is the shared-eigenfunction theorem at work: when , commutes with , and the stationary states can be chosen to have definite parity.
Problem 3: Momentum on a four-point grid¶
Build the momentum matrix on a periodic grid of four points with spacing , using the centered difference and (on a periodic grid the neighbors of point 1 are points 4 and 2). Show that it is Hermitian and find its eigenvalues.
Solution
Row of the derivative matrix holds for the right neighbor and for the left one, wrapping around at the ends. Multiplying by :
The real matrix in parentheses is antisymmetric ( is anti-Hermitian). For , compare with : equal, and likewise for every pair, with zeros on the diagonal. is Hermitian.
import numpy as np
dx = 1.0
M = np.array([[0, 1, 0, -1], [-1, 0, 1, 0], [0, -1, 0, 1], [1, 0, -1, 0]])
P = -1j * M / (2 * dx)
print(np.allclose(P, P.conj().T)) # True
print(np.round(np.linalg.eigvalsh(P), 6)) # [-1. 0. 0. 1.]The eigenvalues are real, and the eigenvectors are discrete plane waves : the grid version of the momentum eigenfunctions.
Problem 4: Real eigenvalues are not enough¶
Find the eigenvalues and normalized eigenvectors of and the overlap between the eigenvectors. Could represent an observable?
Solution
is triangular, so its eigenvalues are the diagonal entries, 1 and 2: both real. The eigenvectors are
is not Hermitian ( but ), and the price is overlapping eigenvectors. A system in state would have a nonzero overlap with the outcome “1”, although it is supposed to give “2” with certainty. The outcomes are not mutually exclusive, so cannot represent an observable.
Problem 5: Commutator algebra¶
Prove the product rule by expanding both sides. Use it, with , to find and .
Problem 6: Momentum and force¶
Show that by acting on a test function. Evaluate it for a particle on a spring, , and for a uniform field, . For which potentials does commute with ?
Problem 7: Why centered differences?¶
Instead of the centered difference, approximate the derivative by the forward difference . Write the forward-difference matrix for three points with beyond the ends, and the momentum matrix . Is Hermitian? Find its eigenvalues (the matrix is triangular). What would a measurement of this “momentum” return, and what does that say about the choice of the centered difference?
Problem 8: Building a shared eigenfunction¶
For a free particle, show that is an eigenfunction of but not of . Which combinations are eigenfunctions of both, and what are their momenta?