University Physics V · Angular Momentum in Quantum Mechanics · 9.4
Angular Momentum Matrices & the Uncertainty Bound
The ladder argument handed you a spectrum and no object to compute with. This topic hands you the object: one (2j+1)-square array per component, filled from a single square root, that you can multiply, commute and diagonalise in ten lines of NumPy — and then read the uncertainty bound straight off the commutator.
Build the model
Connect the measurement to the mechanism.
Angular momentum was quantised by algebra alone, and the same algebra is what makes it computable. Fix the basis |j, m⟩ of simultaneous eigenvectors of J² and Jz, ordered m = j down to −j, and every component becomes a finite Hermitian matrix whose entries are the inner products ⟨j, m′|Jᵢ|j, m⟩. Jz is diagonal with mħ; J₊ is a single stripe above the diagonal carrying ħ√(j(j+1) − m(m+1)); J₋ is its adjoint; Jₓ and Jy are the Hermitian combinations (J₊ + J₋)/2 and (J₊ − J₋)/2i, each entry half a ladder element.
Nothing else is needed. The commutators, the Casimir J² = ħ² j(j+1) I, the rotation exp(−iθ n⋅J/ħ) and the spectrum of J along any axis all fall out of matrix arithmetic, and a commutator residual near machine ε is the proof that your arrays are the representation and not a transcription error. The price is written in the same algebra: [Jₓ, Jy] = iħJz fed into the Robertson inequality returns ΔJₓ ΔJy ≥ (ħ/2)|⟨Jz⟩|, a floor that moves with the state and forbids sharp Jₓ and Jy whenever ⟨Jz⟩ ≠ 0.
In |j, m⟩ itself the transverse spreads are each ħ√((j(j+1) − m²)/2), never zero, so the familiar cone of half-angle cos θ = m/√(j(j+1)) is a diagram of variances: it has no azimuth, nothing on it moves, and it is not a trajectory.
- Simple definition
- The matrix representation of angular momentum writes Jₓ, Jy and Jz as (2j+1)×(2j+1) Hermitian matrices whose entries are ⟨j, m′|Jᵢ|j, m⟩ in the eigenbasis of J² and Jz, so operator identities become checks on matrix products.
- Example
- For j = 1 the entries are Jz = ħ diag(1, 0, −1) and Jₓ = (ħ/√2) times the tridiagonal matrix with 1s beside the diagonal; multiplying out JₓJy − JyJₓ returns iħ diag(1, 0, −1) entry by entry, which is iħJz.
The only input. J₊ is the stripe just above the diagonal in the m-descending ordering, J₋ = J₊† the stripe just below, and every entry of Jₓ and Jy is half of one of these numbers.
j, m dimensionless; ħ = 1.055 × 10⁻³⁴ J s carries the unit; the Condon–Shortley phase makes every entry real and ≥ 0
Hermiticity is built in because J₋ = J₊†. The 1/2 and 1/2i are where hand-built matrices most often go wrong, and the error shows up later as every variance four times too large.
ordering m = j down to −j; Jₓ real symmetric, Jy imaginary antisymmetric, Jz real diagonal — all three Hermitian
Two lines of NumPy that catch a wrong sign, a dropped half or a mis-ordered basis before anything downstream inherits the mistake.
I the (2j+1)-square identity; in float64 the Frobenius norm of JₓJy − JyJₓ − iħJz should sit near 10⁻¹⁵ ħ²
Read straight off σA σB ≥ ½|⟨[A, B]⟩| with [Jₓ, Jy] = iħJz. Cyclic permutation gives the other two pairs, and all three go empty wherever the mean on the right vanishes.
ΔJᵢ = √(⟨Jᵢ²⟩ − ⟨Jᵢ⟩²), in units of ħ; the right side is an expectation in the same state, so the floor moves with the state
Never zero, even at m = j, where product and bound both equal j ħ²/2: the stretched state saturates the inequality and every other m sits strictly above it.
from Jₓ² + Jy² = J² − Jz² and the x–y symmetry of the state; the product is (j(j+1) − m²) ħ²/2 against a bound of |m| ħ²/2
Rotational invariance made concrete: diagonalise n⋅J numerically for a random n and the same 2j+1 numbers return, each with a new eigenvector.
n a unit vector; the eigenvectors are U|j, m⟩, U the rotation carrying z into n — they change while the eigenvalues do not
Choose the basis before you write a single entry
A matrix element is meaningless until the basis is named. Take the 2j+1 simultaneous eigenvectors |j, m⟩ of J² and Jz, orthonormal, and order them m = j, j−1, …, −j from the top row down. That ordering is a convention, but it is the convention every Clebsch–Gordan table and every NumPy script assumes, and changing it permutes the rows and columns of everything that follows. In this basis Jz is already finished: ⟨j, m′|Jz|j, m⟩ is mħ when m′ = m and zero otherwise, a real diagonal matrix reading ħ diag(j, …, −j). J² is finished too, and it is invisible: ħ² j(j+1) times the identity, so within one j it commutes with everything and cannot help you tell states apart. All the content sits in the two components that fail to commute with Jz, and those you have to build.
Assemble J₊ from one square root, then take halves
The norm of J₊|j, m⟩ is fixed by the algebra: ⟨j, m|J₋J₊|j, m⟩ = ⟨J² − Jz² − ħJz⟩ = ħ²(j(j+1) − m(m+1)), and with the Condon–Shortley choice of phases its root is real and non-negative, so ⟨j, m+1|J₊|j, m⟩ = ħ√(j(j+1) − m(m+1)). For j = 3/2 the three entries are ħ√3, 2ħ and ħ√3, for the steps from m = 1/2 to 3/2, from −1/2 to 1/2, and from −3/2 to −1/2. In the m-descending ordering they sit on the stripe just above the diagonal, J₋ = J₊† puts the same numbers just below, and Jₓ = (J₊ + J₋)/2 is the real symmetric tridiagonal matrix with (√3, 2, √3)ħ/2 beside the diagonal. Jy = (J₊ − J₋)/2i carries the same magnitudes, as −i times them above the diagonal and +i times them below. The halves are not decoration: leave them out and every variance you compute later comes out four times too big.
Verify the algebra numerically before trusting anything else
In NumPy, with ħ = 1: m = np.arange(j, −j - 1, −1); off = np.√(j*(j+1) - m[:-1]*m[1:]); Jp = np.diag(off, 1); Jm = Jp.conj().T; Jx = (Jp + Jm)/2; Jy = (Jp - Jm)/(2*1j); Jz = np.diag(m). The product m[:-1]*m[1:] equals m(m+1) for the lower member of each adjacent pair, which is what the ladder formula wants. Then test: np.linalg.norm(Jx@Jy - Jy@Jx - 1j*Jz) should return something like 3 × 10⁻¹⁶, and Jx@Jx + Jy@Jy + Jz@Jz should equal j(j+1) times the identity to the same precision. By hand at j = 1, JₓJy is (ħ²/2) times the matrix with rows (i, 0, −i), (0, 0, 0), (i, 0, −i), while JyJₓ has rows (−i, 0, −i), (0, 0, 0), (i, 0, i); subtracting gives (ħ²/2) diag(2i, 0, −2i) = iħ · ħ diag(1, 0, −1) = iħJz. A residual of order 1 rather than 10⁻¹⁵ almost always means a dropped half, a conjugate missed on J₋, or m ordered upward while the stripe was placed above the diagonal.
Read the uncertainty bound off the commutator
The Robertson inequality σA σB ≥ ½|⟨[A, B]⟩| needs one commutator and one state. Feed it [Jₓ, Jy] = iħJz and it returns ΔJₓ ΔJy ≥ (ħ/2)|⟨Jz⟩| — a floor that depends on the state through ⟨Jz⟩, unlike the constant ħ/2 for x and p. Evaluate it in |j, m⟩. Jₓ only connects m to m ± 1, so ⟨Jₓ⟩ = 0, and likewise ⟨Jy⟩ = 0. For the second moments use Jₓ² + Jy² = J² − Jz², whose expectation is ħ²(j(j+1) − m²); the state is symmetric under rotations about z, so the two shares are equal and ⟨Jₓ²⟩ = ⟨Jy²⟩ = ħ²(j(j+1) − m²)/2. The product ΔJₓ ΔJy is therefore (j(j+1) − m²)ħ²/2 against a bound of |m|ħ²/2. At j = 1, m = 1 both sides equal ħ²/2: the stretched state saturates the inequality. At j = 1, m = 0 the product is ħ² while the bound is zero — satisfied, but the theorem has gone silent, and only the direct calculation says how spread Jₓ actually is.
The cone is a plot of variances, not a path
Draw |J| = ħ√(j(j+1)) at the angle cos θ = m/√(j(j+1)) to the z-axis and sweep it round: that is the textbook cone, and it encodes exactly two numbers. Its height is ⟨Jz⟩ = mħ; its rim radius is √(⟨Jₓ²⟩ + ⟨Jy²⟩) = ħ√(j(j+1) − m²), the root-mean-square transverse spread. For j = 1, m = 1 the half-angle is 45° and the rim radius is ħ — as large as the height. Nothing in the picture is a position on the rim, because the state has no azimuth: ⟨Jₓ⟩ and ⟨Jy⟩ are zero, and a standard deviation has no direction to point in. Nothing in it moves either. Without a Hamiltonian |j, m⟩ is stationary, and with H = ωJz it acquires the phase e(−imωt), which changes no expectation value at all. Precession is real only for a superposition of different m, and even then it is ⟨J⟩ that rotates, not a tip riding a circle. The reason the arrow cannot lie along z even at m = j is the same bookkeeping: √(j(j+1)) exceeds j because ΔJₓ = ΔJy = ħ√(j/2) is not zero in the top state.
Rotate the axis and the spectrum stays put
The eigenvalues of n⋅J = nₓJₓ + nyJy + nzJz are the same 2j+1 numbers mħ for every unit vector n, because n⋅J is unitarily equivalent to Jz through the rotation that carries z into n. At j = 1 the eigenvector of Jₓ with eigenvalue +ħ is (1, √2, 1)/2 in the (|1, 1⟩, |1, 0⟩, |1, −1⟩) ordering — check it: Jₓ on that vector gives (ħ/√2)(√2, 2, √2)/2, which is ħ times the vector back. In that state ⟨Jz⟩ = ħ(1/4 − 1/4) = 0, so the bound on ΔJₓ ΔJy is zero and is met with ΔJₓ = 0 exactly; but the cyclic partner ΔJy ΔJz ≥ (ħ/2)|⟨Jₓ⟩| = ħ²/2 is live, and ⟨Jy²⟩ = ⟨Jz²⟩ = ħ²/2 makes it saturate. Numerically this is the whole lab: build n⋅J for a random n, call np.linalg.eigh, confirm the spectrum, then compute variances in each eigenvector and compare with (ħ/2)|⟨n″⋅J⟩| for a perpendicular pair. Within a single j the spectrum of n⋅J is non-degenerate, so eigh returns the eigenvectors unambiguously; stack several j and the m-values repeat, eigh hands back an arbitrary basis of each eigenspace, and a variance computed there is a property of that choice, not of the physics.
Change one variable at a time
Make the relationship visible.
At j = 1 move k from 0 to 1: m drops to 0, the open ring falls to the axis as the bound vanishes while the filled dot climbs to the peak — then return k to 0 and raise j to 3: dot and ring coincide again at the right-hand end, yet the cone still opens by √3 ħ in the stretched state.
m = j − k1.0
ΔJx = ΔJy0.707 ħ
PRODUCT ΔJx⋅ΔJy0.500 ħ²
BOUND ħ|⟨Jz⟩|/20.500 ħ²
Live interpretationm = j − k: 1.0. ΔJx = ΔJy: 0.707 ħ. PRODUCT ΔJx⋅ΔJy: 0.500 ħ². BOUND ħ|⟨Jz⟩|/2: 0.500 ħ²
Catch the common trap
Explain before calculating.
A spin-1 system (j = 1) is prepared in |1, 1⟩, the m = +1 eigenstate of Jz. What is ΔJₓ ΔJy in that state, and how does it compare with the Robertson bound?
Choose an answer to test the model.
Practice & worked examples
Reason from the model, then test the result.
EasyUse the ladder matrix element ⟨j, m+1|J₊|j, m⟩ = ħ√(j(j+1) − m(m+1)) to build J₊, J₋, Jₓ and Jy for j = 1/2 in the basis (|½, ½⟩, |½, −½⟩), and identify the Pauli matrices.
- Only one raising step exists, from m = −½ to m = +½: the element is ħ√(¾ − (−½)(½)) = ħ√(¾ + ¼) = ħ.
- In the m-descending ordering that entry sits in row 1, column 2: J₊ = ħ [[0, 1], [0, 0]], and J₋ = J₊† = ħ [[0, 0], [1, 0]].
- Jₓ = (J₊ + J₋)/2 = (ħ/2) [[0, 1], [1, 0]] = (ħ/2) σₓ, and Jy = (J₊ − J₋)/2i = (ħ/2) [[0, −i], [i, 0]] = (ħ/2) σy.
- Jz = ħ diag(½, −½) = (ħ/2) σz. Check: [Jₓ, Jy] = (ħ²/4)[σₓ, σy] = (ħ²/4)(2iσz) = iħ (ħ/2) σz = iħJz.
AnswerJₓ = (ħ/2)σₓ, Jy = (ħ/2)σy, Jz = (ħ/2)σz — the j = ½ representation is the Pauli matrices scaled by ħ/2, and the commutator closes.
MediumFor j = 3/2, write the non-zero entries of J₊, build Jₓ, and find ΔJₓ in the state |3/2, 1/2⟩. Compare ΔJₓ ΔJy with the Robertson bound (ħ/2)|⟨Jz⟩|.
- Ladder entries ħ√(15/4 − m(m+1)) for the lower member m of each pair: m = ½ gives ħ√(15/4 − 3/4) = ħ√3; m = −½ gives ħ√(15/4 + 1/4) = 2ħ; m = −3/2 gives ħ√(15/4 − 3/4) = ħ√3.
- In the ordering (3/2, 1/2, −1/2, −3/2) these fill the stripe above the diagonal of J₊; Jₓ = (J₊ + J₊†)/2 is symmetric tridiagonal with (√3, 2, √3)ħ/2 on both off-diagonals.
- ⟨Jₓ⟩ = 0 because Jₓ has no diagonal entries. The diagonal entry of Jₓ² in the m = ½ row is the sum of the squares of the two off-diagonal entries touching it: (ħ²/4)(3 + 4) = 7ħ²/4.
- So ΔJₓ = ħ√7/2 ≈ 1.32ħ; by the x–y symmetry of the state ΔJy is the same, and the shortcut ħ²(j(j+1) − m²)/2 = ħ²(15/4 − 1/4)/2 = 7ħ²/4 agrees.
- Product ΔJₓ ΔJy = 7ħ²/4 = 1.75ħ². Bound: (ħ/2)|⟨Jz⟩| = (ħ/2)(ħ/2) = ħ²/4 = 0.25ħ². The inequality holds by a factor of 7 — far from saturated, as every m below j is.
AnswerΔJₓ = ΔJy = (√7/2)ħ ≈ 1.32ħ; ΔJₓ ΔJy = 1.75ħ² against a bound of 0.25ħ².
HardFor j = 1, find the normalised eigenvector of Jₓ with eigenvalue +ħ in the basis (|1, 1⟩, |1, 0⟩, |1, −1⟩). In that state compute ⟨Jz⟩, ΔJy and ΔJz, and test the cyclic bound ΔJy ΔJz ≥ (ħ/2)|⟨Jₓ⟩|.
- Jₓ = (ħ/√2) times the tridiagonal matrix with 1s beside the diagonal. Writing v = (a, b, c), the eigen-equation Jₓ v = ħv reads b/√2 = a, (a + c)/√2 = b and b/√2 = c.
- So b = √2 a and c = a; normalising, |a|² + 2|a|² + |a|² = 1 gives a = ½ and v = (1, √2, 1)/2. Check: Jₓ v = (ħ/√2)(√2, 2, √2)/2 = ħ(1, √2, 1)/2.
- ⟨Jz⟩ = ħ(¼ · 1 + ½ · 0 + ¼ · (−1)) = 0 and ⟨Jz²⟩ = ħ²(¼ + 0 + ¼) = ħ²/2, so ΔJz = ħ/√2.
- ⟨Jy⟩: Jy v = (ħ/√2)(−i√2, i − i, i√2)/2 = (ħ/2)(−i, 0, i), and v · (Jy v) = (ħ/4)(−i + i) = 0. From Jₓ² + Jy² + Jz² = 2ħ²I with ⟨Jₓ²⟩ = ħ²: ⟨Jy²⟩ = 2ħ² − ħ² − ħ²/2 = ħ²/2, so ΔJy = ħ/√2.
- ΔJy ΔJz = ħ²/2, and the bound is (ħ/2)|⟨Jₓ⟩| = (ħ/2)(ħ) = ħ²/2: saturated, as for a stretched state along any axis. Meanwhile ΔJₓ = 0 and ⟨Jz⟩ = 0, so ΔJₓ ΔJy ≥ 0 holds trivially.
Answerv = (1, √2, 1)/2; ⟨Jz⟩ = 0; ΔJy = ΔJz = ħ/√2 ≈ 0.707ħ; ΔJy ΔJz = ħ²/2 equals the bound ħ²/2.