diff --git a/library/theories/analysis/bounded_linear_operator.lean b/library/theories/analysis/bounded_linear_operator.lean new file mode 100644 index 000000000..7104de0fd --- /dev/null +++ b/library/theories/analysis/bounded_linear_operator.lean @@ -0,0 +1,156 @@ +/- +Copyright (c) 2016 Robert Y. Lewis. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Author: Robert Y. Lewis + +Bounded linear operators +-/ +import .normed_space .real_limit algebra.module +open real nat classical +noncomputable theory + +namespace analysis + +section bdd_lin_op + +structure is_bdd_linear_map [class] {V W : Type} [normed_vector_space V] [normed_vector_space W] (f : V → W) extends is_linear_map ℝ f := + (op_norm : ℝ) (op_norm_pos : op_norm > 0) (op_norm_bound : ∀ v : V, ∥f v∥ ≤ op_norm * ∥v∥) + +/-theorem is_bdd_linear_map_id [instance] (V : Type) [normed_vector_space V] : is_bdd_linear_map (λ a : V, a) := + sorry-/ + +theorem is_bdd_linear_map_add [instance] {V W : Type} [normed_vector_space V] [normed_vector_space W] + (f g : V → W) [Hbf : is_bdd_linear_map f] [Hbg : is_bdd_linear_map g] : + is_bdd_linear_map (λ x, f x + g x) := + begin + fapply is_bdd_linear_map.mk, + {intros, + rewrite [linear_map_additive ℝ f, linear_map_additive ℝ g], + simp}, + {intros, + rewrite [linear_map_homogeneous f, linear_map_homogeneous g, smul_left_distrib]}, + {exact is_bdd_linear_map.op_norm _ _ f + is_bdd_linear_map.op_norm _ _ g}, + {apply add_pos, + repeat apply is_bdd_linear_map.op_norm_pos}, + {intro, + apply le.trans, + apply norm_triangle, + rewrite right_distrib, + apply add_le_add, + repeat apply is_bdd_linear_map.op_norm_bound} + end + +variables {V W : Type} +variables [HV : normed_vector_space V] [HW : normed_vector_space W] +--variable f : V → W --linear_operator V W +include HV HW +variable f : V → W +variable [Hf : is_bdd_linear_map f] +include Hf + +definition op_norm := is_bdd_linear_map.op_norm _ _ f + +theorem op_norm_pos : op_norm f > 0 := is_bdd_linear_map.op_norm_pos _ _ f + +theorem op_norm_bound (v : V) : ∥f v∥ ≤ (op_norm f) * ∥v∥ := is_bdd_linear_map.op_norm_bound _ _ f v + +theorem bounded_linear_operator_continuous : continuous f := + begin + intro x, + apply normed_vector_space.continuous_at_intro, + intro ε Hε, + existsi ε / (op_norm f), + split, + apply div_pos_of_pos_of_pos Hε !op_norm_pos, + intro x' Hx', + rewrite [-linear_map_sub f], + apply lt_of_le_of_lt, + apply op_norm_bound f, + rewrite [-@mul_div_cancel' _ _ ε (op_norm f) (ne_of_gt !op_norm_pos)], + apply mul_lt_mul_of_pos_left, + exact Hx', + apply op_norm_pos + end + +end bdd_lin_op + +section frechet_deriv +variables {V W : Type} +variables [HV : normed_vector_space V] [HW : normed_vector_space W] +include HV HW + +open topology + +definition is_frechet_deriv_at (f A : V → W) [is_bdd_linear_map A] (x : V) := + (λ h : V, ∥f (x + h) - f x - A h ∥ / ∥ h ∥) ⟶ 0 at 0 + +structure frechet_diffable_at [class] (f : V → W) (x : V) := + (A : V → W) [HA : is_bdd_linear_map A] (is_fr_der : is_frechet_deriv_at f A x) + +variables f g : V → W +variable x : V + +definition frechet_deriv_at [Hf : frechet_diffable_at f x] : V → W := + frechet_diffable_at.A _ _ f x + +definition frechet_deriv_at_is_bdd_linear_map [instance] (f : V → W) (x : V) [Hf : frechet_diffable_at f x] : + is_bdd_linear_map (frechet_deriv_at f x) := + frechet_diffable_at.HA _ _ f x + +theorem frechet_deriv_spec [Hf : frechet_diffable_at f x] : + (λ h : V, ∥f (x + h) - f x - (frechet_deriv_at f x h) ∥ / ∥ h ∥) ⟶ 0 at 0 := + frechet_diffable_at.is_fr_der _ _ f x + +theorem frechet_diffable_at_add (A B : V → W) [is_bdd_linear_map A] [is_bdd_linear_map B] + (Hf : is_frechet_deriv_at f A x) (Hg : is_frechet_deriv_at g B x) : + is_frechet_deriv_at (λ y, f y + g y) (λ y, A y + B y) x := + begin + rewrite ↑is_frechet_deriv_at, + have Hle : ∀ h, ∥f (x + h) + g (x + h) - (f x + g x) - (A h + B h)∥ / ∥h∥ ≤ + ∥f (x + h) - f x - A h∥ / ∥h∥ + ∥g (x + h) - g x - B h∥ / ∥h∥, begin + intro h, + cases em (∥h∥ > 0) with Hh Hh, + krewrite div_add_div_same, + apply div_le_div_of_le_of_pos, + have Hfeq : f (x + h) + g (x + h) - (f x + g x) - (A h + B h) = + (f (x + h) - f x - A h) + (g (x + h) - g x - B h), by simp, + rewrite Hfeq, + apply norm_triangle, + exact Hh, + have Hhe : ∥h∥ = 0, from eq_of_le_of_ge (le_of_not_gt Hh) !norm_nonneg, + krewrite [Hhe, *div_zero, zero_add], + eapply le.refl + end, + have Hlimge : (λ h, ∥f (x + h) - f x - A h∥ / ∥h∥ + ∥g (x + h) - g x - B h∥ / ∥h∥) ⟶ 0 at 0, begin + rewrite [-zero_add 0], + apply add_converges_to_at, + apply Hf, + apply Hg + end, + have Hlimle : (λ (h : V), (0 : ℝ)) ⟶ 0 at 0, from converges_to_at_constant 0 0, + apply converges_to_at_squeeze Hlimle Hlimge, + intro y, + apply div_nonneg_of_nonneg_of_nonneg, + repeat apply norm_nonneg, + apply Hle + end + +/-theorem continuous_at_of_diffable_at [Hf : frechet_diffable_at f x] : continuous_at f x := + begin + apply normed_vector_space.continuous_at_intro, + intros ε Hε, + note Hfds := frechet_deriv_spec f x Hε, + cases Hfds with δ Hδ, + cases Hδ with Hδ Hδ', + existsi δ, + split, + assumption, + intro x' Hx', + have Hx'x : x' - x ≠ 0 ∧ dist (x' - x) 0 < δ, from sorry, + note Hδ'' := Hδ' Hx'x, + + end-/ + +end frechet_deriv + +end analysis diff --git a/library/theories/analysis/metric_space.lean b/library/theories/analysis/metric_space.lean index faa43d449..b488dddd8 100644 --- a/library/theories/analysis/metric_space.lean +++ b/library/theories/analysis/metric_space.lean @@ -399,6 +399,17 @@ definition converges_to_at (f : M → N) (y : N) (x : M) := notation f `⟶` y `at` x := converges_to_at f y x +theorem converges_to_at_constant (y : N) (x : M) : (λ m, y) ⟶ y at x := + begin + intros ε Hε, + existsi 1, + split, + exact zero_lt_one, + intros x' Hx', + rewrite dist_self, + apply Hε + end + definition converges_at [class] (f : M → N) (x : M) := ∃ y, converges_to_at f y x diff --git a/library/theories/analysis/normed_space.lean b/library/theories/analysis/normed_space.lean index 3e555f2fd..82c77e55f 100644 --- a/library/theories/analysis/normed_space.lean +++ b/library/theories/analysis/normed_space.lean @@ -241,3 +241,36 @@ proposition norm_converges_to_seq_zero_iff (X : ℕ → V) : iff.intro converges_to_seq_zero_of_norm_converges_to_seq_zero norm_converges_to_seq_zero end analysis + +namespace analysis +variables {U V : Type} +variable [HU : normed_vector_space U] +variable [HV : normed_vector_space V] +variables f g : U → V + +include HU HV + +theorem add_converges_to_at {lf lg : V} {x : U} (Hf : f ⟶ lf at x) (Hg : g ⟶ lg at x) : + (λ y, f y + g y) ⟶ lf + lg at x := + begin + apply converges_to_at_of_all_conv_seqs, + intro X HX, + apply add_converges_to_seq, + apply all_conv_seqs_of_converges_to_at Hf, + apply HX, + apply all_conv_seqs_of_converges_to_at Hg, + apply HX + end + +open topology + +theorem normed_vector_space.continuous_at_intro {x : U} + (H : ∀ ε : ℝ, ε > 0 → (∃ δ : ℝ, δ > 0 ∧ ∀ x' : U, ∥x' - x∥ < δ → ∥f x' - f x∥ < ε)) : + continuous_at f x := + continuous_at_intro H + +theorem normed_vector_space.continuous_at_elim {x : U} (H : continuous_at f x) : + ∀ ε : ℝ, ε > 0 → (∃ δ : ℝ, δ > 0 ∧ ∀ x' : U, ∥x' - x∥ < δ → ∥f x' - f x∥ < ε) := + continuous_at_elim H + +end analysis