839 by (auto simp: has_field_derivative_def ac_simps) |
839 by (auto simp: has_field_derivative_def ac_simps) |
840 |
840 |
841 |
841 |
842 subsection \<open>Vector derivative\<close> |
842 subsection \<open>Vector derivative\<close> |
843 |
843 |
844 lemma has_field_derivative_iff_has_vector_derivative: |
844 text \<open>It's for real derivatives only, and not obviously generalisable to field derivatives\<close> |
845 "(f has_field_derivative y) F \<longleftrightarrow> (f has_vector_derivative y) F" |
845 lemma has_real_derivative_iff_has_vector_derivative: |
|
846 "(f has_real_derivative y) F \<longleftrightarrow> (f has_vector_derivative y) F" |
846 unfolding has_vector_derivative_def has_field_derivative_def real_scaleR_def mult_commute_abs .. |
847 unfolding has_vector_derivative_def has_field_derivative_def real_scaleR_def mult_commute_abs .. |
847 |
848 |
848 lemma has_field_derivative_subset: |
849 lemma has_field_derivative_subset: |
849 "(f has_field_derivative y) (at x within s) \<Longrightarrow> t \<subseteq> s \<Longrightarrow> |
850 "(f has_field_derivative y) (at x within s) \<Longrightarrow> t \<subseteq> s \<Longrightarrow> |
850 (f has_field_derivative y) (at x within t)" |
851 (f has_field_derivative y) (at x within t)" |
851 unfolding has_field_derivative_def by (rule has_derivative_subset) |
852 by (fact DERIV_subset) |
852 |
853 |
853 lemma has_vector_derivative_const[simp, derivative_intros]: "((\<lambda>x. c) has_vector_derivative 0) net" |
854 lemma has_vector_derivative_const[simp, derivative_intros]: "((\<lambda>x. c) has_vector_derivative 0) net" |
854 by (auto simp: has_vector_derivative_def) |
855 by (auto simp: has_vector_derivative_def) |
855 |
856 |
856 lemma has_vector_derivative_id[simp, derivative_intros]: "((\<lambda>x. x) has_vector_derivative 1) net" |
857 lemma has_vector_derivative_id[simp, derivative_intros]: "((\<lambda>x. x) has_vector_derivative 1) net" |
901 by (simp add: has_vector_derivative_def scaleR_right scaleR_left scaleR_right_distrib) |
902 by (simp add: has_vector_derivative_def scaleR_right scaleR_left scaleR_right_distrib) |
902 |
903 |
903 lemma has_vector_derivative_scaleR[derivative_intros]: |
904 lemma has_vector_derivative_scaleR[derivative_intros]: |
904 "(f has_field_derivative f') (at x within s) \<Longrightarrow> (g has_vector_derivative g') (at x within s) \<Longrightarrow> |
905 "(f has_field_derivative f') (at x within s) \<Longrightarrow> (g has_vector_derivative g') (at x within s) \<Longrightarrow> |
905 ((\<lambda>x. f x *\<^sub>R g x) has_vector_derivative (f x *\<^sub>R g' + f' *\<^sub>R g x)) (at x within s)" |
906 ((\<lambda>x. f x *\<^sub>R g x) has_vector_derivative (f x *\<^sub>R g' + f' *\<^sub>R g x)) (at x within s)" |
906 unfolding has_field_derivative_iff_has_vector_derivative |
907 unfolding has_real_derivative_iff_has_vector_derivative |
907 by (rule bounded_bilinear.has_vector_derivative[OF bounded_bilinear_scaleR]) |
908 by (rule bounded_bilinear.has_vector_derivative[OF bounded_bilinear_scaleR]) |
908 |
909 |
909 lemma has_vector_derivative_mult[derivative_intros]: |
910 lemma has_vector_derivative_mult[derivative_intros]: |
910 "(f has_vector_derivative f') (at x within s) \<Longrightarrow> (g has_vector_derivative g') (at x within s) \<Longrightarrow> |
911 "(f has_vector_derivative f') (at x within s) \<Longrightarrow> (g has_vector_derivative g') (at x within s) \<Longrightarrow> |
911 ((\<lambda>x. f x * g x) has_vector_derivative (f x * g' + f' * g x)) (at x within s)" |
912 ((\<lambda>x. f x * g x) has_vector_derivative (f x * g' + f' * g x)) (at x within s)" |
913 by (rule bounded_bilinear.has_vector_derivative[OF bounded_bilinear_mult]) |
914 by (rule bounded_bilinear.has_vector_derivative[OF bounded_bilinear_mult]) |
914 |
915 |
915 lemma has_vector_derivative_of_real[derivative_intros]: |
916 lemma has_vector_derivative_of_real[derivative_intros]: |
916 "(f has_field_derivative D) F \<Longrightarrow> ((\<lambda>x. of_real (f x)) has_vector_derivative (of_real D)) F" |
917 "(f has_field_derivative D) F \<Longrightarrow> ((\<lambda>x. of_real (f x)) has_vector_derivative (of_real D)) F" |
917 by (rule bounded_linear.has_vector_derivative[OF bounded_linear_of_real]) |
918 by (rule bounded_linear.has_vector_derivative[OF bounded_linear_of_real]) |
918 (simp add: has_field_derivative_iff_has_vector_derivative) |
919 (simp add: has_real_derivative_iff_has_vector_derivative) |
919 |
920 |
920 lemma has_vector_derivative_real_field: |
921 lemma has_vector_derivative_real_field: |
921 "(f has_field_derivative f') (at (of_real a)) \<Longrightarrow> ((\<lambda>x. f (of_real x)) has_vector_derivative f') (at a within s)" |
922 "(f has_field_derivative f') (at (of_real a)) \<Longrightarrow> ((\<lambda>x. f (of_real x)) has_vector_derivative f') (at a within s)" |
922 using has_derivative_compose[of of_real of_real a _ f "(*) f'"] |
923 using has_derivative_compose[of of_real of_real a _ f "(*) f'"] |
923 by (simp add: scaleR_conv_of_real ac_simps has_vector_derivative_def has_field_derivative_def) |
924 by (simp add: scaleR_conv_of_real ac_simps has_vector_derivative_def has_field_derivative_def) |