
Physics V course sequence · Interactive lesson
Angular momentum matrices and 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.
UPV-09.04 · Lesson 4 of 9 in this unit. Position is not a completion score.Build the model
Choose the |j, m⟩ basis and the algebra becomes arithmetic you can check.
The key idea
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 complete physical model and assumptions
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 for j > 0, 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.
1Choose 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.
2Assemble 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.
3Verify 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.
4Read 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.
5The 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.
6Rotate 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 Δ(n′⋅J) Δ(n″⋅J) with (ħ/2)|⟨(n′ × n″)⋅J⟩| for a perpendicular pair of unit vectors n′ and n″. 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.
Key equations
Read the units, assumptions and limits before substituting.
Ladder matrix element
⟨j, m+1|J₊|j, m⟩ = ⟨j, m|J₋|j, m+1⟩ = ħ √(j(j+1) − m(m+1))
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 ≥ 0Cartesian components from the ladders
Jₓ = (J₊ + J₋)/2, Jy = (J₊ − J₋)/2i, Jz = ħ diag(j, j−1, …, −j)
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 HermitianAlgebra check
[Jₓ, Jy] = iħ Jz, Jₓ² + Jy² + Jz² = ħ² j(j+1) I
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⁻¹⁵ ħ²Robertson bound for Jₓ and Jy
ΔJₓ ΔJy ≥ (ħ/2) |⟨Jz⟩|
Read straight off σA σB ≥ ½|⟨[A, B]⟩| with [Jₓ, Jy] = iħJz. Cyclic permutation gives the other two pairs, and each goes empty wherever the mean on its own right-hand side vanishes.
ΔJᵢ = √(⟨Jᵢ²⟩ − ⟨Jᵢ⟩²), in units of ħ; the right side is an expectation in the same state, so the floor moves with the stateSpreads in an eigenstate |j, m⟩
⟨Jₓ⟩ = ⟨Jy⟩ = 0, ΔJₓ = ΔJy = ħ √((j(j+1) − m²)/2)
Never zero for j > 0, even at m = ±j, where product and bound both equal j ħ²/2: the stretched states saturate the inequality and every m strictly between them sits 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| ħ²/2Spectrum along any axis
eigenvalues of n⋅J = nₓ Jₓ + ny Jy + nz Jz are mħ, m = −j, …, j
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 notInteractive lab
Predict first. Explore the model. Compare the result.
Explore the model
Try this. 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.
Live results
- m = j − k
- 1.0
- ΔJx = ΔJy
- 0.707 ħ
- PRODUCT ΔJx⋅ΔJy
- 0.500 ħ²
- BOUND ħ|⟨Jz⟩|/2
- 0.500 ħ²
Results follow this lesson’s model and assumptions. Displayed values are rounded.
Predict → change one variable → check
Plan a change before running it. Every other input stays at the saved baseline.
Saved baseline. Angular momentum j: 1.0; Steps k below the top state: 0
This experiment is kept only while this page is open. It does not change saved course progress.
Catch the common trap
The error is to read the cone as a real vector that has a definite length ħ√(j(j+1)), sits at a definite tilt, and sweeps round the z-axis so fast that its x and y components average to zero. Nothing in the state supports any of that. Measure Jₓ in |j, m⟩ and you get one of the same 2j+1 values m′ħ, never the projection of a tilted arrow; the transverse quantity the cone draws is ΔJₓ = ΔJy = ħ√((j(j+1) − m²)/2), a standard deviation, and a standard deviation has no azimuth to precess through. Nor is there any motion to average away: |j, m⟩ is stationary, and even under H = ωJz its only change is a global phase. The cone is variance bookkeeping — height ⟨Jz⟩, rim radius √(⟨Jₓ²⟩ + ⟨Jy²⟩) — and it is the picture of why ⟨Jₓ²⟩ can never be zero while [Jₓ, Jy] = iħJz has a non-zero mean.
Practice & worked examples
3 authored examples. Make an attempt, then reveal the reasoning one step at a time.
EasyExample 1
Use 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.
Sketch your answer or reasoning, then compare it with the authored solution. Your writing is not automatically graded or saved.
0 of 4 steps revealed.
- 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.
Answer. Jₓ = (ħ/2)σₓ, Jy = (ħ/2)σy, Jz = (ħ/2)σz — the j = ½ representation is the Pauli matrices scaled by ħ/2, and the commutator closes.
MediumExample 2
For 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⟩|.
Sketch your answer or reasoning, then compare it with the authored solution. Your writing is not automatically graded or saved.
0 of 5 steps revealed.
- 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 strictly between −j and j is.
Answer. ΔJₓ = ΔJy = (√7/2)ħ ≈ 1.32ħ; ΔJₓ ΔJy = 1.75ħ² against a bound of 0.25ħ².
HardExample 3
For 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ₓ⟩|.
Sketch your answer or reasoning, then compare it with the authored solution. Your writing is not automatically graded or saved.
0 of 5 steps revealed.
- 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.
Answer. v = (1, √2, 1)/2; ⟨Jz⟩ = 0; ΔJy = ΔJz = ħ/√2 ≈ 0.707ħ; ΔJy ΔJz = ħ²/2 equals the bound ħ²/2.
Quick check
Select an answer and explain it before checking.
Review & continue
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.
- Explain the relationship without looking at the equation.
- Check a sign, a unit and a model assumption in your working.
- Return to the lab or worked example if a step is still unclear.