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: |