Python / Scientific and math computing
Topics in Banach Space Theory in Python
Contents
Introduction to Banach Spaces
A Banach space is a complete normed vector space. In simpler terms, it's a vector space with a notion of distance that allows us to talk about convergence of sequences.
import numpy as np
def is_complete(sequence):
# Check if the sequence is Cauchy
epsilon = 1e-10
for i in range(len(sequence)):
for j in range(i+1, len(sequence)):
if np.linalg.norm(sequence[i] - sequence[j]) > epsilon:
return False
return True
# Example sequence in R^2
sequence = [np.array([1/n, 1/n]) for n in range(1, 1001)]
print(f"Is the sequence complete? {is_complete(sequence)}")
Normed Spaces
A normed space is a vector space equipped with a norm, which is a function that assigns a non-negative length or size to each vector in the space.
import numpy as np
def euclidean_norm(vector):
return np.sqrt(np.sum(np.square(vector)))
def p_norm(vector, p):
return np.power(np.sum(np.power(np.abs(vector), p)), 1/p)
v = np.array([3, 4])
print(f"Euclidean norm of {v}: {euclidean_norm(v)}")
print(f"1-norm of {v}: {p_norm(v, 1)}")
print(f"2-norm of {v}: {p_norm(v, 2)}")
print(f"∞-norm of {v}: {p_norm(v, np.inf)}")
Completeness
A normed space is complete if every Cauchy sequence in the space converges to a point in the space. This property is crucial for many theorems in functional analysis.
import numpy as np
def is_cauchy(sequence, epsilon=1e-10):
for i in range(len(sequence)):
for j in range(i+1, len(sequence)):
if np.abs(sequence[i] - sequence[j]) > epsilon:
return False
return True
def limit_exists(sequence):
return np.all(np.isfinite(sequence)) and np.all(~np.isnan(sequence))
# Example: sequence converging to e
sequence = [sum([1/np.math.factorial(k) for k in range(n)]) for n in range(1, 1001)]
print(f"Is the sequence Cauchy? {is_cauchy(sequence)}")
print(f"Does the limit exist? {limit_exists(sequence)}")
print(f"Limit of the sequence: {sequence[-1]}")
Linear Operators
Linear operators are functions between vector spaces that preserve vector addition and scalar multiplication. They are fundamental in the study of Banach spaces.
import numpy as np
def is_linear_operator(operator, x, y, alpha, beta):
return np.allclose(operator(alpha*x + beta*y), alpha*operator(x) + beta*operator(y))
# Example linear operator: rotation in R^2
def rotate(theta):
def operator(v):
rotation_matrix = np.array([[np.cos(theta), -np.sin(theta)],
[np.sin(theta), np.cos(theta)]])
return rotation_matrix @ v
return operator
x = np.array([1, 0])
y = np.array([0, 1])
rotation_45 = rotate(np.pi/4)
print(f"Is rotation a linear operator? {is_linear_operator(rotation_45, x, y, 2, 3)}")
Bounded Linear Operators
A linear operator is bounded if it maps bounded sets to bounded sets. The set of all bounded linear operators between two normed spaces forms a normed space itself.
import numpy as np
def operator_norm(A):
return np.linalg.norm(A, ord=2)
def is_bounded(A, bound):
return operator_norm(A) <= bound
# Example: matrix as a bounded linear operator
A = np.array([[1, 2], [3, 4]])
x = np.array([1, 1])
print(f"Operator norm of A: {operator_norm(A)}")
print(f"Is A bounded by 6? {is_bounded(A, 6)}")
print(f"A * x = {A @ x}")
Banach Fixed-Point Theorem
The Banach Fixed-Point Theorem, also known as the Contraction Mapping Theorem, is a powerful tool for proving the existence and uniqueness of solutions to certain equations.
import numpy as np
def contraction_mapping(x):
return np.cos(x) / 2
def fixed_point_iteration(f, x0, tolerance=1e-10, max_iterations=1000):
x = x0
for i in range(max_iterations):
x_new = f(x)
if np.abs(x_new - x) < tolerance:
return x_new, i+1
x = x_new
return None, max_iterations
x0 = 0
fixed_point, iterations = fixed_point_iteration(contraction_mapping, x0)
print(f"Fixed point: {fixed_point}")
print(f"Iterations: {iterations}")
print(f"Verification: f(x) - x = {contraction_mapping(fixed_point) - fixed_point}")
Hahn-Banach Theorem
The Hahn-Banach Theorem is a fundamental result in functional analysis that allows the extension of bounded linear functionals from a subspace to the entire space.
import numpy as np
def extend_functional(subspace_basis, functional_values, vector):
# This is a simplified version for finite-dimensional spaces
A = np.array(subspace_basis).T
b = np.array(functional_values)
# Solve the system A * x = b
coeffs = np.linalg.lstsq(A, b, rcond=None)[0]
# Extend the functional
return np.dot(coeffs, vector)
# Example
subspace_basis = [[1, 0, 0], [0, 1, 0]]
functional_values = [1, 2]
vector = np.array([1, 1, 1])
extended_value = extend_functional(subspace_basis, functional_values, vector)
print(f"Extended functional value: {extended_value}")
Uniform Boundedness Principle
The Uniform Boundedness Principle, also known as the Banach-Steinhaus Theorem, states that a family of bounded linear operators that is pointwise bounded must be uniformly bounded.
import numpy as np
def create_operator(n):
return lambda x: n * np.sin(x/n)
def is_pointwise_bounded(operators, x_values, bound):
return all(abs(op(x)) <= bound for op in operators for x in x_values)
def is_uniformly_bounded(operators, x_values, bound):
return max(abs(op(x)) for op in operators for x in x_values) <= bound
operators = [create_operator(n) for n in range(1, 101)]
x_values = np.linspace(0, 2*np.pi, 1000)
print(f"Pointwise bounded: {is_pointwise_bounded(operators, x_values, 1)}")
print(f"Uniformly bounded: {is_uniformly_bounded(operators, x_values, 1)}")
Open Mapping Theorem
The Open Mapping Theorem states that a surjective continuous linear operator between Banach spaces is an open mapping, meaning it maps open sets to open sets.
import numpy as np
def is_open_mapping(A):
# For finite-dimensional spaces, this is equivalent to checking if A is invertible
return np.linalg.matrix_rank(A) == A.shape[0]
# Example: rotation in R^2
theta = np.pi/4
A = np.array([[np.cos(theta), -np.sin(theta)],
[np.sin(theta), np.cos(theta)]])
print(f"Is the rotation matrix an open mapping? {is_open_mapping(A)}")
# Counter-example: projection onto x-axis
B = np.array([[1, 0],
[0, 0]])
print(f"Is the projection matrix an open mapping? {is_open_mapping(B)}")
Closed Graph Theorem
The Closed Graph Theorem states that a linear operator between Banach spaces is continuous if and only if its graph is closed.
import numpy as np
def is_graph_closed(A, tolerance=1e-10):
# For finite-dimensional spaces, this is equivalent to checking if A is bounded
return np.linalg.norm(A, ord=2) < np.inf
# Example: bounded linear operator
A = np.array([[1, 2],
[3, 4]])
print(f"Is the graph of A closed? {is_graph_closed(A)}")
# Counter-example: unbounded operator (not possible in finite dimensions)
def unbounded_operator(x):
return x * np.exp(x)
# We can't directly apply is_graph_closed to unbounded_operator,
# but we know its graph is not closed
print("The graph of the unbounded operator is not closed.")
Dual Spaces
The dual space of a Banach space is the space of all continuous linear functionals on the space. It plays a crucial role in functional analysis.
import numpy as np
def dual_norm(functional, primal_space):
return max(abs(functional(x)) for x in primal_space)
# Example: dual of l^2 space
def l2_functional(x):
return np.dot(x, [1/n for n in range(1, len(x)+1)])
primal_space = [np.random.randn(100) for _ in range(1000)]
normalized_primal_space = [x / np.linalg.norm(x) for x in primal_space]
print(f"Dual norm of the functional: {dual_norm(l2_functional, normalized_primal_space)}")
Weak Topology
The weak topology on a Banach space is the coarsest topology that makes all continuous linear functionals continuous. It's weaker than the norm topology but still very useful.
import numpy as np
def is_weakly_convergent(sequence, functionals):
limits = []
for f in functionals:
functional_values = [f(x) for x in sequence]
if not np.all(np.isfinite(functional_values)):
return False
limits.append(np.mean(functional_values[-10:])) # Approximate limit
return np.all(np.isfinite(limits))
# Example sequence in R^2
sequence = [np.array([1/n, (-1)**n]) for n in range(1, 1001)]
# Example functionals
f1 = lambda x: x[0]
f2 = lambda x: x[1]
print(f"Is the sequence weakly convergent? {is_weakly_convergent(sequence, [f1, f2])}")
Reflexive Spaces
A Banach space is reflexive if it is isomorphic to its double dual. Reflexive spaces have many nice properties, including the weak compactness of closed bounded sets.
import numpy as np
def is_reflexive(space, tolerance=1e-10):
# This is a simplification. In general, checking reflexivity is more complex.
# Here we're checking if the space is finite-dimensional, which implies reflexivity.
return np.linalg.matrix_rank(space) == space.shape[1]
# Example: R^3 is reflexive
space = np.eye(3)
print(f"Is R^3 reflexive? {is_reflexive(space)}")
# Counter-example: l^1 is not reflexive
# We can't represent infinite-dimensional spaces directly,
# but we know l^1 is not reflexive
print("The space l^1 is not reflexive.")
Hilbert Spaces
Hilbert spaces are complete inner product spaces. They are a special class of Banach spaces with additional structure that makes them particularly useful in many applications.
import numpy as np
def is_hilbert_space(vectors):
# Check if the space has an inner product
def inner_product(x, y):
return np.dot(x, y)
# Check if the space is complete (simplified for finite-dimensional case)
def is_complete():
return True # Always true for finite-dimensional spaces
# Check if the inner product satisfies the parallelogram law
def satisfies_parallelogram_law(x, y):
lhs = np.linalg.norm(x + y)**2 + np.linalg.norm(x - y)**2
rhs = 2 * (np.linalg.norm(x)**2 + np.linalg.norm(y)**2)
return np.isclose(lhs, rhs)
return all(satisfies_parallelogram_law(x, y) for x in vectors for y in vectors) and is_complete()
# Example: R^3 with standard inner product
vectors = [np.array([1, 0, 0]), np.array([0, 1, 0]), np.array([0, 0, 1])]
print(f"Is R^3 a Hilbert space? {is_hilbert_space(vectors)}")
Additional Resources
For further exploration of Banach Space Theory, consider the following resources:
- ArXiv.org: "An Introduction to Banach Space Theory" by Robert E. Megginson URL: https://arxiv.org/abs/math/0601744
- ArXiv.org: "Functional Analysis and Its Applications" by Vladimir I. Bogachev URL: https://arxiv.org/abs/1202.4443
- ArXiv.org: "A Short Course on Banach Space Theory" by N. J. Kalton URL: https://arxiv.org/abs/math/0404304
These papers provide comprehensive overviews and in-depth discussions of various aspects of Banach Space Theory.