lean2/library/theories/analysis/normed_space.lean

204 lines
8.1 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/-
Copyright (c) 2015 Jeremy Avigad. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Author: Jeremy Avigad
Normed spaces.
-/
import algebra.module .metric_space
open real nat classical
noncomputable theory
structure has_norm [class] (M : Type) : Type :=
(norm : M → )
namespace analysis
definition norm {M : Type} [has_normM : has_norm M] (v : M) : := has_norm.norm v
notation `∥`v`∥` := norm v
end analysis
-- where is the right place to put this?
structure real_vector_space [class] (V : Type) extends vector_space V
structure normed_vector_space [class] (V : Type) extends real_vector_space V, has_norm V :=
(norm_zero : norm zero = 0)
(eq_zero_of_norm_eq_zero : ∀ u : V, norm u = 0 → u = zero)
(norm_triangle : ∀ u v, norm (add u v) ≤ norm u + norm v)
(norm_smul : ∀ (a : ) (v : V), norm (smul a v) = abs a * norm v)
namespace analysis
variable {V : Type}
variable [normed_vector_space V]
proposition norm_zero : ∥ (0 : V) ∥ = 0 := !normed_vector_space.norm_zero
proposition eq_zero_of_norm_eq_zero {u : V} (H : ∥ u ∥ = 0) : u = 0 :=
!normed_vector_space.eq_zero_of_norm_eq_zero H
proposition norm_triangle (u v : V) : ∥ u + v ∥ ≤ ∥ u ∥ + ∥ v ∥ :=
!normed_vector_space.norm_triangle
proposition norm_smul (a : ) (v : V) : ∥ a • v ∥ = abs a * ∥ v ∥ :=
!normed_vector_space.norm_smul
proposition norm_neg (v : V) : ∥ -v ∥ = ∥ v ∥ :=
have abs (1 : ) = 1, from abs_of_nonneg zero_le_one,
by+ rewrite [-@neg_one_smul V, norm_smul, abs_neg, this, one_mul]
end analysis
section
open analysis
variable {V : Type}
variable [normed_vector_space V]
private definition nvs_dist [reducible] (u v : V) := ∥ u - v ∥
private lemma nvs_dist_self (u : V) : nvs_dist u u = 0 :=
by rewrite [↑nvs_dist, sub_self, norm_zero]
private lemma eq_of_nvs_dist_eq_zero (u v : V) (H : nvs_dist u v = 0) : u = v :=
have u - v = 0, from eq_zero_of_norm_eq_zero H,
eq_of_sub_eq_zero this
private lemma nvs_dist_triangle (u v w : V) : nvs_dist u w ≤ nvs_dist u v + nvs_dist v w :=
calc
nvs_dist u w = ∥ (u - v) + (v - w) ∥ : by rewrite [↑nvs_dist, *sub_eq_add_neg, add.assoc,
neg_add_cancel_left]
... ≤ ∥ u - v ∥ + ∥ v - w ∥ : norm_triangle
private lemma nvs_dist_comm (u v : V) : nvs_dist u v = nvs_dist v u :=
by rewrite [↑nvs_dist, -norm_neg, neg_sub]
definition normed_vector_space_to_metric_space [reducible] [trans_instance]
(V : Type) [nvsV : normed_vector_space V] :
metric_space V :=
⦃ metric_space,
dist := nvs_dist,
dist_self := nvs_dist_self,
eq_of_dist_eq_zero := eq_of_nvs_dist_eq_zero,
dist_comm := nvs_dist_comm,
dist_triangle := nvs_dist_triangle
open nat
proposition converges_to_seq_norm_elim {X : → V} {x : V} (H : X ⟶ x in ) :
∀ {ε : }, ε > 0 → ∃ N₁ : , ∀ {n : }, n ≥ N₁ → ∥ X n - x ∥ < ε := H
proposition dist_eq_norm_sub (u v : V) : dist u v = ∥ u - v ∥ := rfl
proposition norm_eq_dist_zero (u : V) : ∥ u ∥ = dist u 0 :=
by rewrite [dist_eq_norm_sub, sub_zero]
proposition norm_nonneg (u : V) : ∥ u ∥ ≥ 0 :=
by rewrite norm_eq_dist_zero; apply !dist_nonneg
end
structure banach_space [class] (V : Type) extends nvsV : normed_vector_space V :=
(complete : ∀ X, @analysis.cauchy V (@normed_vector_space_to_metric_space V nvsV) X →
@analysis.converges_seq V (@normed_vector_space_to_metric_space V nvsV) X)
definition banach_space_to_metric_space [reducible] [trans_instance]
(V : Type) [bsV : banach_space V] :
complete_metric_space V :=
⦃ complete_metric_space, normed_vector_space_to_metric_space V,
complete := banach_space.complete
namespace analysis
variable {V : Type}
variable [normed_vector_space V]
variables {X Y : → V}
variables {x y : V}
proposition add_converges_to_seq (HX : X ⟶ x in ) (HY : Y ⟶ y in ) :
(λ n, X n + Y n) ⟶ x + y in :=
take ε : , suppose ε > 0,
have e2pos : ε / 2 > 0, from div_pos_of_pos_of_pos `ε > 0` two_pos,
obtain (N₁ : ) (HN₁ : ∀ {n}, n ≥ N₁ → ∥ X n - x ∥ < ε / 2),
from converges_to_seq_norm_elim HX e2pos,
obtain (N₂ : ) (HN₂ : ∀ {n}, n ≥ N₂ → ∥ Y n - y ∥ < ε / 2),
from converges_to_seq_norm_elim HY e2pos,
let N := max N₁ N₂ in
exists.intro N
(take n,
suppose n ≥ N,
have ngtN₁ : n ≥ N₁, from nat.le_trans !le_max_left `n ≥ N`,
have ngtN₂ : n ≥ N₂, from nat.le_trans !le_max_right `n ≥ N`,
show ∥ (X n + Y n) - (x + y) ∥ < ε, from calc
∥ (X n + Y n) - (x + y) ∥
= ∥ (X n - x) + (Y n - y) ∥ : by rewrite [sub_add_eq_sub_sub, *sub_eq_add_neg,
*add.assoc, add.left_comm (-x)]
... ≤ ∥ X n - x ∥ + ∥ Y n - y ∥ : norm_triangle
... < ε / 2 + ε / 2 : add_lt_add (HN₁ ngtN₁) (HN₂ ngtN₂)
... = ε : add_halves)
private lemma smul_converges_to_seq_aux {c : } (cnz : c ≠ 0) (HX : X ⟶ x in ) :
(λ n, c • X n) ⟶ c • x in :=
take ε : , suppose ε > 0,
have abscpos : abs c > 0, from abs_pos_of_ne_zero cnz,
have epos : ε / abs c > 0, from div_pos_of_pos_of_pos `ε > 0` abscpos,
obtain N (HN : ∀ {n}, n ≥ N → norm (X n - x) < ε / abs c), from converges_to_seq_norm_elim HX epos,
exists.intro N
(take n,
suppose n ≥ N,
have H : norm (X n - x) < ε / abs c, from HN this,
show norm (c • X n - c • x) < ε, from calc
norm (c • X n - c • x)
= abs c * norm (X n - x) : by rewrite [-smul_sub_left_distrib, norm_smul]
... < abs c * (ε / abs c) : mul_lt_mul_of_pos_left H abscpos
... = ε : mul_div_cancel' (ne_of_gt abscpos))
proposition smul_converges_to_seq (c : ) (HX : X ⟶ x in ) :
(λ n, c • X n) ⟶ c • x in :=
by_cases
(assume cz : c = 0,
have (λ n, c • X n) = (λ n, 0), from funext (take x, by rewrite [cz, zero_smul]),
begin+ rewrite [this, cz, zero_smul], apply converges_to_seq_constant end)
(suppose c ≠ 0, smul_converges_to_seq_aux this HX)
proposition neg_converges_to_seq (HX : X ⟶ x in ) :
(λ n, - X n) ⟶ - x in :=
take ε, suppose ε > 0,
obtain N (HN : ∀ {n}, n ≥ N → norm (X n - x) < ε), from converges_to_seq_norm_elim HX this,
exists.intro N
(take n,
suppose n ≥ N,
show norm (- X n - (- x)) < ε,
by rewrite [-neg_neg_sub_neg, *neg_neg, norm_neg]; exact HN `n ≥ N`)
proposition neg_converges_to_seq_iff : ((λ n, - X n) ⟶ - x in ) ↔ (X ⟶ x in ) :=
have aux : X = λ n, (- (- X n)), from funext (take n, by rewrite neg_neg),
iff.intro
(assume H : (λ n, -X n)⟶ -x in ,
show X ⟶ x in , by+ rewrite [aux, -neg_neg x]; exact neg_converges_to_seq H)
neg_converges_to_seq
proposition norm_converges_to_seq_zero (HX : X ⟶ 0 in ) : (λ n, norm (X n)) ⟶ 0 in :=
take ε, suppose ε > 0,
obtain N (HN : ∀ n, n ≥ N → norm (X n - 0) < ε), from HX `ε > 0`,
exists.intro N
(take n, assume Hn : n ≥ N,
have norm (X n) < ε, begin rewrite -(sub_zero (X n)), apply HN n Hn end,
show abs (norm (X n) - 0) < ε, using this,
by rewrite [sub_zero, abs_of_nonneg !norm_nonneg]; apply this)
proposition converges_to_seq_zero_of_norm_converges_to_seq_zero
(HX : (λ n, norm (X n)) ⟶ 0 in ) :
X ⟶ 0 in :=
take ε, suppose ε > 0,
obtain N (HN : ∀ n, n ≥ N → abs (norm (X n) - 0) < ε), from HX `ε > 0`,
exists.intro (N : )
(take n : , assume Hn : n ≥ N,
have HN' : abs (norm (X n) - 0) < ε, from HN n Hn,
have norm (X n) < ε,
by+ rewrite [sub_zero at HN', abs_of_nonneg !norm_nonneg at HN']; apply HN',
show norm (X n - 0) < ε, using this,
by rewrite sub_zero; apply this)
proposition norm_converges_to_seq_zero_iff (X : → V) :
((λ n, norm (X n)) ⟶ 0 in ) ↔ (X ⟶ 0 in ) :=
iff.intro converges_to_seq_zero_of_norm_converges_to_seq_zero norm_converges_to_seq_zero
end analysis