The behavior of the dual space varies dramatically across different Banach spaces. There are three main classes: self-dual (Hilbert), reflexive, and non-reflexive. The geometry of the unit ball is what drives the distinction.
Hilbert Spaces: (Self-Dual)¶
In a Hilbert space, every continuous linear functional comes from the inner product.
Theorem 1 (Riesz Representation Theorem)
Let be a Hilbert space. For every , there exists a unique such that
and . The map is an isometric (conjugate-linear) isomorphism .
Proof 1
Existence. If , take . Otherwise is a proper closed subspace of . By the orthogonal decomposition, , and since , the orthogonal complement is one-dimensional (because has codimension 1). Let be the unit vector in , so .
Now decompose any using this splitting: write where and . Apply to both sides: , so .
Set . Then since , we have , and:
Uniqueness. If for all , then for all . Taking gives .
Isometry. by Cauchy-Schwarz, with equality at .
The picture¶
In with the Euclidean norm, every functional is represented by the vector . The kernel is the line perpendicular to , and the level sets are parallel lines spaced apart. The Riesz representative is the normal vector to the foliation.
import numpy as np
import matplotlib.pyplot as plt
fig, axes = plt.subplots(1, 2, figsize=(11, 4.5))
theta_circ = np.linspace(0, 2*np.pi, 200)
# --- Panel 1: ell^2 unit ball with a functional ---
ax = axes[0]
ax.plot(np.cos(theta_circ), np.sin(theta_circ), 'C0', lw=2, label=r'$B_{\ell^2}$')
ax.fill(np.cos(theta_circ), np.sin(theta_circ), color='C0', alpha=0.08)
# Functional f(x,y) = (3x + 4y)/5, so ||f|| = 1, representative is (3/5, 4/5)
a, b = 3/5, 4/5
ax.annotate('', xy=(a, b), xytext=(0, 0),
arrowprops=dict(arrowstyle='->', color='C3', lw=2))
ax.text(a+0.08, b+0.05, r'$x_f = (3/5,\, 4/5)$', fontsize=10, color='C3')
# Level sets of f
t = np.linspace(-2.2, 2.2, 200)
for c in [-1.5, -1, -0.5, 0, 0.5, 1, 1.5]:
# ax + by = c => y = (c - ax)/b
y_line = (c - a * t) / b
mask = (y_line > -2.2) & (y_line < 2.2)
lw_val = 1.5 if abs(c) < 0.01 else 0.8
alpha = 0.6 if abs(c) < 0.01 else 0.3
ax.plot(t[mask], y_line[mask], 'C1', lw=lw_val, alpha=alpha)
# Mark the kernel
ax.text(-1.2, 1.1, r'$\ker(f)$', fontsize=10, color='C1', rotation=-37)
ax.set_xlim(-2.2, 2.2)
ax.set_ylim(-2.2, 2.2)
ax.set_aspect('equal')
ax.set_title(r'Hilbert space ($\ell^2$): $f \leftrightarrow x_f$', fontsize=11)
ax.set_xlabel(r'$x$', fontsize=11); ax.set_ylabel(r'$y$', fontsize=11)
ax.legend(fontsize=10, loc='upper right')
ax.tick_params(labelsize=9)
# --- Panel 2: unique extension in ell^2 ---
ax = axes[1]
ax.plot(np.cos(theta_circ), np.sin(theta_circ), 'C0', lw=2, label=r'$B_{\ell^2}$')
ax.fill(np.cos(theta_circ), np.sin(theta_circ), color='C0', alpha=0.08)
# Subspace M = span((1,1)/sqrt(2))
M_dir = np.array([1, 1]) / np.sqrt(2)
t_M = np.linspace(-2.2, 2.2, 200)
ax.plot(t_M * M_dir[0], t_M * M_dir[1], 'C0', lw=2.5, alpha=0.5, label=r'$M = \mathrm{span}(1,1)$')
# f on M: f(t(1,1)/sqrt(2)) = t/sqrt(2), so f(1,1) = 1.
# Unique extension: the Riesz representative must be in the direction of (1,1)
# projected onto... actually f((1,1)) = 1 and ||(1,1)|| = sqrt(2)
# so ||f|| on M is 1/sqrt(2) * sqrt(2) = ... let's think again
# f(alpha (1,1)) = alpha, so f((1,1)) = 1, ||(1,1)|| = sqrt(2), ||f|| = 1/sqrt(2)
# Riesz rep: x_f = (1,1) * f((1,1)) / ||(1,1)||^2 = (1,1)/2
# Unique extension: F(x,y) = (x+y)/2
a_ext, b_ext = 0.5, 0.5
ax.annotate('', xy=(a_ext, b_ext), xytext=(0, 0),
arrowprops=dict(arrowstyle='->', color='C3', lw=2))
ax.text(a_ext+0.08, b_ext+0.08, r'$x_f = (1/2,\, 1/2)$', fontsize=10, color='C3')
# Level sets: (x+y)/2 = c => y = 2c - x
for c in [-1, -0.5, 0, 0.5, 1]:
y_line = 2*c - t
mask = (y_line > -2.2) & (y_line < 2.2)
lw_val = 1.5 if abs(c) < 0.01 else 0.8
alpha = 0.6 if abs(c) < 0.01 else 0.3
ax.plot(t[mask], y_line[mask], 'C1', lw=lw_val, alpha=alpha)
ax.set_xlim(-2.2, 2.2)
ax.set_ylim(-2.2, 2.2)
ax.set_aspect('equal')
ax.set_title(r'Unique Hahn-Banach extension in $\ell^2$', fontsize=11)
ax.set_xlabel(r'$x$', fontsize=11); ax.set_ylabel(r'$y$', fontsize=11)
ax.legend(fontsize=9, loc='upper right')
ax.tick_params(labelsize=9)
plt.tight_layout()
plt.show()
Left: in , the functional is represented by the vector , which is perpendicular to . Right: given on with , the unique norm-preserving extension is . The round ball forces a single choice of kernel, unlike the worked example in the previous section, where the square ball allowed a whole family of extensions.
Example 1 ( and )
In with the standard inner product, every functional is for some . Thus .
More generally, in , every functional is for a unique , and .
Example 2 ()
In every functional is given by
This is the Riesz Representation Theorem applied to . The representing function plays the role of the “normal vector” to .
The key property of Hilbert spaces: the inner product provides a canonical identification between and . Duality is not an abstract theorem but a concrete computation. Every closed hyperplane has a unique normal vector, and extending a functional from a subspace amounts to orthogonal projection.
Reflexive Spaces: ¶
Definition 1 (Reflexive space)
A Banach space is reflexive if the canonical embedding defined by
is surjective (and hence an isometric isomorphism onto ).
Lemma 1 (The canonical embedding is an isometry)
For any normed space , the canonical embedding is an isometry: for all .
Proof 2
By definition, . The sup formula gives .
So always embeds isometrically into . Reflexivity asks: does every element of come from a point in ? That is, does miss anything?
All Hilbert spaces are reflexive (since implies ). But reflexivity is strictly weaker than self-duality.
The family¶
Example 3 ( spaces for )
The spaces for are reflexive. The dual is where .
For , the functional
satisfies by Hölder’s inequality. The map is an isometric isomorphism.
Proof 3
Step 1: is bounded and . For any , Hölder’s inequality gives
so with .
Step 2: (the bound is sharp). Assume and define the test function
Then , so . Evaluating:
where we used and . So , and combined with Step 1, . In particular is an isometry.
Step 3: Surjectivity. Let . Define a set function on measurable sets by . Since , we have whenever , so is absolutely continuous with respect to . By the Radon-Nikodym theorem, there exists with for all measurable . This gives for all simple functions . Since simple functions are dense in and is continuous, for all , i.e., . The isometry from Step 2 forces with .
The duality pairing and closes the loop: .
The geometry of reflexive spaces¶
What makes reflexive spaces special geometrically? The answer involves the shape of the unit ball.
Definition 2 (Uniform convexity)
A Banach space is uniformly convex if for every there exists such that
In words: if two points on the unit sphere are separated, their midpoint is strictly inside the ball. The boundary has no flat spots.
import numpy as np
import matplotlib.pyplot as plt
fig, axes = plt.subplots(1, 3, figsize=(14, 4.5))
theta = np.linspace(0, 2*np.pi, 500)
# Unit balls for different p
for idx, (p, title, color) in enumerate([
(2, r'$\ell^2$ (Hilbert, $p=2$)', 'C0'),
(4, r'$\ell^p$, $p=4$', 'C1'),
(1.2, r'$\ell^p$, $p=1.2$', 'C2'),
]):
ax = axes[idx]
# Unit ball: |x|^p + |y|^p = 1
x_ball = np.sign(np.cos(theta)) * np.abs(np.cos(theta))**(2/p)
y_ball = np.sign(np.sin(theta)) * np.abs(np.sin(theta))**(2/p)
ax.fill(x_ball, y_ball, color=color, alpha=0.15)
ax.plot(x_ball, y_ball, color=color, lw=2, label=rf'$B_{{\ell^{p}}}$')
# Show two points on the sphere and their midpoint
t1, t2 = np.pi/6, np.pi/2.5
x1 = np.sign(np.cos(t1)) * np.abs(np.cos(t1))**(2/p)
y1 = np.sign(np.sin(t1)) * np.abs(np.sin(t1))**(2/p)
x2 = np.sign(np.cos(t2)) * np.abs(np.cos(t2))**(2/p)
y2 = np.sign(np.sin(t2)) * np.abs(np.sin(t2))**(2/p)
mid_x, mid_y = (x1+x2)/2, (y1+y2)/2
ax.plot([x1, x2], [y1, y2], 'k--', lw=1, alpha=0.5)
ax.plot(x1, y1, 'ko', ms=6, zorder=5)
ax.plot(x2, y2, 'ko', ms=6, zorder=5)
ax.plot(mid_x, mid_y, 'C3o', ms=7, zorder=5)
# Compute the norm of the midpoint
mid_norm = (np.abs(mid_x)**p + np.abs(mid_y)**p)**(1/p)
ax.text(mid_x+0.05, mid_y-0.15,
rf'$\|\mathrm{{mid}}\| = {mid_norm:.2f}$',
fontsize=9, color='C3')
ax.set_xlim(-1.5, 1.5)
ax.set_ylim(-1.5, 1.5)
ax.set_aspect('equal')
ax.set_title(title, fontsize=11)
ax.set_xlabel(r'$x$', fontsize=10); ax.set_ylabel(r'$y$', fontsize=10)
ax.tick_params(labelsize=8)
ax.legend(fontsize=9, loc='upper right')
plt.tight_layout()
plt.show()
unit balls for three values of . In each case, the midpoint of two boundary points (red dot) lies strictly inside the ball. This is uniform convexity: the boundary curves inward, with no flat edges. Contrast with the diamond and square, which have flat sides where the midpoint stays on the boundary.
From geometry to reflexivity¶
Recall what reflexivity asks: is every of the form for some ? An element is a linear functional on , so it assigns a number to every . If , then , meaning the readings come from evaluating at a point. Non-reflexivity means there exist “phantom” evaluation functionals in that do not come from any point in .
The shape of the unit ball controls this through the uniqueness of norm-attaining directions:
Round ball (uniformly convex): for any with , the functional on that defines picks out a unique “direction” in . The curvature of the ball means there is only one point on the unit sphere that could produce the readings . This pins down to an actual point in .
Flat ball (, ): the flat edges mean many points on the boundary give the same readings for large classes of functionals. This ambiguity creates room for elements of that are consistent with the readings but do not correspond to any single point.
A concrete example: in (sequences converging to zero, sup norm), the canonical embedding . The constant sequence defines a valid element of , but it is not in since it does not converge to zero. The flat geometry of the ball accommodates this extra element.
Theorem 2 (Milman-Pettis)
Every uniformly convex Banach space is reflexive.
Proof 4
Idea. We must show every equals for some . The key step is: if two points produce nearly the same readings on all functionals (i.e., is small for all ), then and must be close in norm.
Suppose not: but the readings are close. By uniform convexity, . But the readings of the midpoint are the averages of the readings of and , which are both close to . Choosing that nearly norms gives a contradiction.
This means: if a sequence of “approximate representatives” satisfies for all , then is Cauchy in norm. Since is complete, for some , and .
The spaces for are uniformly convex (Clarkson’s inequalities), so Milman-Pettis gives reflexivity as a consequence of their round unit balls.
Reflexivity is really about the duality structure (does hit all of ?), not about any single geometric property. Uniform convexity is one sufficient condition, but spaces can be reflexive for other reasons, for instance because their dual pairing closes the loop as with and .
Non-Reflexive Spaces: ¶
When is not reflexive, the canonical embedding is a strict inclusion. The bidual contains “phantom” elements that do not correspond to any point in . Geometrically, the unit ball has flat spots or corners that create room for extra functionals.
and ¶
Example 4 ( and )
. The pairing is
But the duality chain does not close: . The dual of consists of finitely additive measures, which include singular objects that cannot be represented by functions.
A finitely additive measure is a set function satisfying for disjoint , but not necessarily for countable unions. Every countably additive (i.e., ordinary) measure is finitely additive, but not conversely. The extra elements of come from finitely additive measures that are not countably additive, such as Banach limits (which assign a “limit” to every bounded sequence, extending the usual limit).
The unit ball is not uniformly convex. In , the ball (diamond) has flat edges connecting to , where midpoints of boundary points remain on the boundary. This flat geometry is what allows non-reflexivity.
Sequence spaces: and ¶
Example 5 (The chain)
with the sup norm. The duality chain is:
Neither nor is reflexive. The embedding misses sequences that do not converge to zero: for instance, the constant sequence is in but not in .
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon
fig, axes = plt.subplots(1, 3, figsize=(14, 4.5))
# --- Panel 1: ell^2 ball (round, reflexive) ---
ax = axes[0]
theta = np.linspace(0, 2*np.pi, 200)
ax.fill(np.cos(theta), np.sin(theta), color='C0', alpha=0.15)
ax.plot(np.cos(theta), np.sin(theta), 'C0', lw=2)
# Two points and midpoint on boundary
t1, t2 = np.pi/5, np.pi/2.8
x1, y1 = np.cos(t1), np.sin(t1)
x2, y2 = np.cos(t2), np.sin(t2)
mx, my = (x1+x2)/2, (y1+y2)/2
ax.plot([x1, x2], [y1, y2], 'k--', lw=1, alpha=0.5)
ax.plot(x1, y1, 'ko', ms=5); ax.plot(x2, y2, 'ko', ms=5)
ax.plot(mx, my, 'C3o', ms=6, zorder=5)
ax.text(mx+0.05, my-0.12, 'inside', fontsize=9, color='C3')
ax.set_xlim(-1.6, 1.6); ax.set_ylim(-1.6, 1.6)
ax.set_aspect('equal')
ax.set_title(r'$\ell^2$: round (reflexive)', fontsize=11)
ax.tick_params(labelsize=8)
# --- Panel 2: ell^1 ball (diamond, non-reflexive) ---
ax = axes[1]
diamond = np.array([[1,0],[0,1],[-1,0],[0,-1]])
poly = Polygon(diamond, closed=True, facecolor='C1', alpha=0.15, edgecolor='C1', lw=2)
ax.add_patch(poly)
# Two points on the flat edge and their midpoint ON the boundary
x1, y1 = 0.7, 0.3
x2, y2 = 0.3, 0.7
mx, my = (x1+x2)/2, (y1+y2)/2
ax.plot([x1, x2], [y1, y2], 'k--', lw=1, alpha=0.5)
ax.plot(x1, y1, 'ko', ms=5); ax.plot(x2, y2, 'ko', ms=5)
ax.plot(mx, my, 'C3o', ms=6, zorder=5)
ax.text(mx+0.05, my-0.12, 'on boundary!', fontsize=9, color='C3')
ax.set_xlim(-1.6, 1.6); ax.set_ylim(-1.6, 1.6)
ax.set_aspect('equal')
ax.set_title(r'$\ell^1$: flat edges (non-reflexive)', fontsize=11)
ax.tick_params(labelsize=8)
# --- Panel 3: ell^infty ball (square, non-reflexive) ---
ax = axes[2]
square = np.array([[-1,-1],[1,-1],[1,1],[-1,1]])
poly = Polygon(square, closed=True, facecolor='C2', alpha=0.15, edgecolor='C2', lw=2)
ax.add_patch(poly)
# Two points on the flat edge and their midpoint ON the boundary
x1, y1 = -0.3, 1.0
x2, y2 = 0.5, 1.0
mx, my = (x1+x2)/2, (y1+y2)/2
ax.plot([x1, x2], [y1, y2], 'k--', lw=1, alpha=0.5)
ax.plot(x1, y1, 'ko', ms=5); ax.plot(x2, y2, 'ko', ms=5)
ax.plot(mx, my, 'C3o', ms=6, zorder=5)
ax.text(mx+0.05, my-0.15, 'on boundary!', fontsize=9, color='C3')
ax.set_xlim(-1.6, 1.6); ax.set_ylim(-1.6, 1.6)
ax.set_aspect('equal')
ax.set_title(r'$\ell^\infty$: flat edges (non-reflexive)', fontsize=11)
ax.tick_params(labelsize=8)
plt.tight_layout()
plt.show()
Reflexive vs. non-reflexive geometry. In (left), the midpoint of two boundary points is strictly inside the ball: uniform convexity. In (center) and (right), flat edges allow midpoints to remain on the boundary. This failure of uniform convexity is the geometric signature of non-reflexivity.
and Radon measures¶
This is one of the most important dualities in analysis.
Definition 3 (Radon measure)
Let be a compact Hausdorff space. A Radon measure on is a Borel measure that is:
Finite: .
Inner regular: for every Borel set .
Outer regular: for every Borel set .
A signed Radon measure is a difference of two (positive) Radon measures with . The space of all finite signed Radon measures on is a Banach space under the total variation norm .
Examples include absolutely continuous measures (with densities), point masses (where ), and singular measures such as the Cantor measure.
Theorem 3 (Riesz-Markov-Kakutani Representation Theorem)
Let be a compact Hausdorff space. Then every bounded linear functional is represented by a unique finite signed Radon measure on :
and (total variation). That is, , the space of finite signed Radon measures on .
Proof 5
The proof constructs the measure from the functional in several steps.
Positive case. If (i.e., ), define for each open :
This defines an outer-regular Borel measure. Urysohn’s lemma (which requires Hausdorff and compact) provides the continuous functions needed to approximate indicator functions, and the Riesz representation follows from monotone convergence arguments.
General case. Decompose into positive and negative parts (the Jordan decomposition of functionals), apply the positive case to each, and set .
Example 6 (Key instances)
: functionals on continuous functions are signed measures. This includes absolutely continuous measures (represented by densities), singular measures, and point masses .
(with compact support or vanishing at infinity): the dual captures probability distributions, empirical measures, and distributional objects.
The space is generally not reflexive. The dual is much larger than : it contains point masses (which are not continuous functions) and singular measures. The bidual is larger still.
This duality is central to probability theory (measures as linear functionals on observables), PDE (weak solutions via integration against test functions), and optimization (dual problems over measures). It also provides the setting for the weak* convergence of measures discussed in the next section.
Spaces with Trivial Dual¶
Example 7 ( for )
The spaces for have trivial dual: .
These are complete metric spaces (F-spaces) but not Banach spaces. The “norm” fails the triangle inequality. The proof (due to Day, 1940) shows that the only convex open subsets of for are and itself. Since any nonzero continuous linear functional would have as a proper convex open set, no such functional exists.
This is the extreme case where the dual sees nothing. It is precisely what the Hahn-Banach theorem prevents in Banach spaces: the convexity of the unit ball (guaranteed by the triangle inequality) is what keeps the dual nontrivial.