src/HOL/Multivariate_Analysis/Derivative.thy
changeset 56182 528fae0816ea
parent 56181 2aa0b19e74f3
child 56183 f998bdd40763
equal deleted inserted replaced
56181:2aa0b19e74f3 56182:528fae0816ea
   217 
   217 
   218 subsection {* Differentiability *}
   218 subsection {* Differentiability *}
   219 
   219 
   220 definition
   220 definition
   221   differentiable_on :: "('a::real_normed_vector \<Rightarrow> 'b::real_normed_vector) \<Rightarrow> 'a set \<Rightarrow> bool"
   221   differentiable_on :: "('a::real_normed_vector \<Rightarrow> 'b::real_normed_vector) \<Rightarrow> 'a set \<Rightarrow> bool"
   222     (infixr "differentiable'_on" 30)
   222     (infix "differentiable'_on" 50)
   223   where "f differentiable_on s \<longleftrightarrow> (\<forall>x\<in>s. f differentiable (at x within s))"
   223   where "f differentiable_on s \<longleftrightarrow> (\<forall>x\<in>s. f differentiable (at x within s))"
   224 
   224 
   225 lemma differentiableI: "(f has_derivative f') net \<Longrightarrow> f differentiable net"
   225 lemma differentiableI: "(f has_derivative f') net \<Longrightarrow> f differentiable net"
   226   unfolding differentiable_def
   226   unfolding differentiable_def
   227   by auto
   227   by auto
   565   assumes min: "eventually (\<lambda>y. f x \<le> f y) (at x)"
   565   assumes min: "eventually (\<lambda>y. f x \<le> f y) (at x)"
   566   shows "f' = (\<lambda>h. 0)"
   566   shows "f' = (\<lambda>h. 0)"
   567 proof
   567 proof
   568   fix h :: 'a
   568   fix h :: 'a
   569   interpret f': bounded_linear f'
   569   interpret f': bounded_linear f'
   570     using deriv by (rule FDERIV_bounded_linear)
   570     using deriv by (rule has_derivative_bounded_linear)
   571   show "f' h = 0"
   571   show "f' h = 0"
   572   proof (cases "h = 0")
   572   proof (cases "h = 0")
   573     assume "h \<noteq> 0"
   573     assume "h \<noteq> 0"
   574     from min obtain d where d1: "0 < d" and d2: "\<forall>y\<in>ball x d. f x \<le> f y"
   574     from min obtain d where d1: "0 < d" and d2: "\<forall>y\<in>ball x d. f x \<le> f y"
   575       unfolding eventually_at by (force simp: dist_commute)
   575       unfolding eventually_at by (force simp: dist_commute)
   576     have "FDERIV (\<lambda>r. x + r *\<^sub>R h) 0 :> (\<lambda>r. r *\<^sub>R h)"
   576     have "FDERIV (\<lambda>r. x + r *\<^sub>R h) 0 :> (\<lambda>r. r *\<^sub>R h)"
   577       by (intro FDERIV_eq_intros, auto)
   577       by (intro has_derivative_eq_intros, auto)
   578     then have "FDERIV (\<lambda>r. f (x + r *\<^sub>R h)) 0 :> (\<lambda>k. f' (k *\<^sub>R h))"
   578     then have "FDERIV (\<lambda>r. f (x + r *\<^sub>R h)) 0 :> (\<lambda>k. f' (k *\<^sub>R h))"
   579       by (rule FDERIV_compose, simp add: deriv)
   579       by (rule has_derivative_compose, simp add: deriv)
   580     then have "DERIV (\<lambda>r. f (x + r *\<^sub>R h)) 0 :> f' h"
   580     then have "DERIV (\<lambda>r. f (x + r *\<^sub>R h)) 0 :> f' h"
   581       unfolding deriv_fderiv by (simp add: f'.scaleR)
   581       unfolding has_field_derivative_def by (simp add: f'.scaleR mult_commute_abs)
   582     moreover have "0 < d / norm h"
   582     moreover have "0 < d / norm h"
   583       using d1 and `h \<noteq> 0` by (simp add: divide_pos_pos)
   583       using d1 and `h \<noteq> 0` by (simp add: divide_pos_pos)
   584     moreover have "\<forall>y. \<bar>0 - y\<bar> < d / norm h \<longrightarrow> f (x + 0 *\<^sub>R h) \<le> f (x + y *\<^sub>R h)"
   584     moreover have "\<forall>y. \<bar>0 - y\<bar> < d / norm h \<longrightarrow> f (x + 0 *\<^sub>R h) \<le> f (x + y *\<^sub>R h)"
   585       using `h \<noteq> 0` by (auto simp add: d2 dist_norm pos_less_divide_eq)
   585       using `h \<noteq> 0` by (auto simp add: d2 dist_norm pos_less_divide_eq)
   586     ultimately show "f' h = 0"
   586     ultimately show "f' h = 0"
   628   let ?f' = "frechet_derivative f (at x)"
   628   let ?f' = "frechet_derivative f (at x)"
   629   have "x \<in> ball x e" using `0 < e` by simp
   629   have "x \<in> ball x e" using `0 < e` by simp
   630   moreover have "open (ball x e)" by simp
   630   moreover have "open (ball x e)" by simp
   631   moreover have "((\<lambda>x. f x \<bullet> k) has_derivative (\<lambda>h. ?f' h \<bullet> k)) (at x)"
   631   moreover have "((\<lambda>x. f x \<bullet> k) has_derivative (\<lambda>h. ?f' h \<bullet> k)) (at x)"
   632     using bounded_linear_inner_left diff[unfolded frechet_derivative_works]
   632     using bounded_linear_inner_left diff[unfolded frechet_derivative_works]
   633     by (rule bounded_linear.FDERIV)
   633     by (rule bounded_linear.has_derivative)
   634   ultimately have "(\<lambda>h. frechet_derivative f (at x) h \<bullet> k) = (\<lambda>v. 0)"
   634   ultimately have "(\<lambda>h. frechet_derivative f (at x) h \<bullet> k) = (\<lambda>v. 0)"
   635     using ball(2) by (rule differential_zero_maxmin)
   635     using ball(2) by (rule differential_zero_maxmin)
   636   then show ?thesis
   636   then show ?thesis
   637     unfolding fun_eq_iff by simp
   637     unfolding fun_eq_iff by simp
   638 qed
   638 qed
  2005 
  2005 
  2006 
  2006 
  2007 text {* Considering derivative @{typ "real \<Rightarrow> 'b\<Colon>real_normed_vector"} as a vector. *}
  2007 text {* Considering derivative @{typ "real \<Rightarrow> 'b\<Colon>real_normed_vector"} as a vector. *}
  2008 
  2008 
  2009 definition has_vector_derivative :: "(real \<Rightarrow> 'b::real_normed_vector) \<Rightarrow> 'b \<Rightarrow> real filter \<Rightarrow> bool"
  2009 definition has_vector_derivative :: "(real \<Rightarrow> 'b::real_normed_vector) \<Rightarrow> 'b \<Rightarrow> real filter \<Rightarrow> bool"
  2010     (infixl "has'_vector'_derivative" 12)
  2010     (infix "has'_vector'_derivative" 50)
  2011   where "(f has_vector_derivative f') net \<longleftrightarrow> (f has_derivative (\<lambda>x. x *\<^sub>R f')) net"
  2011   where "(f has_vector_derivative f') net \<longleftrightarrow> (f has_derivative (\<lambda>x. x *\<^sub>R f')) net"
  2012 
  2012 
  2013 definition "vector_derivative f net = (SOME f'. (f has_vector_derivative f') net)"
  2013 definition "vector_derivative f net = (SOME f'. (f has_vector_derivative f') net)"
  2014 
  2014 
  2015 lemma vector_derivative_works:
  2015 lemma vector_derivative_works: