src/HOL/Analysis/Uniform_Limit.thy
changeset 65036 ab7e11730ad8
parent 64267 b9a1486e79be
child 65037 2cf841ff23be
equal deleted inserted replaced
65035:b46fe5138cb0 65036:ab7e11730ad8
   470 lemmas bounded_bilinear_bounded_uniform_limit_intros[uniform_limit_intros] =
   470 lemmas bounded_bilinear_bounded_uniform_limit_intros[uniform_limit_intros] =
   471   bounded_bilinear.bounded_uniform_limit[OF Inner_Product.bounded_bilinear_inner]
   471   bounded_bilinear.bounded_uniform_limit[OF Inner_Product.bounded_bilinear_inner]
   472   bounded_bilinear.bounded_uniform_limit[OF Real_Vector_Spaces.bounded_bilinear_mult]
   472   bounded_bilinear.bounded_uniform_limit[OF Real_Vector_Spaces.bounded_bilinear_mult]
   473   bounded_bilinear.bounded_uniform_limit[OF Real_Vector_Spaces.bounded_bilinear_scaleR]
   473   bounded_bilinear.bounded_uniform_limit[OF Real_Vector_Spaces.bounded_bilinear_scaleR]
   474 
   474 
       
   475 lemma uniform_lim_mult:
       
   476   fixes f :: "'a \<Rightarrow> 'b \<Rightarrow> 'c::real_normed_algebra"
       
   477   assumes f: "uniform_limit S f l F"
       
   478       and g: "uniform_limit S g m F"
       
   479       and l: "bounded (l ` S)"
       
   480       and m: "bounded (m ` S)"
       
   481     shows "uniform_limit S (\<lambda>a b. f a b * g a b) (\<lambda>a. l a * m a) F"
       
   482   by (intro bounded_bilinear_bounded_uniform_limit_intros assms)
       
   483 
       
   484 lemma uniform_lim_inverse:
       
   485   fixes f :: "'a \<Rightarrow> 'b \<Rightarrow> 'c::real_normed_field"
       
   486   assumes f: "uniform_limit S f l F"
       
   487       and b: "\<And>x. x \<in> S \<Longrightarrow> b \<le> norm(l x)"
       
   488       and "b > 0"
       
   489     shows "uniform_limit S (\<lambda>x y. inverse (f x y)) (inverse \<circ> l) F"
       
   490 proof (rule uniform_limitI)
       
   491   fix e::real
       
   492   assume "e > 0"
       
   493   have lte: "dist (inverse (f x y)) ((inverse \<circ> l) y) < e"
       
   494            if "b/2 \<le> norm (f x y)" "norm (f x y - l y) < e * b\<^sup>2 / 2" "y \<in> S"
       
   495            for x y
       
   496   proof -
       
   497     have [simp]: "l y \<noteq> 0" "f x y \<noteq> 0"
       
   498       using \<open>b > 0\<close> that b [OF \<open>y \<in> S\<close>] by fastforce+
       
   499     have "norm (l y - f x y) <  e * b\<^sup>2 / 2"
       
   500       by (metis norm_minus_commute that(2))
       
   501     also have "... \<le> e * (norm (f x y) * norm (l y))"
       
   502       using \<open>e > 0\<close> that b [OF \<open>y \<in> S\<close>] apply (simp add: power2_eq_square)
       
   503       by (metis \<open>b > 0\<close> less_eq_real_def mult.left_commute mult_mono')
       
   504     finally show ?thesis
       
   505       by (auto simp: dist_norm divide_simps norm_mult norm_divide)
       
   506   qed
       
   507   have "\<forall>\<^sub>F n in F. \<forall>x\<in>S. dist (f n x) (l x) < b/2"
       
   508     using uniform_limitD [OF f, of "b/2"] by (simp add: \<open>b > 0\<close>)
       
   509   then have "\<forall>\<^sub>F x in F. \<forall>y\<in>S. b/2 \<le> norm (f x y)"
       
   510     apply (rule eventually_mono)
       
   511     using b apply (simp only: dist_norm)
       
   512     by (metis (no_types, hide_lams) diff_zero dist_commute dist_norm norm_triangle_half_l not_less)
       
   513   then have "\<forall>\<^sub>F x in F. \<forall>y\<in>S. b/2 \<le> norm (f x y) \<and> norm (f x y - l y) < e * b\<^sup>2 / 2"
       
   514     apply (simp only: ball_conj_distrib dist_norm [symmetric])
       
   515     apply (rule eventually_conj, assumption)
       
   516       apply (rule uniform_limitD [OF f, of "e * b ^ 2 / 2"])
       
   517     using \<open>b > 0\<close> \<open>e > 0\<close> by auto
       
   518   then show "\<forall>\<^sub>F x in F. \<forall>y\<in>S. dist (inverse (f x y)) ((inverse \<circ> l) y) < e"
       
   519     using lte by (force intro: eventually_mono)
       
   520 qed
       
   521 
       
   522 lemma uniform_lim_div:
       
   523   fixes f :: "'a \<Rightarrow> 'b \<Rightarrow> 'c::real_normed_field"
       
   524   assumes f: "uniform_limit S f l F"
       
   525       and g: "uniform_limit S g m F"
       
   526       and l: "bounded (l ` S)"
       
   527       and b: "\<And>x. x \<in> S \<Longrightarrow> b \<le> norm(m x)"
       
   528       and "b > 0"
       
   529     shows "uniform_limit S (\<lambda>a b. f a b / g a b) (\<lambda>a. l a / m a) F"
       
   530 proof -
       
   531   have m: "bounded ((inverse \<circ> m) ` S)"
       
   532     using b \<open>b > 0\<close>
       
   533     apply (simp add: bounded_iff)
       
   534     by (metis le_imp_inverse_le norm_inverse)
       
   535   have "uniform_limit S (\<lambda>a b. f a b * inverse (g a b))
       
   536          (\<lambda>a. l a * (inverse \<circ> m) a) F"
       
   537     by (rule uniform_lim_mult [OF f uniform_lim_inverse [OF g b \<open>b > 0\<close>] l m])
       
   538   then show ?thesis
       
   539     by (simp add: field_class.field_divide_inverse)
       
   540 qed
       
   541 
   475 lemma uniform_limit_null_comparison:
   542 lemma uniform_limit_null_comparison:
   476   assumes "\<forall>\<^sub>F x in F. \<forall>a\<in>S. norm (f x a) \<le> g x a"
   543   assumes "\<forall>\<^sub>F x in F. \<forall>a\<in>S. norm (f x a) \<le> g x a"
   477   assumes "uniform_limit S g (\<lambda>_. 0) F"
   544   assumes "uniform_limit S g (\<lambda>_. 0) F"
   478   shows "uniform_limit S f (\<lambda>_. 0) F"
   545   shows "uniform_limit S f (\<lambda>_. 0) F"
   479   using assms(2)
   546   using assms(2)
   480 proof (rule metric_uniform_limit_imp_uniform_limit)
   547 proof (rule metric_uniform_limit_imp_uniform_limit)
   481   show "\<forall>\<^sub>F x in F. \<forall>y\<in>S. dist (f x y) 0 \<le> dist (g x y) 0"
   548   show "\<forall>\<^sub>F x in F. \<forall>y\<in>S. dist (f x y) 0 \<le> dist (g x y) 0"
   482     using assms(1) by (rule eventually_mono) (force simp add: dist_norm)
   549     using assms(1) by (rule eventually_mono) (force simp add: dist_norm)
   483 qed
   550 qed
   484 
   551 
   485 lemma uniform_limit_on_union:
   552 lemma uniform_limit_on_Un:
   486   "uniform_limit I f g F \<Longrightarrow> uniform_limit J f g F \<Longrightarrow> uniform_limit (I \<union> J) f g F"
   553   "uniform_limit I f g F \<Longrightarrow> uniform_limit J f g F \<Longrightarrow> uniform_limit (I \<union> J) f g F"
   487   by (auto intro!: uniform_limitI dest!: uniform_limitD elim: eventually_elim2)
   554   by (auto intro!: uniform_limitI dest!: uniform_limitD elim: eventually_elim2)
   488 
   555 
   489 lemma uniform_limit_on_empty [iff]:
   556 lemma uniform_limit_on_empty [iff]:
   490   "uniform_limit {} f g F"
   557   "uniform_limit {} f g F"
   493 lemma uniform_limit_on_UNION:
   560 lemma uniform_limit_on_UNION:
   494   assumes "finite S"
   561   assumes "finite S"
   495   assumes "\<And>s. s \<in> S \<Longrightarrow> uniform_limit (h s) f g F"
   562   assumes "\<And>s. s \<in> S \<Longrightarrow> uniform_limit (h s) f g F"
   496   shows "uniform_limit (UNION S h) f g F"
   563   shows "uniform_limit (UNION S h) f g F"
   497   using assms
   564   using assms
   498   by induct (auto intro: uniform_limit_on_empty uniform_limit_on_union)
   565   by induct (auto intro: uniform_limit_on_empty uniform_limit_on_Un)
   499 
   566 
   500 lemma uniform_limit_on_Union:
   567 lemma uniform_limit_on_Union:
   501   assumes "finite I"
   568   assumes "finite I"
   502   assumes "\<And>J. J \<in> I \<Longrightarrow> uniform_limit J f g F"
   569   assumes "\<And>J. J \<in> I \<Longrightarrow> uniform_limit J f g F"
   503   shows "uniform_limit (Union I) f g F"
   570   shows "uniform_limit (Union I) f g F"
   520 lemma uniformly_convergent_mult:
   587 lemma uniformly_convergent_mult:
   521   "uniformly_convergent_on A f \<Longrightarrow>
   588   "uniformly_convergent_on A f \<Longrightarrow>
   522       uniformly_convergent_on A (\<lambda>k x. c * f k x :: 'a :: {real_normed_algebra})"
   589       uniformly_convergent_on A (\<lambda>k x. c * f k x :: 'a :: {real_normed_algebra})"
   523   unfolding uniformly_convergent_on_def
   590   unfolding uniformly_convergent_on_def
   524   by (blast dest: bounded_linear_uniform_limit_intros(13))
   591   by (blast dest: bounded_linear_uniform_limit_intros(13))
   525 
       
   526 
   592 
   527 subsection\<open>Power series and uniform convergence\<close>
   593 subsection\<open>Power series and uniform convergence\<close>
   528 
   594 
   529 proposition powser_uniformly_convergent:
   595 proposition powser_uniformly_convergent:
   530   fixes a :: "nat \<Rightarrow> 'a::{real_normed_div_algebra,banach}"
   596   fixes a :: "nat \<Rightarrow> 'a::{real_normed_div_algebra,banach}"