| author | blanchet | 
| Fri, 29 May 2015 17:17:50 +0200 | |
| changeset 60309 | 72364a93bcb5 | 
| parent 60177 | 2bfcb83531c6 | 
| child 60758 | d8d85a8172b5 | 
| permissions | -rw-r--r-- | 
| 21164 | 1 | (* Title : Deriv.thy | 
| 2 | Author : Jacques D. Fleuriot | |
| 3 | Copyright : 1998 University of Cambridge | |
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 4 | Author : Brian Huffman | 
| 21164 | 5 | Conversion to Isar and new proofs by Lawrence C Paulson, 2004 | 
| 6 | GMVT by Benjamin Porter, 2005 | |
| 7 | *) | |
| 8 | ||
| 58889 | 9 | section{* Differentiation *}
 | 
| 21164 | 10 | |
| 11 | theory Deriv | |
| 51526 | 12 | imports Limits | 
| 21164 | 13 | begin | 
| 14 | ||
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 15 | subsection {* Frechet derivative *}
 | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 16 | |
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 17 | definition | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 18 |   has_derivative :: "('a::real_normed_vector \<Rightarrow> 'b::real_normed_vector) \<Rightarrow> ('a \<Rightarrow> 'b) \<Rightarrow> 'a filter \<Rightarrow>  bool"
 | 
| 56182 
528fae0816ea
update syntax of has_*derivative to infix 50; fixed proofs
 hoelzl parents: 
56181diff
changeset | 19 | (infix "(has'_derivative)" 50) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 20 | where | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 21 | "(f has_derivative f') F \<longleftrightarrow> | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 22 | (bounded_linear f' \<and> | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 23 | ((\<lambda>y. ((f y - f (Lim F (\<lambda>x. x))) - f' (y - Lim F (\<lambda>x. x))) /\<^sub>R norm (y - Lim F (\<lambda>x. x))) ---> 0) F)" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 24 | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 25 | text {*
 | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 26 |   Usually the filter @{term F} is @{term "at x within s"}.  @{term "(f has_derivative D)
 | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 27 |   (at x within s)"} means: @{term D} is the derivative of function @{term f} at point @{term x}
 | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 28 |   within the set @{term s}. Where @{term s} is used to express left or right sided derivatives. In
 | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 29 |   most cases @{term s} is either a variable or @{term UNIV}.
 | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 30 | *} | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 31 | |
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 32 | lemma has_derivative_eq_rhs: "(f has_derivative f') F \<Longrightarrow> f' = g' \<Longrightarrow> (f has_derivative g') F" | 
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 33 | by simp | 
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 34 | |
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 35 | definition | 
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 36 |   has_field_derivative :: "('a::real_normed_field \<Rightarrow> 'a) \<Rightarrow> 'a \<Rightarrow> 'a filter \<Rightarrow> bool"
 | 
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 37 | (infix "(has'_field'_derivative)" 50) | 
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 38 | where | 
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 39 | "(f has_field_derivative D) F \<longleftrightarrow> (f has_derivative op * D) F" | 
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 40 | |
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 41 | lemma DERIV_cong: "(f has_field_derivative X) F \<Longrightarrow> X = Y \<Longrightarrow> (f has_field_derivative Y) F" | 
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 42 | by simp | 
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 43 | |
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 44 | definition | 
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 45 | has_vector_derivative :: "(real \<Rightarrow> 'b::real_normed_vector) \<Rightarrow> 'b \<Rightarrow> real filter \<Rightarrow> bool" | 
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 46 | (infix "has'_vector'_derivative" 50) | 
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 47 | where | 
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 48 | "(f has_vector_derivative f') net \<longleftrightarrow> (f has_derivative (\<lambda>x. x *\<^sub>R f')) net" | 
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 49 | |
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 50 | lemma has_vector_derivative_eq_rhs: "(f has_vector_derivative X) F \<Longrightarrow> X = Y \<Longrightarrow> (f has_vector_derivative Y) F" | 
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 51 | by simp | 
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 52 | |
| 57953 | 53 | named_theorems derivative_intros "structural introduction rules for derivatives" | 
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 54 | setup {*
 | 
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 55 | let | 
| 57953 | 56 |     val eq_thms = @{thms has_derivative_eq_rhs DERIV_cong has_vector_derivative_eq_rhs}
 | 
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 57 | fun eq_rule thm = get_first (try (fn eq_thm => eq_thm OF [thm])) eq_thms | 
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 58 | in | 
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 59 | Global_Theory.add_thms_dynamic | 
| 57953 | 60 |       (@{binding derivative_eq_intros},
 | 
| 61 | fn context => | |
| 62 |           Named_Theorems.get (Context.proof_of context) @{named_theorems derivative_intros}
 | |
| 63 | |> map_filter eq_rule) | |
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 64 | end; | 
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 65 | *} | 
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 66 | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 67 | text {*
 | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 68 | The following syntax is only used as a legacy syntax. | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 69 | *} | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 70 | abbreviation (input) | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 71 |   FDERIV :: "('a::real_normed_vector \<Rightarrow> 'b::real_normed_vector) \<Rightarrow> 'a \<Rightarrow>  ('a \<Rightarrow> 'b) \<Rightarrow> bool"
 | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 72 |   ("(FDERIV (_)/ (_)/ :> (_))" [1000, 1000, 60] 60)
 | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 73 | where | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 74 | "FDERIV f x :> f' \<equiv> (f has_derivative f') (at x)" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 75 | |
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 76 | lemma has_derivative_bounded_linear: "(f has_derivative f') F \<Longrightarrow> bounded_linear f'" | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 77 | by (simp add: has_derivative_def) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 78 | |
| 56369 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56289diff
changeset | 79 | lemma has_derivative_linear: "(f has_derivative f') F \<Longrightarrow> linear f'" | 
| 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56289diff
changeset | 80 | using bounded_linear.linear[OF has_derivative_bounded_linear] . | 
| 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56289diff
changeset | 81 | |
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 82 | lemma has_derivative_ident[derivative_intros, simp]: "((\<lambda>x. x) has_derivative (\<lambda>x. x)) F" | 
| 58729 
e8ecc79aee43
add tendsto_const and tendsto_ident_at as simp and intro rules
 hoelzl parents: 
57953diff
changeset | 83 | by (simp add: has_derivative_def) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 84 | |
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 85 | lemma has_derivative_const[derivative_intros, simp]: "((\<lambda>x. c) has_derivative (\<lambda>x. 0)) F" | 
| 58729 
e8ecc79aee43
add tendsto_const and tendsto_ident_at as simp and intro rules
 hoelzl parents: 
57953diff
changeset | 86 | by (simp add: has_derivative_def) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 87 | |
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 88 | lemma (in bounded_linear) bounded_linear: "bounded_linear f" .. | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 89 | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 90 | lemma (in bounded_linear) has_derivative: | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 91 | "(g has_derivative g') F \<Longrightarrow> ((\<lambda>x. f (g x)) has_derivative (\<lambda>x. f (g' x))) F" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 92 | using assms unfolding has_derivative_def | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 93 | apply safe | 
| 56219 | 94 | apply (erule bounded_linear_compose [OF bounded_linear]) | 
| 95 | apply (drule tendsto) | |
| 96 | apply (simp add: scaleR diff add zero) | |
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 97 | done | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 98 | |
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 99 | lemmas has_derivative_scaleR_right [derivative_intros] = | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 100 | bounded_linear.has_derivative [OF bounded_linear_scaleR_right] | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 101 | |
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 102 | lemmas has_derivative_scaleR_left [derivative_intros] = | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 103 | bounded_linear.has_derivative [OF bounded_linear_scaleR_left] | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 104 | |
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 105 | lemmas has_derivative_mult_right [derivative_intros] = | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 106 | bounded_linear.has_derivative [OF bounded_linear_mult_right] | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 107 | |
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 108 | lemmas has_derivative_mult_left [derivative_intros] = | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 109 | bounded_linear.has_derivative [OF bounded_linear_mult_left] | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 110 | |
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 111 | lemma has_derivative_add[simp, derivative_intros]: | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 112 | assumes f: "(f has_derivative f') F" and g: "(g has_derivative g') F" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 113 | shows "((\<lambda>x. f x + g x) has_derivative (\<lambda>x. f' x + g' x)) F" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 114 | unfolding has_derivative_def | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 115 | proof safe | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 116 | let ?x = "Lim F (\<lambda>x. x)" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 117 | let ?D = "\<lambda>f f' y. ((f y - f ?x) - f' (y - ?x)) /\<^sub>R norm (y - ?x)" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 118 | have "((\<lambda>x. ?D f f' x + ?D g g' x) ---> (0 + 0)) F" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 119 | using f g by (intro tendsto_add) (auto simp: has_derivative_def) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 120 | then show "(?D (\<lambda>x. f x + g x) (\<lambda>x. f' x + g' x) ---> 0) F" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 121 | by (simp add: field_simps scaleR_add_right scaleR_diff_right) | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 122 | qed (blast intro: bounded_linear_add f g has_derivative_bounded_linear) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 123 | |
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 124 | lemma has_derivative_setsum[simp, derivative_intros]: | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 125 | assumes f: "\<And>i. i \<in> I \<Longrightarrow> (f i has_derivative f' i) F" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 126 | shows "((\<lambda>x. \<Sum>i\<in>I. f i x) has_derivative (\<lambda>x. \<Sum>i\<in>I. f' i x)) F" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 127 | proof cases | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 128 | assume "finite I" from this f show ?thesis | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 129 | by induct (simp_all add: f) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 130 | qed simp | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 131 | |
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 132 | lemma has_derivative_minus[simp, derivative_intros]: "(f has_derivative f') F \<Longrightarrow> ((\<lambda>x. - f x) has_derivative (\<lambda>x. - f' x)) F" | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 133 | using has_derivative_scaleR_right[of f f' F "-1"] by simp | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 134 | |
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 135 | lemma has_derivative_diff[simp, derivative_intros]: | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 136 | "(f has_derivative f') F \<Longrightarrow> (g has_derivative g') F \<Longrightarrow> ((\<lambda>x. f x - g x) has_derivative (\<lambda>x. f' x - g' x)) F" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 137 | by (simp only: diff_conv_add_uminus has_derivative_add has_derivative_minus) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 138 | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 139 | lemma has_derivative_at_within: | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 140 | "(f has_derivative f') (at x within s) \<longleftrightarrow> | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 141 | (bounded_linear f' \<and> ((\<lambda>y. ((f y - f x) - f' (y - x)) /\<^sub>R norm (y - x)) ---> 0) (at x within s))" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 142 | by (cases "at x within s = bot") (simp_all add: has_derivative_def Lim_ident_at) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 143 | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 144 | lemma has_derivative_iff_norm: | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 145 | "(f has_derivative f') (at x within s) \<longleftrightarrow> | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 146 | (bounded_linear f' \<and> ((\<lambda>y. norm ((f y - f x) - f' (y - x)) / norm (y - x)) ---> 0) (at x within s))" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 147 | using tendsto_norm_zero_iff[of _ "at x within s", where 'b="'b", symmetric] | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 148 | by (simp add: has_derivative_at_within divide_inverse ac_simps) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 149 | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 150 | lemma has_derivative_at: | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 151 | "(f has_derivative D) (at x) \<longleftrightarrow> (bounded_linear D \<and> (\<lambda>h. norm (f (x + h) - f x - D h) / norm h) -- 0 --> 0)" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 152 | unfolding has_derivative_iff_norm LIM_offset_zero_iff[of _ _ x] by simp | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 153 | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 154 | lemma field_has_derivative_at: | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 155 | fixes x :: "'a::real_normed_field" | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 156 | shows "(f has_derivative op * D) (at x) \<longleftrightarrow> (\<lambda>h. (f (x + h) - f x) / h) -- 0 --> D" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 157 | apply (unfold has_derivative_at) | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 158 | apply (simp add: bounded_linear_mult_right) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 159 | apply (simp cong: LIM_cong add: nonzero_norm_divide [symmetric]) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 160 | apply (subst diff_divide_distrib) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 161 | apply (subst times_divide_eq_left [symmetric]) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 162 | apply (simp cong: LIM_cong) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 163 | apply (simp add: tendsto_norm_zero_iff LIM_zero_iff) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 164 | done | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 165 | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 166 | lemma has_derivativeI: | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 167 | "bounded_linear f' \<Longrightarrow> ((\<lambda>y. ((f y - f x) - f' (y - x)) /\<^sub>R norm (y - x)) ---> 0) (at x within s) \<Longrightarrow> | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 168 | (f has_derivative f') (at x within s)" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 169 | by (simp add: has_derivative_at_within) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 170 | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 171 | lemma has_derivativeI_sandwich: | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 172 | assumes e: "0 < e" and bounded: "bounded_linear f'" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 173 | and sandwich: "(\<And>y. y \<in> s \<Longrightarrow> y \<noteq> x \<Longrightarrow> dist y x < e \<Longrightarrow> norm ((f y - f x) - f' (y - x)) / norm (y - x) \<le> H y)" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 174 | and "(H ---> 0) (at x within s)" | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 175 | shows "(f has_derivative f') (at x within s)" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 176 | unfolding has_derivative_iff_norm | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 177 | proof safe | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 178 | show "((\<lambda>y. norm (f y - f x - f' (y - x)) / norm (y - x)) ---> 0) (at x within s)" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 179 | proof (rule tendsto_sandwich[where f="\<lambda>x. 0"]) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 180 | show "(H ---> 0) (at x within s)" by fact | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 181 | show "eventually (\<lambda>n. norm (f n - f x - f' (n - x)) / norm (n - x) \<le> H n) (at x within s)" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 182 | unfolding eventually_at using e sandwich by auto | 
| 58729 
e8ecc79aee43
add tendsto_const and tendsto_ident_at as simp and intro rules
 hoelzl parents: 
57953diff
changeset | 183 | qed (auto simp: le_divide_eq) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 184 | qed fact | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 185 | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 186 | lemma has_derivative_subset: "(f has_derivative f') (at x within s) \<Longrightarrow> t \<subseteq> s \<Longrightarrow> (f has_derivative f') (at x within t)" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 187 | by (auto simp add: has_derivative_iff_norm intro: tendsto_within_subset) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 188 | |
| 56261 | 189 | lemmas has_derivative_within_subset = has_derivative_subset | 
| 190 | ||
| 191 | ||
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 192 | subsection {* Continuity *}
 | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 193 | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 194 | lemma has_derivative_continuous: | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 195 | assumes f: "(f has_derivative f') (at x within s)" | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 196 | shows "continuous (at x within s) f" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 197 | proof - | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 198 | from f interpret F: bounded_linear f' by (rule has_derivative_bounded_linear) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 199 | note F.tendsto[tendsto_intros] | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 200 | let ?L = "\<lambda>f. (f ---> 0) (at x within s)" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 201 | have "?L (\<lambda>y. norm ((f y - f x) - f' (y - x)) / norm (y - x))" | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 202 | using f unfolding has_derivative_iff_norm by blast | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 203 | then have "?L (\<lambda>y. norm ((f y - f x) - f' (y - x)) / norm (y - x) * norm (y - x))" (is ?m) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 204 | by (rule tendsto_mult_zero) (auto intro!: tendsto_eq_intros) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 205 | also have "?m \<longleftrightarrow> ?L (\<lambda>y. norm ((f y - f x) - f' (y - x)))" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 206 | by (intro filterlim_cong) (simp_all add: eventually_at_filter) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 207 | finally have "?L (\<lambda>y. (f y - f x) - f' (y - x))" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 208 | by (rule tendsto_norm_zero_cancel) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 209 | then have "?L (\<lambda>y. ((f y - f x) - f' (y - x)) + f' (y - x))" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 210 | by (rule tendsto_eq_intros) (auto intro!: tendsto_eq_intros simp: F.zero) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 211 | then have "?L (\<lambda>y. f y - f x)" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 212 | by simp | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 213 | from tendsto_add[OF this tendsto_const, of "f x"] show ?thesis | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 214 | by (simp add: continuous_within) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 215 | qed | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 216 | |
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 217 | subsection {* Composition *}
 | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 218 | |
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 219 | lemma tendsto_at_iff_tendsto_nhds_within: "f x = y \<Longrightarrow> (f ---> y) (at x within s) \<longleftrightarrow> (f ---> y) (inf (nhds x) (principal s))" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 220 | unfolding tendsto_def eventually_inf_principal eventually_at_filter | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 221 | by (intro ext all_cong imp_cong) (auto elim!: eventually_elim1) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 222 | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 223 | lemma has_derivative_in_compose: | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 224 | assumes f: "(f has_derivative f') (at x within s)" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 225 | assumes g: "(g has_derivative g') (at (f x) within (f`s))" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 226 | shows "((\<lambda>x. g (f x)) has_derivative (\<lambda>x. g' (f' x))) (at x within s)" | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 227 | proof - | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 228 | from f interpret F: bounded_linear f' by (rule has_derivative_bounded_linear) | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 229 | from g interpret G: bounded_linear g' by (rule has_derivative_bounded_linear) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 230 | from F.bounded obtain kF where kF: "\<And>x. norm (f' x) \<le> norm x * kF" by fast | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 231 | from G.bounded obtain kG where kG: "\<And>x. norm (g' x) \<le> norm x * kG" by fast | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 232 | note G.tendsto[tendsto_intros] | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 233 | |
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 234 | let ?L = "\<lambda>f. (f ---> 0) (at x within s)" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 235 | let ?D = "\<lambda>f f' x y. (f y - f x) - f' (y - x)" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 236 | let ?N = "\<lambda>f f' x y. norm (?D f f' x y) / norm (y - x)" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 237 | let ?gf = "\<lambda>x. g (f x)" and ?gf' = "\<lambda>x. g' (f' x)" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 238 | def Nf \<equiv> "?N f f' x" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 239 | def Ng \<equiv> "\<lambda>y. ?N g g' (f x) (f y)" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 240 | |
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 241 | show ?thesis | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 242 | proof (rule has_derivativeI_sandwich[of 1]) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 243 | show "bounded_linear (\<lambda>x. g' (f' x))" | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 244 | using f g by (blast intro: bounded_linear_compose has_derivative_bounded_linear) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 245 | next | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 246 | fix y::'a assume neq: "y \<noteq> x" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 247 | have "?N ?gf ?gf' x y = norm (g' (?D f f' x y) + ?D g g' (f x) (f y)) / norm (y - x)" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 248 | by (simp add: G.diff G.add field_simps) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 249 | also have "\<dots> \<le> norm (g' (?D f f' x y)) / norm (y - x) + Ng y * (norm (f y - f x) / norm (y - x))" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 250 | by (simp add: add_divide_distrib[symmetric] divide_right_mono norm_triangle_ineq G.zero Ng_def) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 251 | also have "\<dots> \<le> Nf y * kG + Ng y * (Nf y + kF)" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 252 | proof (intro add_mono mult_left_mono) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 253 | have "norm (f y - f x) = norm (?D f f' x y + f' (y - x))" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 254 | by simp | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 255 | also have "\<dots> \<le> norm (?D f f' x y) + norm (f' (y - x))" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 256 | by (rule norm_triangle_ineq) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 257 | also have "\<dots> \<le> norm (?D f f' x y) + norm (y - x) * kF" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 258 | using kF by (intro add_mono) simp | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 259 | finally show "norm (f y - f x) / norm (y - x) \<le> Nf y + kF" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 260 | by (simp add: neq Nf_def field_simps) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 261 | qed (insert kG, simp_all add: Ng_def Nf_def neq zero_le_divide_iff field_simps) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 262 | finally show "?N ?gf ?gf' x y \<le> Nf y * kG + Ng y * (Nf y + kF)" . | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 263 | next | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 264 | have [tendsto_intros]: "?L Nf" | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 265 | using f unfolding has_derivative_iff_norm Nf_def .. | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 266 | from f have "(f ---> f x) (at x within s)" | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 267 | by (blast intro: has_derivative_continuous continuous_within[THEN iffD1]) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 268 | then have f': "LIM x at x within s. f x :> inf (nhds (f x)) (principal (f`s))" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 269 | unfolding filterlim_def | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 270 | by (simp add: eventually_filtermap eventually_at_filter le_principal) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 271 | |
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 272 | have "((?N g g' (f x)) ---> 0) (at (f x) within f`s)" | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 273 | using g unfolding has_derivative_iff_norm .. | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 274 | then have g': "((?N g g' (f x)) ---> 0) (inf (nhds (f x)) (principal (f`s)))" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 275 | by (rule tendsto_at_iff_tendsto_nhds_within[THEN iffD1, rotated]) simp | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 276 | |
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 277 | have [tendsto_intros]: "?L Ng" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 278 | unfolding Ng_def by (rule filterlim_compose[OF g' f']) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 279 | show "((\<lambda>y. Nf y * kG + Ng y * (Nf y + kF)) ---> 0) (at x within s)" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 280 | by (intro tendsto_eq_intros) auto | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 281 | qed simp | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 282 | qed | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 283 | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 284 | lemma has_derivative_compose: | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 285 | "(f has_derivative f') (at x within s) \<Longrightarrow> (g has_derivative g') (at (f x)) \<Longrightarrow> | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 286 | ((\<lambda>x. g (f x)) has_derivative (\<lambda>x. g' (f' x))) (at x within s)" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 287 | by (blast intro: has_derivative_in_compose has_derivative_subset) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 288 | |
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 289 | lemma (in bounded_bilinear) FDERIV: | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 290 | assumes f: "(f has_derivative f') (at x within s)" and g: "(g has_derivative g') (at x within s)" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 291 | shows "((\<lambda>x. f x ** g x) has_derivative (\<lambda>h. f x ** g' h + f' h ** g x)) (at x within s)" | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 292 | proof - | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 293 | from bounded_linear.bounded [OF has_derivative_bounded_linear [OF f]] | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 294 | obtain KF where norm_F: "\<And>x. norm (f' x) \<le> norm x * KF" by fast | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 295 | |
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 296 | from pos_bounded obtain K where K: "0 < K" and norm_prod: | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 297 | "\<And>a b. norm (a ** b) \<le> norm a * norm b * K" by fast | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 298 | let ?D = "\<lambda>f f' y. f y - f x - f' (y - x)" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 299 | let ?N = "\<lambda>f f' y. norm (?D f f' y) / norm (y - x)" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 300 | def Ng =="?N g g'" and Nf =="?N f f'" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 301 | |
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 302 | let ?fun1 = "\<lambda>y. norm (f y ** g y - f x ** g x - (f x ** g' (y - x) + f' (y - x) ** g x)) / norm (y - x)" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 303 | let ?fun2 = "\<lambda>y. norm (f x) * Ng y * K + Nf y * norm (g y) * K + KF * norm (g y - g x) * K" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 304 | let ?F = "at x within s" | 
| 21164 | 305 | |
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 306 | show ?thesis | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 307 | proof (rule has_derivativeI_sandwich[of 1]) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 308 | show "bounded_linear (\<lambda>h. f x ** g' h + f' h ** g x)" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 309 | by (intro bounded_linear_add | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 310 | bounded_linear_compose [OF bounded_linear_right] bounded_linear_compose [OF bounded_linear_left] | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 311 | has_derivative_bounded_linear [OF g] has_derivative_bounded_linear [OF f]) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 312 | next | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 313 | from g have "(g ---> g x) ?F" | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 314 | by (intro continuous_within[THEN iffD1] has_derivative_continuous) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 315 | moreover from f g have "(Nf ---> 0) ?F" "(Ng ---> 0) ?F" | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 316 | by (simp_all add: has_derivative_iff_norm Ng_def Nf_def) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 317 | ultimately have "(?fun2 ---> norm (f x) * 0 * K + 0 * norm (g x) * K + KF * norm (0::'b) * K) ?F" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 318 | by (intro tendsto_intros) (simp_all add: LIM_zero_iff) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 319 | then show "(?fun2 ---> 0) ?F" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 320 | by simp | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 321 | next | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 322 | fix y::'d assume "y \<noteq> x" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 323 | have "?fun1 y = norm (f x ** ?D g g' y + ?D f f' y ** g y + f' (y - x) ** (g y - g x)) / norm (y - x)" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 324 | by (simp add: diff_left diff_right add_left add_right field_simps) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 325 | also have "\<dots> \<le> (norm (f x) * norm (?D g g' y) * K + norm (?D f f' y) * norm (g y) * K + | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 326 | norm (y - x) * KF * norm (g y - g x) * K) / norm (y - x)" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 327 | by (intro divide_right_mono mult_mono' | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 328 | order_trans [OF norm_triangle_ineq add_mono] | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 329 | order_trans [OF norm_prod mult_right_mono] | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 330 | mult_nonneg_nonneg order_refl norm_ge_zero norm_F | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 331 | K [THEN order_less_imp_le]) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 332 | also have "\<dots> = ?fun2 y" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 333 | by (simp add: add_divide_distrib Ng_def Nf_def) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 334 | finally show "?fun1 y \<le> ?fun2 y" . | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 335 | qed simp | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 336 | qed | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 337 | |
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 338 | lemmas has_derivative_mult[simp, derivative_intros] = bounded_bilinear.FDERIV[OF bounded_bilinear_mult] | 
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 339 | lemmas has_derivative_scaleR[simp, derivative_intros] = bounded_bilinear.FDERIV[OF bounded_bilinear_scaleR] | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 340 | |
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 341 | lemma has_derivative_setprod[simp, derivative_intros]: | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 342 | fixes f :: "'i \<Rightarrow> 'a :: real_normed_vector \<Rightarrow> 'b :: real_normed_field" | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 343 | assumes f: "\<And>i. i \<in> I \<Longrightarrow> (f i has_derivative f' i) (at x within s)" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 344 |   shows "((\<lambda>x. \<Prod>i\<in>I. f i x) has_derivative (\<lambda>y. \<Sum>i\<in>I. f' i y * (\<Prod>j\<in>I - {i}. f j x))) (at x within s)"
 | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 345 | proof cases | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 346 | assume "finite I" from this f show ?thesis | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 347 | proof induct | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 348 | case (insert i I) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 349 |     let ?P = "\<lambda>y. f i x * (\<Sum>i\<in>I. f' i y * (\<Prod>j\<in>I - {i}. f j x)) + (f' i y) * (\<Prod>i\<in>I. f i x)"
 | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 350 | have "((\<lambda>x. f i x * (\<Prod>i\<in>I. f i x)) has_derivative ?P) (at x within s)" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 351 | using insert by (intro has_derivative_mult) auto | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 352 |     also have "?P = (\<lambda>y. \<Sum>i'\<in>insert i I. f' i' y * (\<Prod>j\<in>insert i I - {i'}. f j x))"
 | 
| 57418 | 353 | using insert(1,2) by (auto simp add: setsum_right_distrib insert_Diff_if intro!: ext setsum.cong) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 354 | finally show ?case | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 355 | using insert by simp | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 356 | qed simp | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 357 | qed simp | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 358 | |
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 359 | lemma has_derivative_power[simp, derivative_intros]: | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 360 | fixes f :: "'a :: real_normed_vector \<Rightarrow> 'b :: real_normed_field" | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 361 | assumes f: "(f has_derivative f') (at x within s)" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 362 | shows "((\<lambda>x. f x^n) has_derivative (\<lambda>y. of_nat n * f' y * f x^(n - 1))) (at x within s)" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 363 |   using has_derivative_setprod[OF f, of "{..< n}"] by (simp add: setprod_constant ac_simps)
 | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 364 | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 365 | lemma has_derivative_inverse': | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 366 | fixes x :: "'a::real_normed_div_algebra" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 367 | assumes x: "x \<noteq> 0" | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 368 | shows "(inverse has_derivative (\<lambda>h. - (inverse x * h * inverse x))) (at x within s)" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 369 | (is "(?inv has_derivative ?f) _") | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 370 | proof (rule has_derivativeI_sandwich) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 371 | show "bounded_linear (\<lambda>h. - (?inv x * h * ?inv x))" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 372 | apply (rule bounded_linear_minus) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 373 | apply (rule bounded_linear_mult_const) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 374 | apply (rule bounded_linear_const_mult) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 375 | apply (rule bounded_linear_ident) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 376 | done | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 377 | next | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 378 | show "0 < norm x" using x by simp | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 379 | next | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 380 | show "((\<lambda>y. norm (?inv y - ?inv x) * norm (?inv x)) ---> 0) (at x within s)" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 381 | apply (rule tendsto_mult_left_zero) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 382 | apply (rule tendsto_norm_zero) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 383 | apply (rule LIM_zero) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 384 | apply (rule tendsto_inverse) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 385 | apply (rule tendsto_ident_at) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 386 | apply (rule x) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 387 | done | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 388 | next | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 389 | fix y::'a assume h: "y \<noteq> x" "dist y x < norm x" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 390 | then have "y \<noteq> 0" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 391 | by (auto simp: norm_conv_dist dist_commute) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 392 | have "norm (?inv y - ?inv x - ?f (y -x)) / norm (y - x) = norm ((?inv y - ?inv x) * (y - x) * ?inv x) / norm (y - x)" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 393 | apply (subst inverse_diff_inverse [OF `y \<noteq> 0` x]) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 394 | apply (subst minus_diff_minus) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 395 | apply (subst norm_minus_cancel) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 396 | apply (simp add: left_diff_distrib) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 397 | done | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 398 | also have "\<dots> \<le> norm (?inv y - ?inv x) * norm (y - x) * norm (?inv x) / norm (y - x)" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 399 | apply (rule divide_right_mono [OF _ norm_ge_zero]) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 400 | apply (rule order_trans [OF norm_mult_ineq]) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 401 | apply (rule mult_right_mono [OF _ norm_ge_zero]) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 402 | apply (rule norm_mult_ineq) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 403 | done | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 404 | also have "\<dots> = norm (?inv y - ?inv x) * norm (?inv x)" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 405 | by simp | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 406 | finally show "norm (?inv y - ?inv x - ?f (y -x)) / norm (y - x) \<le> | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 407 | norm (?inv y - ?inv x) * norm (?inv x)" . | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 408 | qed | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 409 | |
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 410 | lemma has_derivative_inverse[simp, derivative_intros]: | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 411 | fixes f :: "_ \<Rightarrow> 'a::real_normed_div_algebra" | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 412 | assumes x: "f x \<noteq> 0" and f: "(f has_derivative f') (at x within s)" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 413 | shows "((\<lambda>x. inverse (f x)) has_derivative (\<lambda>h. - (inverse (f x) * f' h * inverse (f x)))) (at x within s)" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 414 | using has_derivative_compose[OF f has_derivative_inverse', OF x] . | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 415 | |
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 416 | lemma has_derivative_divide[simp, derivative_intros]: | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 417 | fixes f :: "_ \<Rightarrow> 'a::real_normed_div_algebra" | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 418 | assumes f: "(f has_derivative f') (at x within s)" and g: "(g has_derivative g') (at x within s)" | 
| 55967 | 419 | assumes x: "g x \<noteq> 0" | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 420 | shows "((\<lambda>x. f x / g x) has_derivative | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 421 | (\<lambda>h. - f x * (inverse (g x) * g' h * inverse (g x)) + f' h / g x)) (at x within s)" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 422 | using has_derivative_mult[OF f has_derivative_inverse[OF x g]] | 
| 56480 
093ea91498e6
field_simps: better support for negation and division, and power
 hoelzl parents: 
56479diff
changeset | 423 | by (simp add: field_simps) | 
| 55967 | 424 | |
| 425 | text{*Conventional form requires mult-AC laws. Types real and complex only.*}
 | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 426 | |
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 427 | lemma has_derivative_divide'[derivative_intros]: | 
| 55967 | 428 | fixes f :: "_ \<Rightarrow> 'a::real_normed_field" | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 429 | assumes f: "(f has_derivative f') (at x within s)" and g: "(g has_derivative g') (at x within s)" and x: "g x \<noteq> 0" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 430 | shows "((\<lambda>x. f x / g x) has_derivative (\<lambda>h. (f' h * g x - f x * g' h) / (g x * g x))) (at x within s)" | 
| 55967 | 431 | proof - | 
| 432 |   { fix h
 | |
| 433 | have "f' h / g x - f x * (inverse (g x) * g' h * inverse (g x)) = | |
| 434 | (f' h * g x - f x * g' h) / (g x * g x)" | |
| 56480 
093ea91498e6
field_simps: better support for negation and division, and power
 hoelzl parents: 
56479diff
changeset | 435 | by (simp add: field_simps x) | 
| 55967 | 436 | } | 
| 437 | then show ?thesis | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 438 | using has_derivative_divide [OF f g] x | 
| 55967 | 439 | by simp | 
| 440 | qed | |
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 441 | |
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 442 | subsection {* Uniqueness *}
 | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 443 | |
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 444 | text {*
 | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 445 | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 446 | This can not generally shown for @{const has_derivative}, as we need to approach the point from
 | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 447 | all directions. There is a proof in @{text Multivariate_Analysis} for @{text euclidean_space}.
 | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 448 | |
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 449 | *} | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 450 | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 451 | lemma has_derivative_zero_unique: | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 452 | assumes "((\<lambda>x. 0) has_derivative F) (at x)" shows "F = (\<lambda>h. 0)" | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 453 | proof - | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 454 | interpret F: bounded_linear F | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 455 | using assms by (rule has_derivative_bounded_linear) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 456 | let ?r = "\<lambda>h. norm (F h) / norm h" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 457 | have *: "?r -- 0 --> 0" | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 458 | using assms unfolding has_derivative_at by simp | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 459 | show "F = (\<lambda>h. 0)" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 460 | proof | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 461 | fix h show "F h = 0" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 462 | proof (rule ccontr) | 
| 53374 
a14d2a854c02
tuned proofs -- clarified flow of facts wrt. calculation;
 wenzelm parents: 
51642diff
changeset | 463 | assume **: "F h \<noteq> 0" | 
| 56541 | 464 | hence h: "h \<noteq> 0" by (clarsimp simp add: F.zero) | 
| 465 | with ** have "0 < ?r h" by simp | |
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 466 | from LIM_D [OF * this] obtain s where s: "0 < s" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 467 | and r: "\<And>x. x \<noteq> 0 \<Longrightarrow> norm x < s \<Longrightarrow> ?r x < ?r h" by auto | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 468 | from dense [OF s] obtain t where t: "0 < t \<and> t < s" .. | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 469 | let ?x = "scaleR (t / norm h) h" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 470 | have "?x \<noteq> 0" and "norm ?x < s" using t h by simp_all | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 471 | hence "?r ?x < ?r h" by (rule r) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 472 | thus "False" using t h by (simp add: F.scaleR) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 473 | qed | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 474 | qed | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 475 | qed | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 476 | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 477 | lemma has_derivative_unique: | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 478 | assumes "(f has_derivative F) (at x)" and "(f has_derivative F') (at x)" shows "F = F'" | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 479 | proof - | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 480 | have "((\<lambda>x. 0) has_derivative (\<lambda>h. F h - F' h)) (at x)" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 481 | using has_derivative_diff [OF assms] by simp | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 482 | hence "(\<lambda>h. F h - F' h) = (\<lambda>h. 0)" | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 483 | by (rule has_derivative_zero_unique) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 484 | thus "F = F'" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 485 | unfolding fun_eq_iff right_minus_eq . | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 486 | qed | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 487 | |
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 488 | subsection {* Differentiability predicate *}
 | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 489 | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 490 | definition | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 491 |   differentiable :: "('a::real_normed_vector \<Rightarrow> 'b::real_normed_vector) \<Rightarrow> 'a filter \<Rightarrow> bool"
 | 
| 56182 
528fae0816ea
update syntax of has_*derivative to infix 50; fixed proofs
 hoelzl parents: 
56181diff
changeset | 492 | (infix "differentiable" 50) | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 493 | where | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 494 | "f differentiable F \<longleftrightarrow> (\<exists>D. (f has_derivative D) F)" | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 495 | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 496 | lemma differentiable_subset: "f differentiable (at x within s) \<Longrightarrow> t \<subseteq> s \<Longrightarrow> f differentiable (at x within t)" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 497 | unfolding differentiable_def by (blast intro: has_derivative_subset) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 498 | |
| 56261 | 499 | lemmas differentiable_within_subset = differentiable_subset | 
| 500 | ||
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 501 | lemma differentiable_ident [simp, derivative_intros]: "(\<lambda>x. x) differentiable F" | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 502 | unfolding differentiable_def by (blast intro: has_derivative_ident) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 503 | |
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 504 | lemma differentiable_const [simp, derivative_intros]: "(\<lambda>z. a) differentiable F" | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 505 | unfolding differentiable_def by (blast intro: has_derivative_const) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 506 | |
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 507 | lemma differentiable_in_compose: | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 508 | "f differentiable (at (g x) within (g`s)) \<Longrightarrow> g differentiable (at x within s) \<Longrightarrow> (\<lambda>x. f (g x)) differentiable (at x within s)" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 509 | unfolding differentiable_def by (blast intro: has_derivative_in_compose) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 510 | |
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 511 | lemma differentiable_compose: | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 512 | "f differentiable (at (g x)) \<Longrightarrow> g differentiable (at x within s) \<Longrightarrow> (\<lambda>x. f (g x)) differentiable (at x within s)" | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 513 | by (blast intro: differentiable_in_compose differentiable_subset) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 514 | |
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 515 | lemma differentiable_sum [simp, derivative_intros]: | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 516 | "f differentiable F \<Longrightarrow> g differentiable F \<Longrightarrow> (\<lambda>x. f x + g x) differentiable F" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 517 | unfolding differentiable_def by (blast intro: has_derivative_add) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 518 | |
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 519 | lemma differentiable_minus [simp, derivative_intros]: | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 520 | "f differentiable F \<Longrightarrow> (\<lambda>x. - f x) differentiable F" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 521 | unfolding differentiable_def by (blast intro: has_derivative_minus) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 522 | |
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 523 | lemma differentiable_diff [simp, derivative_intros]: | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 524 | "f differentiable F \<Longrightarrow> g differentiable F \<Longrightarrow> (\<lambda>x. f x - g x) differentiable F" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 525 | unfolding differentiable_def by (blast intro: has_derivative_diff) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 526 | |
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 527 | lemma differentiable_mult [simp, derivative_intros]: | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 528 | fixes f g :: "'a :: real_normed_vector \<Rightarrow> 'b :: real_normed_algebra" | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 529 | shows "f differentiable (at x within s) \<Longrightarrow> g differentiable (at x within s) \<Longrightarrow> (\<lambda>x. f x * g x) differentiable (at x within s)" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 530 | unfolding differentiable_def by (blast intro: has_derivative_mult) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 531 | |
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 532 | lemma differentiable_inverse [simp, derivative_intros]: | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 533 | fixes f :: "'a :: real_normed_vector \<Rightarrow> 'b :: real_normed_field" | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 534 | shows "f differentiable (at x within s) \<Longrightarrow> f x \<noteq> 0 \<Longrightarrow> (\<lambda>x. inverse (f x)) differentiable (at x within s)" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 535 | unfolding differentiable_def by (blast intro: has_derivative_inverse) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 536 | |
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 537 | lemma differentiable_divide [simp, derivative_intros]: | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 538 | fixes f g :: "'a :: real_normed_vector \<Rightarrow> 'b :: real_normed_field" | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 539 | shows "f differentiable (at x within s) \<Longrightarrow> g differentiable (at x within s) \<Longrightarrow> g x \<noteq> 0 \<Longrightarrow> (\<lambda>x. f x / g x) differentiable (at x within s)" | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 540 | unfolding divide_inverse using assms by simp | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 541 | |
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 542 | lemma differentiable_power [simp, derivative_intros]: | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 543 | fixes f g :: "'a :: real_normed_vector \<Rightarrow> 'b :: real_normed_field" | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 544 | shows "f differentiable (at x within s) \<Longrightarrow> (\<lambda>x. f x ^ n) differentiable (at x within s)" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 545 | unfolding differentiable_def by (blast intro: has_derivative_power) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 546 | |
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 547 | lemma differentiable_scaleR [simp, derivative_intros]: | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 548 | "f differentiable (at x within s) \<Longrightarrow> g differentiable (at x within s) \<Longrightarrow> (\<lambda>x. f x *\<^sub>R g x) differentiable (at x within s)" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 549 | unfolding differentiable_def by (blast intro: has_derivative_scaleR) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 550 | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 551 | lemma has_derivative_imp_has_field_derivative: | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 552 | "(f has_derivative D) F \<Longrightarrow> (\<And>x. x * D' = D x) \<Longrightarrow> (f has_field_derivative D') F" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 553 | unfolding has_field_derivative_def | 
| 57512 
cc97b347b301
reduced name variants for assoc and commute on plus and mult
 haftmann parents: 
57418diff
changeset | 554 | by (rule has_derivative_eq_rhs[of f D]) (simp_all add: fun_eq_iff mult.commute) | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 555 | |
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 556 | lemma has_field_derivative_imp_has_derivative: "(f has_field_derivative D) F \<Longrightarrow> (f has_derivative op * D) F" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 557 | by (simp add: has_field_derivative_def) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 558 | |
| 56261 | 559 | lemma DERIV_subset: | 
| 560 | "(f has_field_derivative f') (at x within s) \<Longrightarrow> t \<subseteq> s | |
| 561 | \<Longrightarrow> (f has_field_derivative f') (at x within t)" | |
| 562 | by (simp add: has_field_derivative_def has_derivative_within_subset) | |
| 563 | ||
| 59862 | 564 | lemma has_field_derivative_at_within: | 
| 565 | "(f has_field_derivative f') (at x) \<Longrightarrow> (f has_field_derivative f') (at x within s)" | |
| 566 | using DERIV_subset by blast | |
| 567 | ||
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 568 | abbreviation (input) | 
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 569 |   DERIV :: "('a::real_normed_field \<Rightarrow> 'a) \<Rightarrow> 'a \<Rightarrow> 'a \<Rightarrow> bool"
 | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 570 |   ("(DERIV (_)/ (_)/ :> (_))" [1000, 1000, 60] 60)
 | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 571 | where | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 572 | "DERIV f x :> D \<equiv> (f has_field_derivative D) (at x)" | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 573 | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 574 | abbreviation | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 575 | has_real_derivative :: "(real \<Rightarrow> real) \<Rightarrow> real \<Rightarrow> real filter \<Rightarrow> bool" | 
| 56182 
528fae0816ea
update syntax of has_*derivative to infix 50; fixed proofs
 hoelzl parents: 
56181diff
changeset | 576 | (infix "(has'_real'_derivative)" 50) | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 577 | where | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 578 | "(f has_real_derivative D) F \<equiv> (f has_field_derivative D) F" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 579 | |
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 580 | lemma real_differentiable_def: | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 581 | "f differentiable at x within s \<longleftrightarrow> (\<exists>D. (f has_real_derivative D) (at x within s))" | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 582 | proof safe | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 583 | assume "f differentiable at x within s" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 584 | then obtain f' where *: "(f has_derivative f') (at x within s)" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 585 | unfolding differentiable_def by auto | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 586 | then obtain c where "f' = (op * c)" | 
| 57512 
cc97b347b301
reduced name variants for assoc and commute on plus and mult
 haftmann parents: 
57418diff
changeset | 587 | by (metis real_bounded_linear has_derivative_bounded_linear mult.commute fun_eq_iff) | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 588 | with * show "\<exists>D. (f has_real_derivative D) (at x within s)" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 589 | unfolding has_field_derivative_def by auto | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 590 | qed (auto simp: differentiable_def has_field_derivative_def) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 591 | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 592 | lemma real_differentiableE [elim?]: | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 593 | assumes f: "f differentiable (at x within s)" obtains df where "(f has_real_derivative df) (at x within s)" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 594 | using assms by (auto simp: real_differentiable_def) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 595 | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 596 | lemma differentiableD: "f differentiable (at x within s) \<Longrightarrow> \<exists>D. (f has_real_derivative D) (at x within s)" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 597 | by (auto elim: real_differentiableE) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 598 | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 599 | lemma differentiableI: "(f has_real_derivative D) (at x within s) \<Longrightarrow> f differentiable (at x within s)" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 600 | by (force simp add: real_differentiable_def) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 601 | |
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 602 | lemma DERIV_def: "DERIV f x :> D \<longleftrightarrow> (\<lambda>h. (f (x + h) - f x) / h) -- 0 --> D" | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 603 | apply (simp add: has_field_derivative_def has_derivative_at bounded_linear_mult_right LIM_zero_iff[symmetric, of _ D]) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 604 | apply (subst (2) tendsto_norm_zero_iff[symmetric]) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 605 | apply (rule filterlim_cong) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 606 | apply (simp_all add: eventually_at_filter field_simps nonzero_norm_divide) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 607 | done | 
| 21164 | 608 | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 609 | lemma mult_commute_abs: "(\<lambda>x. x * c) = op * (c::'a::ab_semigroup_mult)" | 
| 57512 
cc97b347b301
reduced name variants for assoc and commute on plus and mult
 haftmann parents: 
57418diff
changeset | 610 | by (simp add: fun_eq_iff mult.commute) | 
| 21164 | 611 | |
| 60177 | 612 | subsection {* Vector derivative *}
 | 
| 613 | ||
| 614 | lemma has_field_derivative_iff_has_vector_derivative: | |
| 615 | "(f has_field_derivative y) F \<longleftrightarrow> (f has_vector_derivative y) F" | |
| 616 | unfolding has_vector_derivative_def has_field_derivative_def real_scaleR_def mult_commute_abs .. | |
| 617 | ||
| 618 | lemma has_field_derivative_subset: | |
| 619 | "(f has_field_derivative y) (at x within s) \<Longrightarrow> t \<subseteq> s \<Longrightarrow> (f has_field_derivative y) (at x within t)" | |
| 620 | unfolding has_field_derivative_def by (rule has_derivative_subset) | |
| 621 | ||
| 622 | lemma has_vector_derivative_const[simp, derivative_intros]: "((\<lambda>x. c) has_vector_derivative 0) net" | |
| 623 | by (auto simp: has_vector_derivative_def) | |
| 624 | ||
| 625 | lemma has_vector_derivative_id[simp, derivative_intros]: "((\<lambda>x. x) has_vector_derivative 1) net" | |
| 626 | by (auto simp: has_vector_derivative_def) | |
| 627 | ||
| 628 | lemma has_vector_derivative_minus[derivative_intros]: | |
| 629 | "(f has_vector_derivative f') net \<Longrightarrow> ((\<lambda>x. - f x) has_vector_derivative (- f')) net" | |
| 630 | by (auto simp: has_vector_derivative_def) | |
| 631 | ||
| 632 | lemma has_vector_derivative_add[derivative_intros]: | |
| 633 | "(f has_vector_derivative f') net \<Longrightarrow> (g has_vector_derivative g') net \<Longrightarrow> | |
| 634 | ((\<lambda>x. f x + g x) has_vector_derivative (f' + g')) net" | |
| 635 | by (auto simp: has_vector_derivative_def scaleR_right_distrib) | |
| 636 | ||
| 637 | lemma has_vector_derivative_setsum[derivative_intros]: | |
| 638 | "(\<And>i. i \<in> I \<Longrightarrow> (f i has_vector_derivative f' i) net) \<Longrightarrow> | |
| 639 | ((\<lambda>x. \<Sum>i\<in>I. f i x) has_vector_derivative (\<Sum>i\<in>I. f' i)) net" | |
| 640 | by (auto simp: has_vector_derivative_def fun_eq_iff scaleR_setsum_right intro!: derivative_eq_intros) | |
| 641 | ||
| 642 | lemma has_vector_derivative_diff[derivative_intros]: | |
| 643 | "(f has_vector_derivative f') net \<Longrightarrow> (g has_vector_derivative g') net \<Longrightarrow> | |
| 644 | ((\<lambda>x. f x - g x) has_vector_derivative (f' - g')) net" | |
| 645 | by (auto simp: has_vector_derivative_def scaleR_diff_right) | |
| 646 | ||
| 647 | lemma (in bounded_linear) has_vector_derivative: | |
| 648 | assumes "(g has_vector_derivative g') F" | |
| 649 | shows "((\<lambda>x. f (g x)) has_vector_derivative f g') F" | |
| 650 | using has_derivative[OF assms[unfolded has_vector_derivative_def]] | |
| 651 | by (simp add: has_vector_derivative_def scaleR) | |
| 652 | ||
| 653 | lemma (in bounded_bilinear) has_vector_derivative: | |
| 654 | assumes "(f has_vector_derivative f') (at x within s)" | |
| 655 | and "(g has_vector_derivative g') (at x within s)" | |
| 656 | shows "((\<lambda>x. f x ** g x) has_vector_derivative (f x ** g' + f' ** g x)) (at x within s)" | |
| 657 | using FDERIV[OF assms(1-2)[unfolded has_vector_derivative_def]] | |
| 658 | by (simp add: has_vector_derivative_def scaleR_right scaleR_left scaleR_right_distrib) | |
| 659 | ||
| 660 | lemma has_vector_derivative_scaleR[derivative_intros]: | |
| 661 | "(f has_field_derivative f') (at x within s) \<Longrightarrow> (g has_vector_derivative g') (at x within s) \<Longrightarrow> | |
| 662 | ((\<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)" | |
| 663 | unfolding has_field_derivative_iff_has_vector_derivative | |
| 664 | by (rule bounded_bilinear.has_vector_derivative[OF bounded_bilinear_scaleR]) | |
| 665 | ||
| 666 | lemma has_vector_derivative_mult[derivative_intros]: | |
| 667 | "(f has_vector_derivative f') (at x within s) \<Longrightarrow> (g has_vector_derivative g') (at x within s) \<Longrightarrow> | |
| 668 | ((\<lambda>x. f x * g x) has_vector_derivative (f x * g' + f' * g x :: 'a :: real_normed_algebra)) (at x within s)" | |
| 669 | by (rule bounded_bilinear.has_vector_derivative[OF bounded_bilinear_mult]) | |
| 670 | ||
| 671 | lemma has_vector_derivative_of_real[derivative_intros]: | |
| 672 | "(f has_field_derivative D) F \<Longrightarrow> ((\<lambda>x. of_real (f x)) has_vector_derivative (of_real D)) F" | |
| 673 | by (rule bounded_linear.has_vector_derivative[OF bounded_linear_of_real]) | |
| 674 | (simp add: has_field_derivative_iff_has_vector_derivative) | |
| 675 | ||
| 676 | lemma has_vector_derivative_continuous: "(f has_vector_derivative D) (at x within s) \<Longrightarrow> continuous (at x within s) f" | |
| 677 | by (auto intro: has_derivative_continuous simp: has_vector_derivative_def) | |
| 678 | ||
| 679 | lemma has_vector_derivative_mult_right[derivative_intros]: | |
| 680 | fixes a :: "'a :: real_normed_algebra" | |
| 681 | shows "(f has_vector_derivative x) F \<Longrightarrow> ((\<lambda>x. a * f x) has_vector_derivative (a * x)) F" | |
| 682 | by (rule bounded_linear.has_vector_derivative[OF bounded_linear_mult_right]) | |
| 683 | ||
| 684 | lemma has_vector_derivative_mult_left[derivative_intros]: | |
| 685 | fixes a :: "'a :: real_normed_algebra" | |
| 686 | shows "(f has_vector_derivative x) F \<Longrightarrow> ((\<lambda>x. f x * a) has_vector_derivative (x * a)) F" | |
| 687 | by (rule bounded_linear.has_vector_derivative[OF bounded_linear_mult_left]) | |
| 688 | ||
| 689 | ||
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 690 | subsection {* Derivatives *}
 | 
| 21164 | 691 | |
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 692 | lemma DERIV_D: "DERIV f x :> D \<Longrightarrow> (\<lambda>h. (f (x + h) - f x) / h) -- 0 --> D" | 
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 693 | by (simp add: DERIV_def) | 
| 21164 | 694 | |
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 695 | lemma DERIV_const [simp, derivative_intros]: "((\<lambda>x. k) has_field_derivative 0) F" | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 696 | by (rule has_derivative_imp_has_field_derivative[OF has_derivative_const]) auto | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 697 | |
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 698 | lemma DERIV_ident [simp, derivative_intros]: "((\<lambda>x. x) has_field_derivative 1) F" | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 699 | by (rule has_derivative_imp_has_field_derivative[OF has_derivative_ident]) auto | 
| 21164 | 700 | |
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 701 | lemma field_differentiable_add[derivative_intros]: | 
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 702 | "(f has_field_derivative f') F \<Longrightarrow> (g has_field_derivative g') F \<Longrightarrow> | 
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 703 | ((\<lambda>z. f z + g z) has_field_derivative f' + g') F" | 
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 704 | by (rule has_derivative_imp_has_field_derivative[OF has_derivative_add]) | 
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 705 | (auto simp: has_field_derivative_def field_simps mult_commute_abs) | 
| 56261 | 706 | |
| 707 | corollary DERIV_add: | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 708 | "(f has_field_derivative D) (at x within s) \<Longrightarrow> (g has_field_derivative E) (at x within s) \<Longrightarrow> | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 709 | ((\<lambda>x. f x + g x) has_field_derivative D + E) (at x within s)" | 
| 56261 | 710 | by (rule field_differentiable_add) | 
| 711 | ||
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 712 | lemma field_differentiable_minus[derivative_intros]: | 
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 713 | "(f has_field_derivative f') F \<Longrightarrow> ((\<lambda>z. - (f z)) has_field_derivative -f') F" | 
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 714 | by (rule has_derivative_imp_has_field_derivative[OF has_derivative_minus]) | 
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 715 | (auto simp: has_field_derivative_def field_simps mult_commute_abs) | 
| 21164 | 716 | |
| 56261 | 717 | corollary DERIV_minus: "(f has_field_derivative D) (at x within s) \<Longrightarrow> ((\<lambda>x. - f x) has_field_derivative -D) (at x within s)" | 
| 718 | by (rule field_differentiable_minus) | |
| 21164 | 719 | |
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 720 | lemma field_differentiable_diff[derivative_intros]: | 
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 721 | "(f has_field_derivative f') F \<Longrightarrow> (g has_field_derivative g') F \<Longrightarrow> ((\<lambda>z. f z - g z) has_field_derivative f' - g') F" | 
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 722 | by (simp only: assms diff_conv_add_uminus field_differentiable_add field_differentiable_minus) | 
| 56261 | 723 | |
| 724 | corollary DERIV_diff: | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 725 | "(f has_field_derivative D) (at x within s) \<Longrightarrow> (g has_field_derivative E) (at x within s) \<Longrightarrow> | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 726 | ((\<lambda>x. f x - g x) has_field_derivative D - E) (at x within s)" | 
| 56261 | 727 | by (rule field_differentiable_diff) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 728 | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 729 | lemma DERIV_continuous: "(f has_field_derivative D) (at x within s) \<Longrightarrow> continuous (at x within s) f" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 730 | by (drule has_derivative_continuous[OF has_field_derivative_imp_has_derivative]) simp | 
| 21164 | 731 | |
| 56261 | 732 | corollary DERIV_isCont: "DERIV f x :> D \<Longrightarrow> isCont f x" | 
| 733 | by (rule DERIV_continuous) | |
| 734 | ||
| 735 | lemma DERIV_continuous_on: | |
| 736 | "(\<And>x. x \<in> s \<Longrightarrow> (f has_field_derivative D) (at x)) \<Longrightarrow> continuous_on s f" | |
| 737 | by (metis DERIV_continuous continuous_at_imp_continuous_on) | |
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 738 | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 739 | lemma DERIV_mult': | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 740 | "(f has_field_derivative D) (at x within s) \<Longrightarrow> (g has_field_derivative E) (at x within s) \<Longrightarrow> | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 741 | ((\<lambda>x. f x * g x) has_field_derivative f x * E + D * g x) (at x within s)" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 742 | by (rule has_derivative_imp_has_field_derivative[OF has_derivative_mult]) | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 743 | (auto simp: field_simps mult_commute_abs dest: has_field_derivative_imp_has_derivative) | 
| 21164 | 744 | |
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 745 | lemma DERIV_mult[derivative_intros]: | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 746 | "(f has_field_derivative Da) (at x within s) \<Longrightarrow> (g has_field_derivative Db) (at x within s) \<Longrightarrow> | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 747 | ((\<lambda>x. f x * g x) has_field_derivative Da * g x + Db * f x) (at x within s)" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 748 | by (rule has_derivative_imp_has_field_derivative[OF has_derivative_mult]) | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 749 | (auto simp: field_simps dest: has_field_derivative_imp_has_derivative) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 750 | |
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 751 | text {* Derivative of linear multiplication *}
 | 
| 21164 | 752 | |
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 753 | lemma DERIV_cmult: | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 754 | "(f has_field_derivative D) (at x within s) ==> ((\<lambda>x. c * f x) has_field_derivative c * D) (at x within s)" | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 755 | by (drule DERIV_mult' [OF DERIV_const], simp) | 
| 21164 | 756 | |
| 55967 | 757 | lemma DERIV_cmult_right: | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 758 | "(f has_field_derivative D) (at x within s) ==> ((\<lambda>x. f x * c) has_field_derivative D * c) (at x within s)" | 
| 57514 
bdc2c6b40bf2
prefer ac_simps collections over separate name bindings for add and mult
 haftmann parents: 
57512diff
changeset | 759 | using DERIV_cmult by (force simp add: ac_simps) | 
| 55967 | 760 | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 761 | lemma DERIV_cmult_Id [simp]: "(op * c has_field_derivative c) (at x within s)" | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 762 | by (cut_tac c = c and x = x in DERIV_ident [THEN DERIV_cmult], simp) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 763 | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 764 | lemma DERIV_cdivide: | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 765 | "(f has_field_derivative D) (at x within s) \<Longrightarrow> ((\<lambda>x. f x / c) has_field_derivative D / c) (at x within s)" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 766 | using DERIV_cmult_right[of f D x s "1 / c"] by simp | 
| 21164 | 767 | |
| 768 | lemma DERIV_unique: | |
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 769 | "DERIV f x :> D \<Longrightarrow> DERIV f x :> E \<Longrightarrow> D = E" | 
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 770 | unfolding DERIV_def by (rule LIM_unique) | 
| 21164 | 771 | |
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 772 | lemma DERIV_setsum[derivative_intros]: | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 773 | "(\<And> n. n \<in> S \<Longrightarrow> ((\<lambda>x. f x n) has_field_derivative (f' x n)) F) \<Longrightarrow> | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 774 | ((\<lambda>x. setsum (f x) S) has_field_derivative setsum (f' x) S) F" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 775 | by (rule has_derivative_imp_has_field_derivative[OF has_derivative_setsum]) | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 776 | (auto simp: setsum_right_distrib mult_commute_abs dest: has_field_derivative_imp_has_derivative) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 777 | |
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 778 | lemma DERIV_inverse'[derivative_intros]: | 
| 59867 
58043346ca64
given up separate type classes demanding `inverse 0 = 0`
 haftmann parents: 
59862diff
changeset | 779 | assumes "(f has_field_derivative D) (at x within s)" | 
| 
58043346ca64
given up separate type classes demanding `inverse 0 = 0`
 haftmann parents: 
59862diff
changeset | 780 | and "f x \<noteq> 0" | 
| 
58043346ca64
given up separate type classes demanding `inverse 0 = 0`
 haftmann parents: 
59862diff
changeset | 781 | shows "((\<lambda>x. inverse (f x)) has_field_derivative - (inverse (f x) * D * inverse (f x))) (at x within s)" | 
| 
58043346ca64
given up separate type classes demanding `inverse 0 = 0`
 haftmann parents: 
59862diff
changeset | 782 | proof - | 
| 
58043346ca64
given up separate type classes demanding `inverse 0 = 0`
 haftmann parents: 
59862diff
changeset | 783 | have "(f has_derivative (\<lambda>x. x * D)) = (f has_derivative op * D)" | 
| 
58043346ca64
given up separate type classes demanding `inverse 0 = 0`
 haftmann parents: 
59862diff
changeset | 784 | by (rule arg_cong [of "\<lambda>x. x * D"]) (simp add: fun_eq_iff) | 
| 
58043346ca64
given up separate type classes demanding `inverse 0 = 0`
 haftmann parents: 
59862diff
changeset | 785 | with assms have "(f has_derivative (\<lambda>x. x * D)) (at x within s)" | 
| 
58043346ca64
given up separate type classes demanding `inverse 0 = 0`
 haftmann parents: 
59862diff
changeset | 786 | by (auto dest!: has_field_derivative_imp_has_derivative) | 
| 
58043346ca64
given up separate type classes demanding `inverse 0 = 0`
 haftmann parents: 
59862diff
changeset | 787 | then show ?thesis using `f x \<noteq> 0` | 
| 
58043346ca64
given up separate type classes demanding `inverse 0 = 0`
 haftmann parents: 
59862diff
changeset | 788 | by (auto intro: has_derivative_imp_has_field_derivative has_derivative_inverse) | 
| 
58043346ca64
given up separate type classes demanding `inverse 0 = 0`
 haftmann parents: 
59862diff
changeset | 789 | qed | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 790 | |
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 791 | text {* Power of @{text "-1"} *}
 | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 792 | |
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 793 | lemma DERIV_inverse: | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 794 | "x \<noteq> 0 \<Longrightarrow> ((\<lambda>x. inverse(x)) has_field_derivative - (inverse x ^ Suc (Suc 0))) (at x within s)" | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 795 | by (drule DERIV_inverse' [OF DERIV_ident]) simp | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 796 | |
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 797 | text {* Derivative of inverse *}
 | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 798 | |
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 799 | lemma DERIV_inverse_fun: | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 800 | "(f has_field_derivative d) (at x within s) \<Longrightarrow> f x \<noteq> 0 \<Longrightarrow> | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 801 | ((\<lambda>x. inverse (f x)) has_field_derivative (- (d * inverse(f x ^ Suc (Suc 0))))) (at x within s)" | 
| 57514 
bdc2c6b40bf2
prefer ac_simps collections over separate name bindings for add and mult
 haftmann parents: 
57512diff
changeset | 802 | by (drule (1) DERIV_inverse') (simp add: ac_simps nonzero_inverse_mult_distrib) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 803 | |
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 804 | text {* Derivative of quotient *}
 | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 805 | |
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 806 | lemma DERIV_divide[derivative_intros]: | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 807 | "(f has_field_derivative D) (at x within s) \<Longrightarrow> | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 808 | (g has_field_derivative E) (at x within s) \<Longrightarrow> g x \<noteq> 0 \<Longrightarrow> | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 809 | ((\<lambda>x. f x / g x) has_field_derivative (D * g x - f x * E) / (g x * g x)) (at x within s)" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 810 | by (rule has_derivative_imp_has_field_derivative[OF has_derivative_divide]) | 
| 56480 
093ea91498e6
field_simps: better support for negation and division, and power
 hoelzl parents: 
56479diff
changeset | 811 | (auto dest: has_field_derivative_imp_has_derivative simp: field_simps) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 812 | |
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 813 | lemma DERIV_quotient: | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 814 | "(f has_field_derivative d) (at x within s) \<Longrightarrow> | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 815 | (g has_field_derivative e) (at x within s)\<Longrightarrow> g x \<noteq> 0 \<Longrightarrow> | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 816 | ((\<lambda>y. f y / g y) has_field_derivative (d * g x - (e * f x)) / (g x ^ Suc (Suc 0))) (at x within s)" | 
| 57512 
cc97b347b301
reduced name variants for assoc and commute on plus and mult
 haftmann parents: 
57418diff
changeset | 817 | by (drule (2) DERIV_divide) (simp add: mult.commute) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 818 | |
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 819 | lemma DERIV_power_Suc: | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 820 | "(f has_field_derivative D) (at x within s) \<Longrightarrow> | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 821 | ((\<lambda>x. f x ^ Suc n) has_field_derivative (1 + of_nat n) * (D * f x ^ n)) (at x within s)" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 822 | by (rule has_derivative_imp_has_field_derivative[OF has_derivative_power]) | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 823 | (auto simp: has_field_derivative_def) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 824 | |
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 825 | lemma DERIV_power[derivative_intros]: | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 826 | "(f has_field_derivative D) (at x within s) \<Longrightarrow> | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 827 | ((\<lambda>x. f x ^ n) has_field_derivative of_nat n * (D * f x ^ (n - Suc 0))) (at x within s)" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 828 | by (rule has_derivative_imp_has_field_derivative[OF has_derivative_power]) | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 829 | (auto simp: has_field_derivative_def) | 
| 31880 | 830 | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 831 | lemma DERIV_pow: "((\<lambda>x. x ^ n) has_field_derivative real n * (x ^ (n - Suc 0))) (at x within s)" | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 832 | apply (cut_tac DERIV_power [OF DERIV_ident]) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 833 | apply (simp add: real_of_nat_def) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 834 | done | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 835 | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 836 | lemma DERIV_chain': "(f has_field_derivative D) (at x within s) \<Longrightarrow> DERIV g (f x) :> E \<Longrightarrow> | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 837 | ((\<lambda>x. g (f x)) has_field_derivative E * D) (at x within s)" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 838 | using has_derivative_compose[of f "op * D" x s g "op * E"] | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 839 | unfolding has_field_derivative_def mult_commute_abs ac_simps . | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 840 | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 841 | corollary DERIV_chain2: "DERIV f (g x) :> Da \<Longrightarrow> (g has_field_derivative Db) (at x within s) \<Longrightarrow> | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 842 | ((\<lambda>x. f (g x)) has_field_derivative Da * Db) (at x within s)" | 
| 55967 | 843 | by (rule DERIV_chain') | 
| 844 | ||
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 845 | text {* Standard version *}
 | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 846 | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 847 | lemma DERIV_chain: | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 848 | "DERIV f (g x) :> Da \<Longrightarrow> (g has_field_derivative Db) (at x within s) \<Longrightarrow> | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 849 | (f o g has_field_derivative Da * Db) (at x within s)" | 
| 57512 
cc97b347b301
reduced name variants for assoc and commute on plus and mult
 haftmann parents: 
57418diff
changeset | 850 | by (drule (1) DERIV_chain', simp add: o_def mult.commute) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 851 | |
| 55967 | 852 | lemma DERIV_image_chain: | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 853 | "(f has_field_derivative Da) (at (g x) within (g ` s)) \<Longrightarrow> (g has_field_derivative Db) (at x within s) \<Longrightarrow> | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 854 | (f o g has_field_derivative Da * Db) (at x within s)" | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 855 | using has_derivative_in_compose [of g "op * Db" x s f "op * Da "] | 
| 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 856 | by (simp add: has_field_derivative_def o_def mult_commute_abs ac_simps) | 
| 55967 | 857 | |
| 858 | (*These two are from HOL Light: HAS_COMPLEX_DERIVATIVE_CHAIN*) | |
| 859 | lemma DERIV_chain_s: | |
| 860 | assumes "(\<And>x. x \<in> s \<Longrightarrow> DERIV g x :> g'(x))" | |
| 861 | and "DERIV f x :> f'" | |
| 862 | and "f x \<in> s" | |
| 863 | shows "DERIV (\<lambda>x. g(f x)) x :> f' * g'(f x)" | |
| 57512 
cc97b347b301
reduced name variants for assoc and commute on plus and mult
 haftmann parents: 
57418diff
changeset | 864 | by (metis (full_types) DERIV_chain' mult.commute assms) | 
| 55967 | 865 | |
| 866 | lemma DERIV_chain3: (*HAS_COMPLEX_DERIVATIVE_CHAIN_UNIV*) | |
| 867 | assumes "(\<And>x. DERIV g x :> g'(x))" | |
| 868 | and "DERIV f x :> f'" | |
| 869 | shows "DERIV (\<lambda>x. g(f x)) x :> f' * g'(f x)" | |
| 870 | by (metis UNIV_I DERIV_chain_s [of UNIV] assms) | |
| 871 | ||
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 872 | declare | 
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 873 | DERIV_power[where 'a=real, unfolded real_of_nat_def[symmetric], derivative_intros] | 
| 21164 | 874 | |
| 875 | text{*Alternative definition for differentiability*}
 | |
| 876 | ||
| 877 | lemma DERIV_LIM_iff: | |
| 31338 
d41a8ba25b67
generalize constants from Lim.thy to class metric_space
 huffman parents: 
31336diff
changeset | 878 |   fixes f :: "'a::{real_normed_vector,inverse} \<Rightarrow> 'a" shows
 | 
| 21784 
e76faa6e65fd
changed (ns)deriv to take functions of type 'a::real_normed_field => 'a
 huffman parents: 
21404diff
changeset | 879 | "((%h. (f(a + h) - f(a)) / h) -- 0 --> D) = | 
| 21164 | 880 | ((%x. (f(x)-f(a)) / (x-a)) -- a --> D)" | 
| 881 | apply (rule iffI) | |
| 882 | apply (drule_tac k="- a" in LIM_offset) | |
| 54230 
b1d955791529
more simplification rules on unary and binary minus
 haftmann parents: 
53381diff
changeset | 883 | apply simp | 
| 21164 | 884 | apply (drule_tac k="a" in LIM_offset) | 
| 57512 
cc97b347b301
reduced name variants for assoc and commute on plus and mult
 haftmann parents: 
57418diff
changeset | 885 | apply (simp add: add.commute) | 
| 21164 | 886 | done | 
| 887 | ||
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 888 | lemma DERIV_iff2: "(DERIV f x :> D) \<longleftrightarrow> (\<lambda>z. (f z - f x) / (z - x)) --x --> D" | 
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 889 | by (simp add: DERIV_def DERIV_LIM_iff) | 
| 21164 | 890 | |
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 891 | lemma DERIV_cong_ev: "x = y \<Longrightarrow> eventually (\<lambda>x. f x = g x) (nhds x) \<Longrightarrow> u = v \<Longrightarrow> | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 892 | DERIV f x :> u \<longleftrightarrow> DERIV g y :> v" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 893 | unfolding DERIV_iff2 | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 894 | proof (rule filterlim_cong) | 
| 53374 
a14d2a854c02
tuned proofs -- clarified flow of facts wrt. calculation;
 wenzelm parents: 
51642diff
changeset | 895 | assume *: "eventually (\<lambda>x. f x = g x) (nhds x)" | 
| 
a14d2a854c02
tuned proofs -- clarified flow of facts wrt. calculation;
 wenzelm parents: 
51642diff
changeset | 896 | moreover from * have "f x = g x" by (auto simp: eventually_nhds) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 897 | moreover assume "x = y" "u = v" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 898 | ultimately show "eventually (\<lambda>xa. (f xa - f x) / (xa - x) = (g xa - g y) / (xa - y)) (at x)" | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 899 | by (auto simp: eventually_at_filter elim: eventually_elim1) | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 900 | qed simp_all | 
| 21164 | 901 | |
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 902 | lemma DERIV_shift: | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 903 | "(DERIV f (x + z) :> y) \<longleftrightarrow> (DERIV (\<lambda>x. f (x + z)) x :> y)" | 
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 904 | by (simp add: DERIV_def field_simps) | 
| 21164 | 905 | |
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 906 | lemma DERIV_mirror: | 
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 907 | "(DERIV f (- x) :> y) \<longleftrightarrow> (DERIV (\<lambda>x. f (- x::real) :: real) x :> - y)" | 
| 56479 
91958d4b30f7
revert c1bbd3e22226, a14831ac3023, and 36489d77c484: divide_minus_left/right are again simp rules
 hoelzl parents: 
56409diff
changeset | 908 | by (simp add: DERIV_def filterlim_at_split filterlim_at_left_to_right | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 909 | tendsto_minus_cancel_left field_simps conj_commute) | 
| 21164 | 910 | |
| 29975 | 911 | text {* Caratheodory formulation of derivative at a point *}
 | 
| 21164 | 912 | |
| 55970 
6d123f0ae358
Some new proofs. Tidying up, esp to remove "apply rule".
 paulson <lp15@cam.ac.uk> parents: 
55967diff
changeset | 913 | lemma CARAT_DERIV: (*FIXME: SUPERSEDED BY THE ONE IN Deriv.thy. But still used by NSA/HDeriv.thy*) | 
| 51642 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
 hoelzl parents: 
51641diff
changeset | 914 | "(DERIV f x :> l) \<longleftrightarrow> (\<exists>g. (\<forall>z. f z - f x = g z * (z - x)) \<and> isCont g x \<and> g x = l)" | 
| 21164 | 915 | (is "?lhs = ?rhs") | 
| 916 | proof | |
| 917 | assume der: "DERIV f x :> l" | |
| 21784 
e76faa6e65fd
changed (ns)deriv to take functions of type 'a::real_normed_field => 'a
 huffman parents: 
21404diff
changeset | 918 | show "\<exists>g. (\<forall>z. f z - f x = g z * (z-x)) \<and> isCont g x \<and> g x = l" | 
| 21164 | 919 | proof (intro exI conjI) | 
| 21784 
e76faa6e65fd
changed (ns)deriv to take functions of type 'a::real_normed_field => 'a
 huffman parents: 
21404diff
changeset | 920 | let ?g = "(%z. if z = x then l else (f z - f x) / (z-x))" | 
| 23413 
5caa2710dd5b
tuned laws for cancellation in divisions for fields.
 nipkow parents: 
23412diff
changeset | 921 | show "\<forall>z. f z - f x = ?g z * (z-x)" by simp | 
| 21164 | 922 | show "isCont ?g x" using der | 
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 923 | by (simp add: isCont_iff DERIV_def cong: LIM_equal [rule_format]) | 
| 21164 | 924 | show "?g x = l" by simp | 
| 925 | qed | |
| 926 | next | |
| 927 | assume "?rhs" | |
| 928 | then obtain g where | |
| 21784 
e76faa6e65fd
changed (ns)deriv to take functions of type 'a::real_normed_field => 'a
 huffman parents: 
21404diff
changeset | 929 | "(\<forall>z. f z - f x = g z * (z-x))" and "isCont g x" and "g x = l" by blast | 
| 21164 | 930 | thus "(DERIV f x :> l)" | 
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 931 | by (auto simp add: isCont_iff DERIV_def cong: LIM_cong) | 
| 21164 | 932 | qed | 
| 933 | ||
| 934 | ||
| 29975 | 935 | subsection {* Local extrema *}
 | 
| 936 | ||
| 21164 | 937 | text{*If @{term "0 < f'(x)"} then @{term x} is Locally Strictly Increasing At The Right*}
 | 
| 938 | ||
| 33654 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 939 | lemma DERIV_pos_inc_right: | 
| 21164 | 940 | fixes f :: "real => real" | 
| 941 | assumes der: "DERIV f x :> l" | |
| 942 | and l: "0 < l" | |
| 943 | shows "\<exists>d > 0. \<forall>h > 0. h < d --> f(x) < f(x + h)" | |
| 944 | proof - | |
| 945 | from l der [THEN DERIV_D, THEN LIM_D [where r = "l"]] | |
| 946 | have "\<exists>s > 0. (\<forall>z. z \<noteq> 0 \<and> \<bar>z\<bar> < s \<longrightarrow> \<bar>(f(x+z) - f x) / z - l\<bar> < l)" | |
| 54230 
b1d955791529
more simplification rules on unary and binary minus
 haftmann parents: 
53381diff
changeset | 947 | by simp | 
| 21164 | 948 | then obtain s | 
| 949 | where s: "0 < s" | |
| 950 | and all: "!!z. z \<noteq> 0 \<and> \<bar>z\<bar> < s \<longrightarrow> \<bar>(f(x+z) - f x) / z - l\<bar> < l" | |
| 951 | by auto | |
| 952 | thus ?thesis | |
| 953 | proof (intro exI conjI strip) | |
| 23441 | 954 | show "0<s" using s . | 
| 21164 | 955 | fix h::real | 
| 956 | assume "0 < h" "h < s" | |
| 957 | with all [of h] show "f x < f (x+h)" | |
| 54230 
b1d955791529
more simplification rules on unary and binary minus
 haftmann parents: 
53381diff
changeset | 958 | proof (simp add: abs_if pos_less_divide_eq split add: split_if_asm) | 
| 21164 | 959 | assume "~ (f (x+h) - f x) / h < l" and h: "0 < h" | 
| 960 | with l | |
| 961 | have "0 < (f (x+h) - f x) / h" by arith | |
| 962 | thus "f x < f (x+h)" | |
| 963 | by (simp add: pos_less_divide_eq h) | |
| 964 | qed | |
| 965 | qed | |
| 966 | qed | |
| 967 | ||
| 33654 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 968 | lemma DERIV_neg_dec_left: | 
| 21164 | 969 | fixes f :: "real => real" | 
| 970 | assumes der: "DERIV f x :> l" | |
| 971 | and l: "l < 0" | |
| 972 | shows "\<exists>d > 0. \<forall>h > 0. h < d --> f(x) < f(x-h)" | |
| 973 | proof - | |
| 974 | from l der [THEN DERIV_D, THEN LIM_D [where r = "-l"]] | |
| 975 | have "\<exists>s > 0. (\<forall>z. z \<noteq> 0 \<and> \<bar>z\<bar> < s \<longrightarrow> \<bar>(f(x+z) - f x) / z - l\<bar> < -l)" | |
| 54230 
b1d955791529
more simplification rules on unary and binary minus
 haftmann parents: 
53381diff
changeset | 976 | by simp | 
| 21164 | 977 | then obtain s | 
| 978 | where s: "0 < s" | |
| 979 | and all: "!!z. z \<noteq> 0 \<and> \<bar>z\<bar> < s \<longrightarrow> \<bar>(f(x+z) - f x) / z - l\<bar> < -l" | |
| 980 | by auto | |
| 981 | thus ?thesis | |
| 982 | proof (intro exI conjI strip) | |
| 23441 | 983 | show "0<s" using s . | 
| 21164 | 984 | fix h::real | 
| 985 | assume "0 < h" "h < s" | |
| 986 | with all [of "-h"] show "f x < f (x-h)" | |
| 56479 
91958d4b30f7
revert c1bbd3e22226, a14831ac3023, and 36489d77c484: divide_minus_left/right are again simp rules
 hoelzl parents: 
56409diff
changeset | 987 | proof (simp add: abs_if pos_less_divide_eq split add: split_if_asm) | 
| 
91958d4b30f7
revert c1bbd3e22226, a14831ac3023, and 36489d77c484: divide_minus_left/right are again simp rules
 hoelzl parents: 
56409diff
changeset | 988 | assume " - ((f (x-h) - f x) / h) < l" and h: "0 < h" | 
| 21164 | 989 | with l | 
| 990 | have "0 < (f (x-h) - f x) / h" by arith | |
| 991 | thus "f x < f (x-h)" | |
| 992 | by (simp add: pos_less_divide_eq h) | |
| 993 | qed | |
| 994 | qed | |
| 995 | qed | |
| 996 | ||
| 33654 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 997 | lemma DERIV_pos_inc_left: | 
| 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 998 | fixes f :: "real => real" | 
| 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 999 | shows "DERIV f x :> l \<Longrightarrow> 0 < l \<Longrightarrow> \<exists>d > 0. \<forall>h > 0. h < d --> f(x - h) < f(x)" | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 1000 | apply (rule DERIV_neg_dec_left [of "%x. - f x" "-l" x, simplified]) | 
| 41368 | 1001 | apply (auto simp add: DERIV_minus) | 
| 33654 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1002 | done | 
| 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1003 | |
| 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1004 | lemma DERIV_neg_dec_right: | 
| 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1005 | fixes f :: "real => real" | 
| 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1006 | shows "DERIV f x :> l \<Longrightarrow> l < 0 \<Longrightarrow> \<exists>d > 0. \<forall>h > 0. h < d --> f(x) > f(x + h)" | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 1007 | apply (rule DERIV_pos_inc_right [of "%x. - f x" "-l" x, simplified]) | 
| 41368 | 1008 | apply (auto simp add: DERIV_minus) | 
| 33654 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1009 | done | 
| 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1010 | |
| 21164 | 1011 | lemma DERIV_local_max: | 
| 1012 | fixes f :: "real => real" | |
| 1013 | assumes der: "DERIV f x :> l" | |
| 1014 | and d: "0 < d" | |
| 1015 | and le: "\<forall>y. \<bar>x-y\<bar> < d --> f(y) \<le> f(x)" | |
| 1016 | shows "l = 0" | |
| 1017 | proof (cases rule: linorder_cases [of l 0]) | |
| 23441 | 1018 | case equal thus ?thesis . | 
| 21164 | 1019 | next | 
| 1020 | case less | |
| 33654 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1021 | from DERIV_neg_dec_left [OF der less] | 
| 21164 | 1022 | obtain d' where d': "0 < d'" | 
| 1023 | and lt: "\<forall>h > 0. h < d' \<longrightarrow> f x < f (x-h)" by blast | |
| 1024 | from real_lbound_gt_zero [OF d d'] | |
| 1025 | obtain e where "0 < e \<and> e < d \<and> e < d'" .. | |
| 1026 | with lt le [THEN spec [where x="x-e"]] | |
| 1027 | show ?thesis by (auto simp add: abs_if) | |
| 1028 | next | |
| 1029 | case greater | |
| 33654 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1030 | from DERIV_pos_inc_right [OF der greater] | 
| 21164 | 1031 | obtain d' where d': "0 < d'" | 
| 1032 | and lt: "\<forall>h > 0. h < d' \<longrightarrow> f x < f (x + h)" by blast | |
| 1033 | from real_lbound_gt_zero [OF d d'] | |
| 1034 | obtain e where "0 < e \<and> e < d \<and> e < d'" .. | |
| 1035 | with lt le [THEN spec [where x="x+e"]] | |
| 1036 | show ?thesis by (auto simp add: abs_if) | |
| 1037 | qed | |
| 1038 | ||
| 1039 | ||
| 1040 | text{*Similar theorem for a local minimum*}
 | |
| 1041 | lemma DERIV_local_min: | |
| 1042 | fixes f :: "real => real" | |
| 1043 | shows "[| DERIV f x :> l; 0 < d; \<forall>y. \<bar>x-y\<bar> < d --> f(x) \<le> f(y) |] ==> l = 0" | |
| 1044 | by (drule DERIV_minus [THEN DERIV_local_max], auto) | |
| 1045 | ||
| 1046 | ||
| 1047 | text{*In particular, if a function is locally flat*}
 | |
| 1048 | lemma DERIV_local_const: | |
| 1049 | fixes f :: "real => real" | |
| 1050 | shows "[| DERIV f x :> l; 0 < d; \<forall>y. \<bar>x-y\<bar> < d --> f(x) = f(y) |] ==> l = 0" | |
| 1051 | by (auto dest!: DERIV_local_max) | |
| 1052 | ||
| 29975 | 1053 | |
| 1054 | subsection {* Rolle's Theorem *}
 | |
| 1055 | ||
| 21164 | 1056 | text{*Lemma about introducing open ball in open interval*}
 | 
| 1057 | lemma lemma_interval_lt: | |
| 1058 | "[| a < x; x < b |] | |
| 1059 | ==> \<exists>d::real. 0 < d & (\<forall>y. \<bar>x-y\<bar> < d --> a < y & y < b)" | |
| 27668 | 1060 | |
| 22998 | 1061 | apply (simp add: abs_less_iff) | 
| 21164 | 1062 | apply (insert linorder_linear [of "x-a" "b-x"], safe) | 
| 1063 | apply (rule_tac x = "x-a" in exI) | |
| 1064 | apply (rule_tac [2] x = "b-x" in exI, auto) | |
| 1065 | done | |
| 1066 | ||
| 1067 | lemma lemma_interval: "[| a < x; x < b |] ==> | |
| 1068 | \<exists>d::real. 0 < d & (\<forall>y. \<bar>x-y\<bar> < d --> a \<le> y & y \<le> b)" | |
| 1069 | apply (drule lemma_interval_lt, auto) | |
| 44921 | 1070 | apply force | 
| 21164 | 1071 | done | 
| 1072 | ||
| 1073 | text{*Rolle's Theorem.
 | |
| 1074 |    If @{term f} is defined and continuous on the closed interval
 | |
| 1075 |    @{text "[a,b]"} and differentiable on the open interval @{text "(a,b)"},
 | |
| 1076 |    and @{term "f(a) = f(b)"},
 | |
| 1077 |    then there exists @{text "x0 \<in> (a,b)"} such that @{term "f'(x0) = 0"}*}
 | |
| 1078 | theorem Rolle: | |
| 1079 | assumes lt: "a < b" | |
| 1080 | and eq: "f(a) = f(b)" | |
| 1081 | and con: "\<forall>x. a \<le> x & x \<le> b --> isCont f x" | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 1082 | and dif [rule_format]: "\<forall>x. a < x & x < b --> f differentiable (at x)" | 
| 21784 
e76faa6e65fd
changed (ns)deriv to take functions of type 'a::real_normed_field => 'a
 huffman parents: 
21404diff
changeset | 1083 | shows "\<exists>z::real. a < z & z < b & DERIV f z :> 0" | 
| 21164 | 1084 | proof - | 
| 1085 | have le: "a \<le> b" using lt by simp | |
| 1086 | from isCont_eq_Ub [OF le con] | |
| 1087 | obtain x where x_max: "\<forall>z. a \<le> z \<and> z \<le> b \<longrightarrow> f z \<le> f x" | |
| 1088 | and alex: "a \<le> x" and xleb: "x \<le> b" | |
| 1089 | by blast | |
| 1090 | from isCont_eq_Lb [OF le con] | |
| 1091 | obtain x' where x'_min: "\<forall>z. a \<le> z \<and> z \<le> b \<longrightarrow> f x' \<le> f z" | |
| 1092 | and alex': "a \<le> x'" and x'leb: "x' \<le> b" | |
| 1093 | by blast | |
| 1094 | show ?thesis | |
| 1095 | proof cases | |
| 1096 | assume axb: "a < x & x < b" | |
| 1097 |         --{*@{term f} attains its maximum within the interval*}
 | |
| 27668 | 1098 | hence ax: "a<x" and xb: "x<b" by arith + | 
| 21164 | 1099 | from lemma_interval [OF ax xb] | 
| 1100 | obtain d where d: "0<d" and bound: "\<forall>y. \<bar>x-y\<bar> < d \<longrightarrow> a \<le> y \<and> y \<le> b" | |
| 1101 | by blast | |
| 1102 | hence bound': "\<forall>y. \<bar>x-y\<bar> < d \<longrightarrow> f y \<le> f x" using x_max | |
| 1103 | by blast | |
| 1104 | from differentiableD [OF dif [OF axb]] | |
| 1105 | obtain l where der: "DERIV f x :> l" .. | |
| 1106 | have "l=0" by (rule DERIV_local_max [OF der d bound']) | |
| 1107 |         --{*the derivative at a local maximum is zero*}
 | |
| 1108 | thus ?thesis using ax xb der by auto | |
| 1109 | next | |
| 1110 | assume notaxb: "~ (a < x & x < b)" | |
| 1111 | hence xeqab: "x=a | x=b" using alex xleb by arith | |
| 1112 | hence fb_eq_fx: "f b = f x" by (auto simp add: eq) | |
| 1113 | show ?thesis | |
| 1114 | proof cases | |
| 1115 | assume ax'b: "a < x' & x' < b" | |
| 1116 |         --{*@{term f} attains its minimum within the interval*}
 | |
| 27668 | 1117 | hence ax': "a<x'" and x'b: "x'<b" by arith+ | 
| 21164 | 1118 | from lemma_interval [OF ax' x'b] | 
| 1119 | obtain d where d: "0<d" and bound: "\<forall>y. \<bar>x'-y\<bar> < d \<longrightarrow> a \<le> y \<and> y \<le> b" | |
| 1120 | by blast | |
| 1121 | hence bound': "\<forall>y. \<bar>x'-y\<bar> < d \<longrightarrow> f x' \<le> f y" using x'_min | |
| 1122 | by blast | |
| 1123 | from differentiableD [OF dif [OF ax'b]] | |
| 1124 | obtain l where der: "DERIV f x' :> l" .. | |
| 1125 | have "l=0" by (rule DERIV_local_min [OF der d bound']) | |
| 1126 |         --{*the derivative at a local minimum is zero*}
 | |
| 1127 | thus ?thesis using ax' x'b der by auto | |
| 1128 | next | |
| 1129 | assume notax'b: "~ (a < x' & x' < b)" | |
| 1130 |         --{*@{term f} is constant througout the interval*}
 | |
| 1131 | hence x'eqab: "x'=a | x'=b" using alex' x'leb by arith | |
| 1132 | hence fb_eq_fx': "f b = f x'" by (auto simp add: eq) | |
| 1133 | from dense [OF lt] | |
| 1134 | obtain r where ar: "a < r" and rb: "r < b" by blast | |
| 1135 | from lemma_interval [OF ar rb] | |
| 1136 | obtain d where d: "0<d" and bound: "\<forall>y. \<bar>r-y\<bar> < d \<longrightarrow> a \<le> y \<and> y \<le> b" | |
| 1137 | by blast | |
| 1138 | have eq_fb: "\<forall>z. a \<le> z --> z \<le> b --> f z = f b" | |
| 1139 | proof (clarify) | |
| 1140 | fix z::real | |
| 1141 | assume az: "a \<le> z" and zb: "z \<le> b" | |
| 1142 | show "f z = f b" | |
| 1143 | proof (rule order_antisym) | |
| 1144 | show "f z \<le> f b" by (simp add: fb_eq_fx x_max az zb) | |
| 1145 | show "f b \<le> f z" by (simp add: fb_eq_fx' x'_min az zb) | |
| 1146 | qed | |
| 1147 | qed | |
| 1148 | have bound': "\<forall>y. \<bar>r-y\<bar> < d \<longrightarrow> f r = f y" | |
| 1149 | proof (intro strip) | |
| 1150 | fix y::real | |
| 1151 | assume lt: "\<bar>r-y\<bar> < d" | |
| 1152 | hence "f y = f b" by (simp add: eq_fb bound) | |
| 1153 | thus "f r = f y" by (simp add: eq_fb ar rb order_less_imp_le) | |
| 1154 | qed | |
| 1155 | from differentiableD [OF dif [OF conjI [OF ar rb]]] | |
| 1156 | obtain l where der: "DERIV f r :> l" .. | |
| 1157 | have "l=0" by (rule DERIV_local_const [OF der d bound']) | |
| 1158 |         --{*the derivative of a constant function is zero*}
 | |
| 1159 | thus ?thesis using ar rb der by auto | |
| 1160 | qed | |
| 1161 | qed | |
| 1162 | qed | |
| 1163 | ||
| 1164 | ||
| 1165 | subsection{*Mean Value Theorem*}
 | |
| 1166 | ||
| 1167 | lemma lemma_MVT: | |
| 1168 | "f a - (f b - f a)/(b-a) * a = f b - (f b - f a)/(b-a) * (b::real)" | |
| 51481 
ef949192e5d6
move continuous_on_inv to HOL image (simplifies isCont_inverse_function)
 hoelzl parents: 
51480diff
changeset | 1169 | by (cases "a = b") (simp_all add: field_simps) | 
| 21164 | 1170 | |
| 1171 | theorem MVT: | |
| 1172 | assumes lt: "a < b" | |
| 1173 | and con: "\<forall>x. a \<le> x & x \<le> b --> isCont f x" | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 1174 | and dif [rule_format]: "\<forall>x. a < x & x < b --> f differentiable (at x)" | 
| 21784 
e76faa6e65fd
changed (ns)deriv to take functions of type 'a::real_normed_field => 'a
 huffman parents: 
21404diff
changeset | 1175 | shows "\<exists>l z::real. a < z & z < b & DERIV f z :> l & | 
| 21164 | 1176 | (f(b) - f(a) = (b-a) * l)" | 
| 1177 | proof - | |
| 1178 | let ?F = "%x. f x - ((f b - f a) / (b-a)) * x" | |
| 44233 | 1179 | have contF: "\<forall>x. a \<le> x \<and> x \<le> b \<longrightarrow> isCont ?F x" | 
| 56371 
fb9ae0727548
extend continuous_intros; remove continuous_on_intros and isCont_intros
 hoelzl parents: 
56369diff
changeset | 1180 | using con by (fast intro: continuous_intros) | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 1181 | have difF: "\<forall>x. a < x \<and> x < b \<longrightarrow> ?F differentiable (at x)" | 
| 21164 | 1182 | proof (clarify) | 
| 1183 | fix x::real | |
| 1184 | assume ax: "a < x" and xb: "x < b" | |
| 1185 | from differentiableD [OF dif [OF conjI [OF ax xb]]] | |
| 1186 | obtain l where der: "DERIV f x :> l" .. | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 1187 | show "?F differentiable (at x)" | 
| 21164 | 1188 | by (rule differentiableI [where D = "l - (f b - f a)/(b-a)"], | 
| 1189 | blast intro: DERIV_diff DERIV_cmult_Id der) | |
| 1190 | qed | |
| 1191 | from Rolle [where f = ?F, OF lt lemma_MVT contF difF] | |
| 1192 | obtain z where az: "a < z" and zb: "z < b" and der: "DERIV ?F z :> 0" | |
| 1193 | by blast | |
| 1194 | have "DERIV (%x. ((f b - f a)/(b-a)) * x) z :> (f b - f a)/(b-a)" | |
| 1195 | by (rule DERIV_cmult_Id) | |
| 1196 | hence derF: "DERIV (\<lambda>x. ?F x + (f b - f a) / (b - a) * x) z | |
| 1197 | :> 0 + (f b - f a) / (b - a)" | |
| 1198 | by (rule DERIV_add [OF der]) | |
| 1199 | show ?thesis | |
| 1200 | proof (intro exI conjI) | |
| 23441 | 1201 | show "a < z" using az . | 
| 1202 | show "z < b" using zb . | |
| 21164 | 1203 | show "f b - f a = (b - a) * ((f b - f a)/(b-a))" by (simp) | 
| 1204 | show "DERIV f z :> ((f b - f a)/(b-a))" using derF by simp | |
| 1205 | qed | |
| 1206 | qed | |
| 1207 | ||
| 29803 
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
 hoelzl parents: 
29667diff
changeset | 1208 | lemma MVT2: | 
| 
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
 hoelzl parents: 
29667diff
changeset | 1209 | "[| a < b; \<forall>x. a \<le> x & x \<le> b --> DERIV f x :> f'(x) |] | 
| 
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
 hoelzl parents: 
29667diff
changeset | 1210 | ==> \<exists>z::real. a < z & z < b & (f b - f a = (b - a) * f'(z))" | 
| 
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
 hoelzl parents: 
29667diff
changeset | 1211 | apply (drule MVT) | 
| 
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
 hoelzl parents: 
29667diff
changeset | 1212 | apply (blast intro: DERIV_isCont) | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 1213 | apply (force dest: order_less_imp_le simp add: real_differentiable_def) | 
| 29803 
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
 hoelzl parents: 
29667diff
changeset | 1214 | apply (blast dest: DERIV_unique order_less_imp_le) | 
| 
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
 hoelzl parents: 
29667diff
changeset | 1215 | done | 
| 
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
 hoelzl parents: 
29667diff
changeset | 1216 | |
| 21164 | 1217 | |
| 1218 | text{*A function is constant if its derivative is 0 over an interval.*}
 | |
| 1219 | ||
| 1220 | lemma DERIV_isconst_end: | |
| 1221 | fixes f :: "real => real" | |
| 1222 | shows "[| a < b; | |
| 1223 | \<forall>x. a \<le> x & x \<le> b --> isCont f x; | |
| 1224 | \<forall>x. a < x & x < b --> DERIV f x :> 0 |] | |
| 1225 | ==> f b = f a" | |
| 1226 | apply (drule MVT, assumption) | |
| 1227 | apply (blast intro: differentiableI) | |
| 1228 | apply (auto dest!: DERIV_unique simp add: diff_eq_eq) | |
| 1229 | done | |
| 1230 | ||
| 1231 | lemma DERIV_isconst1: | |
| 1232 | fixes f :: "real => real" | |
| 1233 | shows "[| a < b; | |
| 1234 | \<forall>x. a \<le> x & x \<le> b --> isCont f x; | |
| 1235 | \<forall>x. a < x & x < b --> DERIV f x :> 0 |] | |
| 1236 | ==> \<forall>x. a \<le> x & x \<le> b --> f x = f a" | |
| 1237 | apply safe | |
| 1238 | apply (drule_tac x = a in order_le_imp_less_or_eq, safe) | |
| 1239 | apply (drule_tac b = x in DERIV_isconst_end, auto) | |
| 1240 | done | |
| 1241 | ||
| 1242 | lemma DERIV_isconst2: | |
| 1243 | fixes f :: "real => real" | |
| 1244 | shows "[| a < b; | |
| 1245 | \<forall>x. a \<le> x & x \<le> b --> isCont f x; | |
| 1246 | \<forall>x. a < x & x < b --> DERIV f x :> 0; | |
| 1247 | a \<le> x; x \<le> b |] | |
| 1248 | ==> f x = f a" | |
| 1249 | apply (blast dest: DERIV_isconst1) | |
| 1250 | done | |
| 1251 | ||
| 29803 
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
 hoelzl parents: 
29667diff
changeset | 1252 | lemma DERIV_isconst3: fixes a b x y :: real | 
| 
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
 hoelzl parents: 
29667diff
changeset | 1253 |   assumes "a < b" and "x \<in> {a <..< b}" and "y \<in> {a <..< b}"
 | 
| 
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
 hoelzl parents: 
29667diff
changeset | 1254 |   assumes derivable: "\<And>x. x \<in> {a <..< b} \<Longrightarrow> DERIV f x :> 0"
 | 
| 
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
 hoelzl parents: 
29667diff
changeset | 1255 | shows "f x = f y" | 
| 
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
 hoelzl parents: 
29667diff
changeset | 1256 | proof (cases "x = y") | 
| 
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
 hoelzl parents: 
29667diff
changeset | 1257 | case False | 
| 
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
 hoelzl parents: 
29667diff
changeset | 1258 | let ?a = "min x y" | 
| 
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
 hoelzl parents: 
29667diff
changeset | 1259 | let ?b = "max x y" | 
| 
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
 hoelzl parents: 
29667diff
changeset | 1260 | |
| 
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
 hoelzl parents: 
29667diff
changeset | 1261 | have "\<forall>z. ?a \<le> z \<and> z \<le> ?b \<longrightarrow> DERIV f z :> 0" | 
| 
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
 hoelzl parents: 
29667diff
changeset | 1262 | proof (rule allI, rule impI) | 
| 
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
 hoelzl parents: 
29667diff
changeset | 1263 | fix z :: real assume "?a \<le> z \<and> z \<le> ?b" | 
| 
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
 hoelzl parents: 
29667diff
changeset | 1264 |     hence "a < z" and "z < b" using `x \<in> {a <..< b}` and `y \<in> {a <..< b}` by auto
 | 
| 
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
 hoelzl parents: 
29667diff
changeset | 1265 |     hence "z \<in> {a<..<b}" by auto
 | 
| 
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
 hoelzl parents: 
29667diff
changeset | 1266 | thus "DERIV f z :> 0" by (rule derivable) | 
| 
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
 hoelzl parents: 
29667diff
changeset | 1267 | qed | 
| 
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
 hoelzl parents: 
29667diff
changeset | 1268 | hence isCont: "\<forall>z. ?a \<le> z \<and> z \<le> ?b \<longrightarrow> isCont f z" | 
| 
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
 hoelzl parents: 
29667diff
changeset | 1269 | and DERIV: "\<forall>z. ?a < z \<and> z < ?b \<longrightarrow> DERIV f z :> 0" using DERIV_isCont by auto | 
| 
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
 hoelzl parents: 
29667diff
changeset | 1270 | |
| 
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
 hoelzl parents: 
29667diff
changeset | 1271 | have "?a < ?b" using `x \<noteq> y` by auto | 
| 
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
 hoelzl parents: 
29667diff
changeset | 1272 | from DERIV_isconst2[OF this isCont DERIV, of x] and DERIV_isconst2[OF this isCont DERIV, of y] | 
| 
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
 hoelzl parents: 
29667diff
changeset | 1273 | show ?thesis by auto | 
| 
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
 hoelzl parents: 
29667diff
changeset | 1274 | qed auto | 
| 
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
 hoelzl parents: 
29667diff
changeset | 1275 | |
| 21164 | 1276 | lemma DERIV_isconst_all: | 
| 1277 | fixes f :: "real => real" | |
| 1278 | shows "\<forall>x. DERIV f x :> 0 ==> f(x) = f(y)" | |
| 1279 | apply (rule linorder_cases [of x y]) | |
| 1280 | apply (blast intro: sym DERIV_isCont DERIV_isconst_end)+ | |
| 1281 | done | |
| 1282 | ||
| 1283 | lemma DERIV_const_ratio_const: | |
| 21784 
e76faa6e65fd
changed (ns)deriv to take functions of type 'a::real_normed_field => 'a
 huffman parents: 
21404diff
changeset | 1284 | fixes f :: "real => real" | 
| 
e76faa6e65fd
changed (ns)deriv to take functions of type 'a::real_normed_field => 'a
 huffman parents: 
21404diff
changeset | 1285 | shows "[|a \<noteq> b; \<forall>x. DERIV f x :> k |] ==> (f(b) - f(a)) = (b-a) * k" | 
| 21164 | 1286 | apply (rule linorder_cases [of a b], auto) | 
| 1287 | apply (drule_tac [!] f = f in MVT) | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 1288 | apply (auto dest: DERIV_isCont DERIV_unique simp add: real_differentiable_def) | 
| 54230 
b1d955791529
more simplification rules on unary and binary minus
 haftmann parents: 
53381diff
changeset | 1289 | apply (auto dest: DERIV_unique simp add: ring_distribs) | 
| 21164 | 1290 | done | 
| 1291 | ||
| 1292 | lemma DERIV_const_ratio_const2: | |
| 21784 
e76faa6e65fd
changed (ns)deriv to take functions of type 'a::real_normed_field => 'a
 huffman parents: 
21404diff
changeset | 1293 | fixes f :: "real => real" | 
| 
e76faa6e65fd
changed (ns)deriv to take functions of type 'a::real_normed_field => 'a
 huffman parents: 
21404diff
changeset | 1294 | shows "[|a \<noteq> b; \<forall>x. DERIV f x :> k |] ==> (f(b) - f(a))/(b-a) = k" | 
| 56217 
dc429a5b13c4
Some rationalisation of basic lemmas
 paulson <lp15@cam.ac.uk> parents: 
56182diff
changeset | 1295 | apply (rule_tac c1 = "b-a" in mult_right_cancel [THEN iffD1]) | 
| 57512 
cc97b347b301
reduced name variants for assoc and commute on plus and mult
 haftmann parents: 
57418diff
changeset | 1296 | apply (auto dest!: DERIV_const_ratio_const simp add: mult.assoc) | 
| 21164 | 1297 | done | 
| 1298 | ||
| 1299 | lemma real_average_minus_first [simp]: "((a + b) /2 - a) = (b-a)/(2::real)" | |
| 1300 | by (simp) | |
| 1301 | ||
| 1302 | lemma real_average_minus_second [simp]: "((b + a)/2 - a) = (b-a)/(2::real)" | |
| 1303 | by (simp) | |
| 1304 | ||
| 1305 | text{*Gallileo's "trick": average velocity = av. of end velocities*}
 | |
| 1306 | ||
| 1307 | lemma DERIV_const_average: | |
| 1308 | fixes v :: "real => real" | |
| 1309 | assumes neq: "a \<noteq> (b::real)" | |
| 1310 | and der: "\<forall>x. DERIV v x :> k" | |
| 1311 | shows "v ((a + b)/2) = (v a + v b)/2" | |
| 1312 | proof (cases rule: linorder_cases [of a b]) | |
| 1313 | case equal with neq show ?thesis by simp | |
| 1314 | next | |
| 1315 | case less | |
| 1316 | have "(v b - v a) / (b - a) = k" | |
| 1317 | by (rule DERIV_const_ratio_const2 [OF neq der]) | |
| 1318 | hence "(b-a) * ((v b - v a) / (b-a)) = (b-a) * k" by simp | |
| 1319 | moreover have "(v ((a + b) / 2) - v a) / ((a + b) / 2 - a) = k" | |
| 1320 | by (rule DERIV_const_ratio_const2 [OF _ der], simp add: neq) | |
| 1321 | ultimately show ?thesis using neq by force | |
| 1322 | next | |
| 1323 | case greater | |
| 1324 | have "(v b - v a) / (b - a) = k" | |
| 1325 | by (rule DERIV_const_ratio_const2 [OF neq der]) | |
| 1326 | hence "(b-a) * ((v b - v a) / (b-a)) = (b-a) * k" by simp | |
| 1327 | moreover have " (v ((b + a) / 2) - v a) / ((b + a) / 2 - a) = k" | |
| 1328 | by (rule DERIV_const_ratio_const2 [OF _ der], simp add: neq) | |
| 57512 
cc97b347b301
reduced name variants for assoc and commute on plus and mult
 haftmann parents: 
57418diff
changeset | 1329 | ultimately show ?thesis using neq by (force simp add: add.commute) | 
| 21164 | 1330 | qed | 
| 1331 | ||
| 33654 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1332 | (* A function with positive derivative is increasing. | 
| 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1333 | A simple proof using the MVT, by Jeremy Avigad. And variants. | 
| 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1334 | *) | 
| 56261 | 1335 | lemma DERIV_pos_imp_increasing_open: | 
| 33654 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1336 | fixes a::real and b::real and f::"real => real" | 
| 56261 | 1337 | assumes "a < b" and "\<And>x. a < x \<Longrightarrow> x < b \<Longrightarrow> (EX y. DERIV f x :> y & y > 0)" | 
| 1338 | and con: "\<And>x. a \<le> x \<Longrightarrow> x \<le> b \<Longrightarrow> isCont f x" | |
| 33654 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1339 | shows "f a < f b" | 
| 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1340 | proof (rule ccontr) | 
| 41550 | 1341 | assume f: "~ f a < f b" | 
| 33690 | 1342 | have "EX l z. a < z & z < b & DERIV f z :> l | 
| 33654 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1343 | & f b - f a = (b - a) * l" | 
| 33690 | 1344 | apply (rule MVT) | 
| 56261 | 1345 | using assms Deriv.differentiableI | 
| 1346 | apply force+ | |
| 33690 | 1347 | done | 
| 41550 | 1348 | then obtain l z where z: "a < z" "z < b" "DERIV f z :> l" | 
| 33654 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1349 | and "f b - f a = (b - a) * l" | 
| 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1350 | by auto | 
| 41550 | 1351 | with assms f have "~(l > 0)" | 
| 36777 
be5461582d0f
avoid using real-specific versions of generic lemmas
 huffman parents: 
35216diff
changeset | 1352 | by (metis linorder_not_le mult_le_0_iff diff_le_0_iff_le) | 
| 41550 | 1353 | with assms z show False | 
| 56261 | 1354 | by (metis DERIV_unique) | 
| 33654 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1355 | qed | 
| 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1356 | |
| 56261 | 1357 | lemma DERIV_pos_imp_increasing: | 
| 1358 | fixes a::real and b::real and f::"real => real" | |
| 1359 | assumes "a < b" and "\<forall>x. a \<le> x & x \<le> b --> (EX y. DERIV f x :> y & y > 0)" | |
| 1360 | shows "f a < f b" | |
| 1361 | by (metis DERIV_pos_imp_increasing_open [of a b f] assms DERIV_continuous less_imp_le) | |
| 1362 | ||
| 45791 | 1363 | lemma DERIV_nonneg_imp_nondecreasing: | 
| 33654 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1364 | fixes a::real and b::real and f::"real => real" | 
| 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1365 | assumes "a \<le> b" and | 
| 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1366 | "\<forall>x. a \<le> x & x \<le> b --> (\<exists>y. DERIV f x :> y & y \<ge> 0)" | 
| 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1367 | shows "f a \<le> f b" | 
| 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1368 | proof (rule ccontr, cases "a = b") | 
| 41550 | 1369 | assume "~ f a \<le> f b" and "a = b" | 
| 1370 | then show False by auto | |
| 37891 | 1371 | next | 
| 1372 | assume A: "~ f a \<le> f b" | |
| 1373 | assume B: "a ~= b" | |
| 33654 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1374 | with assms have "EX l z. a < z & z < b & DERIV f z :> l | 
| 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1375 | & f b - f a = (b - a) * l" | 
| 33690 | 1376 | apply - | 
| 1377 | apply (rule MVT) | |
| 1378 | apply auto | |
| 1379 | apply (metis DERIV_isCont) | |
| 36777 
be5461582d0f
avoid using real-specific versions of generic lemmas
 huffman parents: 
35216diff
changeset | 1380 | apply (metis differentiableI less_le) | 
| 33654 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1381 | done | 
| 41550 | 1382 | then obtain l z where z: "a < z" "z < b" "DERIV f z :> l" | 
| 37891 | 1383 | and C: "f b - f a = (b - a) * l" | 
| 33654 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1384 | by auto | 
| 37891 | 1385 | with A have "a < b" "f b < f a" by auto | 
| 1386 | with C have "\<not> l \<ge> 0" by (auto simp add: not_le algebra_simps) | |
| 45051 
c478d1876371
discontinued legacy theorem names from RealDef.thy
 huffman parents: 
44921diff
changeset | 1387 | (metis A add_le_cancel_right assms(1) less_eq_real_def mult_right_mono add_left_mono linear order_refl) | 
| 41550 | 1388 | with assms z show False | 
| 33654 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1389 | by (metis DERIV_unique order_less_imp_le) | 
| 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1390 | qed | 
| 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1391 | |
| 56261 | 1392 | lemma DERIV_neg_imp_decreasing_open: | 
| 1393 | fixes a::real and b::real and f::"real => real" | |
| 1394 | assumes "a < b" and "\<And>x. a < x \<Longrightarrow> x < b \<Longrightarrow> (EX y. DERIV f x :> y & y < 0)" | |
| 1395 | and con: "\<And>x. a \<le> x \<Longrightarrow> x \<le> b \<Longrightarrow> isCont f x" | |
| 1396 | shows "f a > f b" | |
| 1397 | proof - | |
| 1398 | have "(%x. -f x) a < (%x. -f x) b" | |
| 1399 | apply (rule DERIV_pos_imp_increasing_open [of a b "%x. -f x"]) | |
| 1400 | using assms | |
| 1401 | apply auto | |
| 1402 | apply (metis field_differentiable_minus neg_0_less_iff_less) | |
| 1403 | done | |
| 1404 | thus ?thesis | |
| 1405 | by simp | |
| 1406 | qed | |
| 1407 | ||
| 33654 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1408 | lemma DERIV_neg_imp_decreasing: | 
| 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1409 | fixes a::real and b::real and f::"real => real" | 
| 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1410 | assumes "a < b" and | 
| 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1411 | "\<forall>x. a \<le> x & x \<le> b --> (\<exists>y. DERIV f x :> y & y < 0)" | 
| 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1412 | shows "f a > f b" | 
| 56261 | 1413 | by (metis DERIV_neg_imp_decreasing_open [of a b f] assms DERIV_continuous less_imp_le) | 
| 33654 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1414 | |
| 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1415 | lemma DERIV_nonpos_imp_nonincreasing: | 
| 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1416 | fixes a::real and b::real and f::"real => real" | 
| 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1417 | assumes "a \<le> b" and | 
| 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1418 | "\<forall>x. a \<le> x & x \<le> b --> (\<exists>y. DERIV f x :> y & y \<le> 0)" | 
| 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1419 | shows "f a \<ge> f b" | 
| 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1420 | proof - | 
| 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1421 | have "(%x. -f x) a \<le> (%x. -f x) b" | 
| 45791 | 1422 | apply (rule DERIV_nonneg_imp_nondecreasing [of a b "%x. -f x"]) | 
| 33690 | 1423 | using assms | 
| 1424 | apply auto | |
| 33654 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1425 | apply (metis DERIV_minus neg_0_le_iff_le) | 
| 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1426 | done | 
| 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1427 | thus ?thesis | 
| 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1428 | by simp | 
| 
abf780db30ea
A number of theorems contributed by Jeremy Avigad
 paulson parents: 
31902diff
changeset | 1429 | qed | 
| 21164 | 1430 | |
| 56289 | 1431 | lemma DERIV_pos_imp_increasing_at_bot: | 
| 1432 | fixes f :: "real => real" | |
| 1433 | assumes "\<And>x. x \<le> b \<Longrightarrow> (EX y. DERIV f x :> y & y > 0)" | |
| 1434 | and lim: "(f ---> flim) at_bot" | |
| 1435 | shows "flim < f b" | |
| 1436 | proof - | |
| 1437 | have "flim \<le> f (b - 1)" | |
| 1438 | apply (rule tendsto_ge_const [OF _ lim]) | |
| 1439 | apply (auto simp: trivial_limit_at_bot_linorder eventually_at_bot_linorder) | |
| 1440 | apply (rule_tac x="b - 2" in exI) | |
| 1441 | apply (force intro: order.strict_implies_order DERIV_pos_imp_increasing [where f=f] assms) | |
| 1442 | done | |
| 1443 | also have "... < f b" | |
| 1444 | by (force intro: DERIV_pos_imp_increasing [where f=f] assms) | |
| 1445 | finally show ?thesis . | |
| 1446 | qed | |
| 1447 | ||
| 1448 | lemma DERIV_neg_imp_decreasing_at_top: | |
| 1449 | fixes f :: "real => real" | |
| 1450 | assumes der: "\<And>x. x \<ge> b \<Longrightarrow> (EX y. DERIV f x :> y & y < 0)" | |
| 1451 | and lim: "(f ---> flim) at_top" | |
| 1452 | shows "flim < f b" | |
| 1453 | apply (rule DERIV_pos_imp_increasing_at_bot [where f = "\<lambda>i. f (-i)" and b = "-b", simplified]) | |
| 1454 | apply (metis DERIV_mirror der le_minus_iff neg_0_less_iff_less) | |
| 1455 | apply (metis filterlim_at_top_mirror lim) | |
| 1456 | done | |
| 1457 | ||
| 23041 | 1458 | text {* Derivative of inverse function *}
 | 
| 1459 | ||
| 1460 | lemma DERIV_inverse_function: | |
| 1461 | fixes f g :: "real \<Rightarrow> real" | |
| 1462 | assumes der: "DERIV f (g x) :> D" | |
| 1463 | assumes neq: "D \<noteq> 0" | |
| 23044 | 1464 | assumes a: "a < x" and b: "x < b" | 
| 1465 | assumes inj: "\<forall>y. a < y \<and> y < b \<longrightarrow> f (g y) = y" | |
| 23041 | 1466 | assumes cont: "isCont g x" | 
| 1467 | shows "DERIV g x :> inverse D" | |
| 1468 | unfolding DERIV_iff2 | |
| 23044 | 1469 | proof (rule LIM_equal2) | 
| 1470 | show "0 < min (x - a) (b - x)" | |
| 27668 | 1471 | using a b by arith | 
| 23044 | 1472 | next | 
| 23041 | 1473 | fix y | 
| 23044 | 1474 | assume "norm (y - x) < min (x - a) (b - x)" | 
| 27668 | 1475 | hence "a < y" and "y < b" | 
| 23044 | 1476 | by (simp_all add: abs_less_iff) | 
| 23041 | 1477 | thus "(g y - g x) / (y - x) = | 
| 1478 | inverse ((f (g y) - x) / (g y - g x))" | |
| 1479 | by (simp add: inj) | |
| 1480 | next | |
| 1481 | have "(\<lambda>z. (f z - f (g x)) / (z - g x)) -- g x --> D" | |
| 1482 | by (rule der [unfolded DERIV_iff2]) | |
| 1483 | hence 1: "(\<lambda>z. (f z - x) / (z - g x)) -- g x --> D" | |
| 23044 | 1484 | using inj a b by simp | 
| 23041 | 1485 | have 2: "\<exists>d>0. \<forall>y. y \<noteq> x \<and> norm (y - x) < d \<longrightarrow> g y \<noteq> g x" | 
| 56219 | 1486 | proof (rule exI, safe) | 
| 23044 | 1487 | show "0 < min (x - a) (b - x)" | 
| 1488 | using a b by simp | |
| 23041 | 1489 | next | 
| 1490 | fix y | |
| 23044 | 1491 | assume "norm (y - x) < min (x - a) (b - x)" | 
| 1492 | hence y: "a < y" "y < b" | |
| 1493 | by (simp_all add: abs_less_iff) | |
| 23041 | 1494 | assume "g y = g x" | 
| 1495 | hence "f (g y) = f (g x)" by simp | |
| 23044 | 1496 | hence "y = x" using inj y a b by simp | 
| 23041 | 1497 | also assume "y \<noteq> x" | 
| 1498 | finally show False by simp | |
| 1499 | qed | |
| 1500 | have "(\<lambda>y. (f (g y) - x) / (g y - g x)) -- x --> D" | |
| 1501 | using cont 1 2 by (rule isCont_LIM_compose2) | |
| 1502 | thus "(\<lambda>y. inverse ((f (g y) - x) / (g y - g x))) | |
| 1503 | -- x --> inverse D" | |
| 44568 
e6f291cb5810
discontinue many legacy theorems about LIM and LIMSEQ, in favor of tendsto theorems
 huffman parents: 
44317diff
changeset | 1504 | using neq by (rule tendsto_inverse) | 
| 23041 | 1505 | qed | 
| 1506 | ||
| 29975 | 1507 | subsection {* Generalized Mean Value Theorem *}
 | 
| 1508 | ||
| 21164 | 1509 | theorem GMVT: | 
| 21784 
e76faa6e65fd
changed (ns)deriv to take functions of type 'a::real_normed_field => 'a
 huffman parents: 
21404diff
changeset | 1510 | fixes a b :: real | 
| 21164 | 1511 | assumes alb: "a < b" | 
| 41550 | 1512 | and fc: "\<forall>x. a \<le> x \<and> x \<le> b \<longrightarrow> isCont f x" | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 1513 | and fd: "\<forall>x. a < x \<and> x < b \<longrightarrow> f differentiable (at x)" | 
| 41550 | 1514 | and gc: "\<forall>x. a \<le> x \<and> x \<le> b \<longrightarrow> isCont g x" | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 1515 | and gd: "\<forall>x. a < x \<and> x < b \<longrightarrow> g differentiable (at x)" | 
| 53381 | 1516 | shows "\<exists>g'c f'c c. | 
| 1517 | DERIV g c :> g'c \<and> DERIV f c :> f'c \<and> a < c \<and> c < b \<and> ((f b - f a) * g'c) = ((g b - g a) * f'c)" | |
| 21164 | 1518 | proof - | 
| 1519 | let ?h = "\<lambda>x. (f b - f a)*(g x) - (g b - g a)*(f x)" | |
| 41550 | 1520 | from assms have "a < b" by simp | 
| 21164 | 1521 | moreover have "\<forall>x. a \<le> x \<and> x \<le> b \<longrightarrow> isCont ?h x" | 
| 44233 | 1522 | using fc gc by simp | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 1523 | moreover have "\<forall>x. a < x \<and> x < b \<longrightarrow> ?h differentiable (at x)" | 
| 44233 | 1524 | using fd gd by simp | 
| 21164 | 1525 | ultimately have "\<exists>l z. a < z \<and> z < b \<and> DERIV ?h z :> l \<and> ?h b - ?h a = (b - a) * l" by (rule MVT) | 
| 1526 | then obtain l where ldef: "\<exists>z. a < z \<and> z < b \<and> DERIV ?h z :> l \<and> ?h b - ?h a = (b - a) * l" .. | |
| 1527 | then obtain c where cdef: "a < c \<and> c < b \<and> DERIV ?h c :> l \<and> ?h b - ?h a = (b - a) * l" .. | |
| 1528 | ||
| 1529 | from cdef have cint: "a < c \<and> c < b" by auto | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 1530 | with gd have "g differentiable (at c)" by simp | 
| 21164 | 1531 | hence "\<exists>D. DERIV g c :> D" by (rule differentiableD) | 
| 1532 | then obtain g'c where g'cdef: "DERIV g c :> g'c" .. | |
| 1533 | ||
| 1534 | from cdef have "a < c \<and> c < b" by auto | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 1535 | with fd have "f differentiable (at c)" by simp | 
| 21164 | 1536 | hence "\<exists>D. DERIV f c :> D" by (rule differentiableD) | 
| 1537 | then obtain f'c where f'cdef: "DERIV f c :> f'c" .. | |
| 1538 | ||
| 1539 | from cdef have "DERIV ?h c :> l" by auto | |
| 41368 | 1540 | moreover have "DERIV ?h c :> g'c * (f b - f a) - f'c * (g b - g a)" | 
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 1541 | using g'cdef f'cdef by (auto intro!: derivative_eq_intros) | 
| 21164 | 1542 | ultimately have leq: "l = g'c * (f b - f a) - f'c * (g b - g a)" by (rule DERIV_unique) | 
| 1543 | ||
| 1544 |   {
 | |
| 1545 | from cdef have "?h b - ?h a = (b - a) * l" by auto | |
| 53374 
a14d2a854c02
tuned proofs -- clarified flow of facts wrt. calculation;
 wenzelm parents: 
51642diff
changeset | 1546 | also from leq have "\<dots> = (b - a) * (g'c * (f b - f a) - f'c * (g b - g a))" by simp | 
| 21164 | 1547 | finally have "?h b - ?h a = (b - a) * (g'c * (f b - f a) - f'c * (g b - g a))" by simp | 
| 1548 | } | |
| 1549 | moreover | |
| 1550 |   {
 | |
| 1551 | have "?h b - ?h a = | |
| 1552 | ((f b)*(g b) - (f a)*(g b) - (g b)*(f b) + (g a)*(f b)) - | |
| 1553 | ((f b)*(g a) - (f a)*(g a) - (g b)*(f a) + (g a)*(f a))" | |
| 29667 | 1554 | by (simp add: algebra_simps) | 
| 21164 | 1555 | hence "?h b - ?h a = 0" by auto | 
| 1556 | } | |
| 1557 | ultimately have "(b - a) * (g'c * (f b - f a) - f'c * (g b - g a)) = 0" by auto | |
| 1558 | with alb have "g'c * (f b - f a) - f'c * (g b - g a) = 0" by simp | |
| 1559 | hence "g'c * (f b - f a) = f'c * (g b - g a)" by simp | |
| 57514 
bdc2c6b40bf2
prefer ac_simps collections over separate name bindings for add and mult
 haftmann parents: 
57512diff
changeset | 1560 | hence "(f b - f a) * g'c = (g b - g a) * f'c" by (simp add: ac_simps) | 
| 21164 | 1561 | |
| 1562 | with g'cdef f'cdef cint show ?thesis by auto | |
| 1563 | qed | |
| 1564 | ||
| 50327 | 1565 | lemma GMVT': | 
| 1566 | fixes f g :: "real \<Rightarrow> real" | |
| 1567 | assumes "a < b" | |
| 1568 | assumes isCont_f: "\<And>z. a \<le> z \<Longrightarrow> z \<le> b \<Longrightarrow> isCont f z" | |
| 1569 | assumes isCont_g: "\<And>z. a \<le> z \<Longrightarrow> z \<le> b \<Longrightarrow> isCont g z" | |
| 1570 | assumes DERIV_g: "\<And>z. a < z \<Longrightarrow> z < b \<Longrightarrow> DERIV g z :> (g' z)" | |
| 1571 | assumes DERIV_f: "\<And>z. a < z \<Longrightarrow> z < b \<Longrightarrow> DERIV f z :> (f' z)" | |
| 1572 | shows "\<exists>c. a < c \<and> c < b \<and> (f b - f a) * g' c = (g b - g a) * f' c" | |
| 1573 | proof - | |
| 1574 | have "\<exists>g'c f'c c. DERIV g c :> g'c \<and> DERIV f c :> f'c \<and> | |
| 1575 | a < c \<and> c < b \<and> (f b - f a) * g'c = (g b - g a) * f'c" | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
55970diff
changeset | 1576 | using assms by (intro GMVT) (force simp: real_differentiable_def)+ | 
| 50327 | 1577 | then obtain c where "a < c" "c < b" "(f b - f a) * g' c = (g b - g a) * f' c" | 
| 1578 | using DERIV_f DERIV_g by (force dest: DERIV_unique) | |
| 1579 | then show ?thesis | |
| 1580 | by auto | |
| 1581 | qed | |
| 1582 | ||
| 51529 
2d2f59e6055a
move theorems about compactness of real closed intervals, the intermediate value theorem, and lemmas about continuity of bijective functions from Deriv.thy to Limits.thy
 hoelzl parents: 
51526diff
changeset | 1583 | |
| 
2d2f59e6055a
move theorems about compactness of real closed intervals, the intermediate value theorem, and lemmas about continuity of bijective functions from Deriv.thy to Limits.thy
 hoelzl parents: 
51526diff
changeset | 1584 | subsection {* L'Hopitals rule *}
 | 
| 
2d2f59e6055a
move theorems about compactness of real closed intervals, the intermediate value theorem, and lemmas about continuity of bijective functions from Deriv.thy to Limits.thy
 hoelzl parents: 
51526diff
changeset | 1585 | |
| 51641 
cd05e9fcc63d
remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
 hoelzl parents: 
51529diff
changeset | 1586 | lemma isCont_If_ge: | 
| 
cd05e9fcc63d
remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
 hoelzl parents: 
51529diff
changeset | 1587 | fixes a :: "'a :: linorder_topology" | 
| 
cd05e9fcc63d
remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
 hoelzl parents: 
51529diff
changeset | 1588 | shows "continuous (at_left a) g \<Longrightarrow> (f ---> g a) (at_right a) \<Longrightarrow> isCont (\<lambda>x. if x \<le> a then g x else f x) a" | 
| 
cd05e9fcc63d
remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
 hoelzl parents: 
51529diff
changeset | 1589 | unfolding isCont_def continuous_within | 
| 
cd05e9fcc63d
remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
 hoelzl parents: 
51529diff
changeset | 1590 | apply (intro filterlim_split_at) | 
| 
cd05e9fcc63d
remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
 hoelzl parents: 
51529diff
changeset | 1591 | apply (subst filterlim_cong[OF refl refl, where g=g]) | 
| 
cd05e9fcc63d
remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
 hoelzl parents: 
51529diff
changeset | 1592 | apply (simp_all add: eventually_at_filter less_le) | 
| 
cd05e9fcc63d
remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
 hoelzl parents: 
51529diff
changeset | 1593 | apply (subst filterlim_cong[OF refl refl, where g=f]) | 
| 
cd05e9fcc63d
remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
 hoelzl parents: 
51529diff
changeset | 1594 | apply (simp_all add: eventually_at_filter less_le) | 
| 
cd05e9fcc63d
remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
 hoelzl parents: 
51529diff
changeset | 1595 | done | 
| 
cd05e9fcc63d
remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
 hoelzl parents: 
51529diff
changeset | 1596 | |
| 50327 | 1597 | lemma lhopital_right_0: | 
| 50329 | 1598 | fixes f0 g0 :: "real \<Rightarrow> real" | 
| 1599 | assumes f_0: "(f0 ---> 0) (at_right 0)" | |
| 1600 | assumes g_0: "(g0 ---> 0) (at_right 0)" | |
| 50327 | 1601 | assumes ev: | 
| 50329 | 1602 | "eventually (\<lambda>x. g0 x \<noteq> 0) (at_right 0)" | 
| 50327 | 1603 | "eventually (\<lambda>x. g' x \<noteq> 0) (at_right 0)" | 
| 50329 | 1604 | "eventually (\<lambda>x. DERIV f0 x :> f' x) (at_right 0)" | 
| 1605 | "eventually (\<lambda>x. DERIV g0 x :> g' x) (at_right 0)" | |
| 50327 | 1606 | assumes lim: "((\<lambda> x. (f' x / g' x)) ---> x) (at_right 0)" | 
| 50329 | 1607 | shows "((\<lambda> x. f0 x / g0 x) ---> x) (at_right 0)" | 
| 50327 | 1608 | proof - | 
| 50329 | 1609 | def f \<equiv> "\<lambda>x. if x \<le> 0 then 0 else f0 x" | 
| 1610 | then have "f 0 = 0" by simp | |
| 1611 | ||
| 1612 | def g \<equiv> "\<lambda>x. if x \<le> 0 then 0 else g0 x" | |
| 1613 | then have "g 0 = 0" by simp | |
| 1614 | ||
| 1615 | have "eventually (\<lambda>x. g0 x \<noteq> 0 \<and> g' x \<noteq> 0 \<and> | |
| 1616 | DERIV f0 x :> (f' x) \<and> DERIV g0 x :> (g' x)) (at_right 0)" | |
| 1617 | using ev by eventually_elim auto | |
| 1618 | then obtain a where [arith]: "0 < a" | |
| 1619 | and g0_neq_0: "\<And>x. 0 < x \<Longrightarrow> x < a \<Longrightarrow> g0 x \<noteq> 0" | |
| 50327 | 1620 | and g'_neq_0: "\<And>x. 0 < x \<Longrightarrow> x < a \<Longrightarrow> g' x \<noteq> 0" | 
| 50329 | 1621 | and f0: "\<And>x. 0 < x \<Longrightarrow> x < a \<Longrightarrow> DERIV f0 x :> (f' x)" | 
| 1622 | and g0: "\<And>x. 0 < x \<Longrightarrow> x < a \<Longrightarrow> DERIV g0 x :> (g' x)" | |
| 56219 | 1623 | unfolding eventually_at by (auto simp: dist_real_def) | 
| 50327 | 1624 | |
| 50329 | 1625 | have g_neq_0: "\<And>x. 0 < x \<Longrightarrow> x < a \<Longrightarrow> g x \<noteq> 0" | 
| 1626 | using g0_neq_0 by (simp add: g_def) | |
| 1627 | ||
| 1628 |   { fix x assume x: "0 < x" "x < a" then have "DERIV f x :> (f' x)"
 | |
| 1629 | by (intro DERIV_cong_ev[THEN iffD1, OF _ _ _ f0[OF x]]) | |
| 1630 | (auto simp: f_def eventually_nhds_metric dist_real_def intro!: exI[of _ x]) } | |
| 1631 | note f = this | |
| 1632 | ||
| 1633 |   { fix x assume x: "0 < x" "x < a" then have "DERIV g x :> (g' x)"
 | |
| 1634 | by (intro DERIV_cong_ev[THEN iffD1, OF _ _ _ g0[OF x]]) | |
| 1635 | (auto simp: g_def eventually_nhds_metric dist_real_def intro!: exI[of _ x]) } | |
| 1636 | note g = this | |
| 1637 | ||
| 1638 | have "isCont f 0" | |
| 51641 
cd05e9fcc63d
remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
 hoelzl parents: 
51529diff
changeset | 1639 | unfolding f_def by (intro isCont_If_ge f_0 continuous_const) | 
| 
cd05e9fcc63d
remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
 hoelzl parents: 
51529diff
changeset | 1640 | |
| 50329 | 1641 | have "isCont g 0" | 
| 51641 
cd05e9fcc63d
remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
 hoelzl parents: 
51529diff
changeset | 1642 | unfolding g_def by (intro isCont_If_ge g_0 continuous_const) | 
| 50329 | 1643 | |
| 50327 | 1644 |   have "\<exists>\<zeta>. \<forall>x\<in>{0 <..< a}. 0 < \<zeta> x \<and> \<zeta> x < x \<and> f x / g x = f' (\<zeta> x) / g' (\<zeta> x)"
 | 
| 1645 | proof (rule bchoice, rule) | |
| 1646 |     fix x assume "x \<in> {0 <..< a}"
 | |
| 1647 | then have x[arith]: "0 < x" "x < a" by auto | |
| 1648 | with g'_neq_0 g_neq_0 `g 0 = 0` have g': "\<And>x. 0 < x \<Longrightarrow> x < a \<Longrightarrow> 0 \<noteq> g' x" "g 0 \<noteq> g x" | |
| 1649 | by auto | |
| 50328 | 1650 | have "\<And>x. 0 \<le> x \<Longrightarrow> x < a \<Longrightarrow> isCont f x" | 
| 1651 | using `isCont f 0` f by (auto intro: DERIV_isCont simp: le_less) | |
| 1652 | moreover have "\<And>x. 0 \<le> x \<Longrightarrow> x < a \<Longrightarrow> isCont g x" | |
| 1653 | using `isCont g 0` g by (auto intro: DERIV_isCont simp: le_less) | |
| 1654 | ultimately have "\<exists>c. 0 < c \<and> c < x \<and> (f x - f 0) * g' c = (g x - g 0) * f' c" | |
| 1655 | using f g `x < a` by (intro GMVT') auto | |
| 53374 
a14d2a854c02
tuned proofs -- clarified flow of facts wrt. calculation;
 wenzelm parents: 
51642diff
changeset | 1656 | then obtain c where *: "0 < c" "c < x" "(f x - f 0) * g' c = (g x - g 0) * f' c" | 
| 
a14d2a854c02
tuned proofs -- clarified flow of facts wrt. calculation;
 wenzelm parents: 
51642diff
changeset | 1657 | by blast | 
| 50327 | 1658 | moreover | 
| 53374 
a14d2a854c02
tuned proofs -- clarified flow of facts wrt. calculation;
 wenzelm parents: 
51642diff
changeset | 1659 | from * g'(1)[of c] g'(2) have "(f x - f 0) / (g x - g 0) = f' c / g' c" | 
| 50327 | 1660 | by (simp add: field_simps) | 
| 1661 | ultimately show "\<exists>y. 0 < y \<and> y < x \<and> f x / g x = f' y / g' y" | |
| 1662 | using `f 0 = 0` `g 0 = 0` by (auto intro!: exI[of _ c]) | |
| 1663 | qed | |
| 53381 | 1664 |   then obtain \<zeta> where "\<forall>x\<in>{0 <..< a}. 0 < \<zeta> x \<and> \<zeta> x < x \<and> f x / g x = f' (\<zeta> x) / g' (\<zeta> x)" ..
 | 
| 50327 | 1665 | then have \<zeta>: "eventually (\<lambda>x. 0 < \<zeta> x \<and> \<zeta> x < x \<and> f x / g x = f' (\<zeta> x) / g' (\<zeta> x)) (at_right 0)" | 
| 51641 
cd05e9fcc63d
remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
 hoelzl parents: 
51529diff
changeset | 1666 | unfolding eventually_at by (intro exI[of _ a]) (auto simp: dist_real_def) | 
| 50327 | 1667 | moreover | 
| 1668 | from \<zeta> have "eventually (\<lambda>x. norm (\<zeta> x) \<le> x) (at_right 0)" | |
| 1669 | by eventually_elim auto | |
| 1670 | then have "((\<lambda>x. norm (\<zeta> x)) ---> 0) (at_right 0)" | |
| 58729 
e8ecc79aee43
add tendsto_const and tendsto_ident_at as simp and intro rules
 hoelzl parents: 
57953diff
changeset | 1671 | by (rule_tac real_tendsto_sandwich[where f="\<lambda>x. 0" and h="\<lambda>x. x"]) auto | 
| 50327 | 1672 | then have "(\<zeta> ---> 0) (at_right 0)" | 
| 1673 | by (rule tendsto_norm_zero_cancel) | |
| 1674 | with \<zeta> have "filterlim \<zeta> (at_right 0) (at_right 0)" | |
| 51641 
cd05e9fcc63d
remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
 hoelzl parents: 
51529diff
changeset | 1675 | by (auto elim!: eventually_elim1 simp: filterlim_at) | 
| 50327 | 1676 | from this lim have "((\<lambda>t. f' (\<zeta> t) / g' (\<zeta> t)) ---> x) (at_right 0)" | 
| 1677 | by (rule_tac filterlim_compose[of _ _ _ \<zeta>]) | |
| 50329 | 1678 | ultimately have "((\<lambda>t. f t / g t) ---> x) (at_right 0)" (is ?P) | 
| 50328 | 1679 | by (rule_tac filterlim_cong[THEN iffD1, OF refl refl]) | 
| 1680 | (auto elim: eventually_elim1) | |
| 50329 | 1681 | also have "?P \<longleftrightarrow> ?thesis" | 
| 51641 
cd05e9fcc63d
remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
 hoelzl parents: 
51529diff
changeset | 1682 | by (rule filterlim_cong) (auto simp: f_def g_def eventually_at_filter) | 
| 50329 | 1683 | finally show ?thesis . | 
| 50327 | 1684 | qed | 
| 1685 | ||
| 50330 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1686 | lemma lhopital_right: | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1687 | "((f::real \<Rightarrow> real) ---> 0) (at_right x) \<Longrightarrow> (g ---> 0) (at_right x) \<Longrightarrow> | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1688 | eventually (\<lambda>x. g x \<noteq> 0) (at_right x) \<Longrightarrow> | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1689 | eventually (\<lambda>x. g' x \<noteq> 0) (at_right x) \<Longrightarrow> | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1690 | eventually (\<lambda>x. DERIV f x :> f' x) (at_right x) \<Longrightarrow> | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1691 | eventually (\<lambda>x. DERIV g x :> g' x) (at_right x) \<Longrightarrow> | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1692 | ((\<lambda> x. (f' x / g' x)) ---> y) (at_right x) \<Longrightarrow> | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1693 | ((\<lambda> x. f x / g x) ---> y) (at_right x)" | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1694 | unfolding eventually_at_right_to_0[of _ x] filterlim_at_right_to_0[of _ _ x] DERIV_shift | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1695 | by (rule lhopital_right_0) | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1696 | |
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1697 | lemma lhopital_left: | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1698 | "((f::real \<Rightarrow> real) ---> 0) (at_left x) \<Longrightarrow> (g ---> 0) (at_left x) \<Longrightarrow> | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1699 | eventually (\<lambda>x. g x \<noteq> 0) (at_left x) \<Longrightarrow> | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1700 | eventually (\<lambda>x. g' x \<noteq> 0) (at_left x) \<Longrightarrow> | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1701 | eventually (\<lambda>x. DERIV f x :> f' x) (at_left x) \<Longrightarrow> | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1702 | eventually (\<lambda>x. DERIV g x :> g' x) (at_left x) \<Longrightarrow> | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1703 | ((\<lambda> x. (f' x / g' x)) ---> y) (at_left x) \<Longrightarrow> | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1704 | ((\<lambda> x. f x / g x) ---> y) (at_left x)" | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1705 | unfolding eventually_at_left_to_right filterlim_at_left_to_right DERIV_mirror | 
| 56479 
91958d4b30f7
revert c1bbd3e22226, a14831ac3023, and 36489d77c484: divide_minus_left/right are again simp rules
 hoelzl parents: 
56409diff
changeset | 1706 | by (rule lhopital_right[where f'="\<lambda>x. - f' (- x)"]) (auto simp: DERIV_mirror) | 
| 50330 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1707 | |
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1708 | lemma lhopital: | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1709 | "((f::real \<Rightarrow> real) ---> 0) (at x) \<Longrightarrow> (g ---> 0) (at x) \<Longrightarrow> | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1710 | eventually (\<lambda>x. g x \<noteq> 0) (at x) \<Longrightarrow> | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1711 | eventually (\<lambda>x. g' x \<noteq> 0) (at x) \<Longrightarrow> | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1712 | eventually (\<lambda>x. DERIV f x :> f' x) (at x) \<Longrightarrow> | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1713 | eventually (\<lambda>x. DERIV g x :> g' x) (at x) \<Longrightarrow> | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1714 | ((\<lambda> x. (f' x / g' x)) ---> y) (at x) \<Longrightarrow> | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1715 | ((\<lambda> x. f x / g x) ---> y) (at x)" | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1716 | unfolding eventually_at_split filterlim_at_split | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1717 | by (auto intro!: lhopital_right[of f x g g' f'] lhopital_left[of f x g g' f']) | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1718 | |
| 50327 | 1719 | lemma lhopital_right_0_at_top: | 
| 1720 | fixes f g :: "real \<Rightarrow> real" | |
| 1721 | assumes g_0: "LIM x at_right 0. g x :> at_top" | |
| 1722 | assumes ev: | |
| 1723 | "eventually (\<lambda>x. g' x \<noteq> 0) (at_right 0)" | |
| 1724 | "eventually (\<lambda>x. DERIV f x :> f' x) (at_right 0)" | |
| 1725 | "eventually (\<lambda>x. DERIV g x :> g' x) (at_right 0)" | |
| 1726 | assumes lim: "((\<lambda> x. (f' x / g' x)) ---> x) (at_right 0)" | |
| 1727 | shows "((\<lambda> x. f x / g x) ---> x) (at_right 0)" | |
| 1728 | unfolding tendsto_iff | |
| 1729 | proof safe | |
| 1730 | fix e :: real assume "0 < e" | |
| 1731 | ||
| 1732 | with lim[unfolded tendsto_iff, rule_format, of "e / 4"] | |
| 1733 | have "eventually (\<lambda>t. dist (f' t / g' t) x < e / 4) (at_right 0)" by simp | |
| 1734 | from eventually_conj[OF eventually_conj[OF ev(1) ev(2)] eventually_conj[OF ev(3) this]] | |
| 1735 | obtain a where [arith]: "0 < a" | |
| 1736 | and g'_neq_0: "\<And>x. 0 < x \<Longrightarrow> x < a \<Longrightarrow> g' x \<noteq> 0" | |
| 1737 | and f0: "\<And>x. 0 < x \<Longrightarrow> x \<le> a \<Longrightarrow> DERIV f x :> (f' x)" | |
| 1738 | and g0: "\<And>x. 0 < x \<Longrightarrow> x \<le> a \<Longrightarrow> DERIV g x :> (g' x)" | |
| 1739 | and Df: "\<And>t. 0 < t \<Longrightarrow> t < a \<Longrightarrow> dist (f' t / g' t) x < e / 4" | |
| 51641 
cd05e9fcc63d
remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
 hoelzl parents: 
51529diff
changeset | 1740 | unfolding eventually_at_le by (auto simp: dist_real_def) | 
| 
cd05e9fcc63d
remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
 hoelzl parents: 
51529diff
changeset | 1741 | |
| 50327 | 1742 | |
| 1743 | from Df have | |
| 50328 | 1744 | "eventually (\<lambda>t. t < a) (at_right 0)" "eventually (\<lambda>t::real. 0 < t) (at_right 0)" | 
| 51641 
cd05e9fcc63d
remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
 hoelzl parents: 
51529diff
changeset | 1745 | unfolding eventually_at by (auto intro!: exI[of _ a] simp: dist_real_def) | 
| 50327 | 1746 | |
| 1747 | moreover | |
| 50328 | 1748 | have "eventually (\<lambda>t. 0 < g t) (at_right 0)" "eventually (\<lambda>t. g a < g t) (at_right 0)" | 
| 50346 
a75c6429c3c3
add filterlim rules for eventually monotone bijective functions; mirror rules for at_top, at_bot; apply them to prove convergence of arctan at infinity and tan at pi/2
 hoelzl parents: 
50331diff
changeset | 1749 | using g_0 by (auto elim: eventually_elim1 simp: filterlim_at_top_dense) | 
| 50327 | 1750 | |
| 1751 | moreover | |
| 1752 | have inv_g: "((\<lambda>x. inverse (g x)) ---> 0) (at_right 0)" | |
| 1753 | using tendsto_inverse_0 filterlim_mono[OF g_0 at_top_le_at_infinity order_refl] | |
| 1754 | by (rule filterlim_compose) | |
| 1755 | then have "((\<lambda>x. norm (1 - g a * inverse (g x))) ---> norm (1 - g a * 0)) (at_right 0)" | |
| 1756 | by (intro tendsto_intros) | |
| 1757 | then have "((\<lambda>x. norm (1 - g a / g x)) ---> 1) (at_right 0)" | |
| 1758 | by (simp add: inverse_eq_divide) | |
| 1759 | from this[unfolded tendsto_iff, rule_format, of 1] | |
| 1760 | have "eventually (\<lambda>x. norm (1 - g a / g x) < 2) (at_right 0)" | |
| 1761 | by (auto elim!: eventually_elim1 simp: dist_real_def) | |
| 1762 | ||
| 1763 | moreover | |
| 1764 | from inv_g have "((\<lambda>t. norm ((f a - x * g a) * inverse (g t))) ---> norm ((f a - x * g a) * 0)) (at_right 0)" | |
| 1765 | by (intro tendsto_intros) | |
| 1766 | then have "((\<lambda>t. norm (f a - x * g a) / norm (g t)) ---> 0) (at_right 0)" | |
| 1767 | by (simp add: inverse_eq_divide) | |
| 1768 | from this[unfolded tendsto_iff, rule_format, of "e / 2"] `0 < e` | |
| 1769 | have "eventually (\<lambda>t. norm (f a - x * g a) / norm (g t) < e / 2) (at_right 0)" | |
| 1770 | by (auto simp: dist_real_def) | |
| 1771 | ||
| 1772 | ultimately show "eventually (\<lambda>t. dist (f t / g t) x < e) (at_right 0)" | |
| 1773 | proof eventually_elim | |
| 1774 | fix t assume t[arith]: "0 < t" "t < a" "g a < g t" "0 < g t" | |
| 1775 | assume ineq: "norm (1 - g a / g t) < 2" "norm (f a - x * g a) / norm (g t) < e / 2" | |
| 1776 | ||
| 1777 | have "\<exists>y. t < y \<and> y < a \<and> (g a - g t) * f' y = (f a - f t) * g' y" | |
| 1778 | using f0 g0 t(1,2) by (intro GMVT') (force intro!: DERIV_isCont)+ | |
| 53381 | 1779 | then obtain y where [arith]: "t < y" "y < a" | 
| 1780 | and D_eq0: "(g a - g t) * f' y = (f a - f t) * g' y" | |
| 1781 | by blast | |
| 1782 | from D_eq0 have D_eq: "(f t - f a) / (g t - g a) = f' y / g' y" | |
| 50327 | 1783 | using `g a < g t` g'_neq_0[of y] by (auto simp add: field_simps) | 
| 1784 | ||
| 1785 | have *: "f t / g t - x = ((f t - f a) / (g t - g a) - x) * (1 - g a / g t) + (f a - x * g a) / g t" | |
| 1786 | by (simp add: field_simps) | |
| 1787 | have "norm (f t / g t - x) \<le> | |
| 1788 | norm (((f t - f a) / (g t - g a) - x) * (1 - g a / g t)) + norm ((f a - x * g a) / g t)" | |
| 1789 | unfolding * by (rule norm_triangle_ineq) | |
| 1790 | also have "\<dots> = dist (f' y / g' y) x * norm (1 - g a / g t) + norm (f a - x * g a) / norm (g t)" | |
| 1791 | by (simp add: abs_mult D_eq dist_real_def) | |
| 1792 | also have "\<dots> < (e / 4) * 2 + e / 2" | |
| 1793 | using ineq Df[of y] `0 < e` by (intro add_le_less_mono mult_mono) auto | |
| 1794 | finally show "dist (f t / g t) x < e" | |
| 1795 | by (simp add: dist_real_def) | |
| 1796 | qed | |
| 1797 | qed | |
| 1798 | ||
| 50330 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1799 | lemma lhopital_right_at_top: | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1800 | "LIM x at_right x. (g::real \<Rightarrow> real) x :> at_top \<Longrightarrow> | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1801 | eventually (\<lambda>x. g' x \<noteq> 0) (at_right x) \<Longrightarrow> | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1802 | eventually (\<lambda>x. DERIV f x :> f' x) (at_right x) \<Longrightarrow> | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1803 | eventually (\<lambda>x. DERIV g x :> g' x) (at_right x) \<Longrightarrow> | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1804 | ((\<lambda> x. (f' x / g' x)) ---> y) (at_right x) \<Longrightarrow> | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1805 | ((\<lambda> x. f x / g x) ---> y) (at_right x)" | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1806 | unfolding eventually_at_right_to_0[of _ x] filterlim_at_right_to_0[of _ _ x] DERIV_shift | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1807 | by (rule lhopital_right_0_at_top) | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1808 | |
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1809 | lemma lhopital_left_at_top: | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1810 | "LIM x at_left x. (g::real \<Rightarrow> real) x :> at_top \<Longrightarrow> | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1811 | eventually (\<lambda>x. g' x \<noteq> 0) (at_left x) \<Longrightarrow> | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1812 | eventually (\<lambda>x. DERIV f x :> f' x) (at_left x) \<Longrightarrow> | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1813 | eventually (\<lambda>x. DERIV g x :> g' x) (at_left x) \<Longrightarrow> | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1814 | ((\<lambda> x. (f' x / g' x)) ---> y) (at_left x) \<Longrightarrow> | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1815 | ((\<lambda> x. f x / g x) ---> y) (at_left x)" | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1816 | unfolding eventually_at_left_to_right filterlim_at_left_to_right DERIV_mirror | 
| 56479 
91958d4b30f7
revert c1bbd3e22226, a14831ac3023, and 36489d77c484: divide_minus_left/right are again simp rules
 hoelzl parents: 
56409diff
changeset | 1817 | by (rule lhopital_right_at_top[where f'="\<lambda>x. - f' (- x)"]) (auto simp: DERIV_mirror) | 
| 50330 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1818 | |
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1819 | lemma lhopital_at_top: | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1820 | "LIM x at x. (g::real \<Rightarrow> real) x :> at_top \<Longrightarrow> | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1821 | eventually (\<lambda>x. g' x \<noteq> 0) (at x) \<Longrightarrow> | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1822 | eventually (\<lambda>x. DERIV f x :> f' x) (at x) \<Longrightarrow> | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1823 | eventually (\<lambda>x. DERIV g x :> g' x) (at x) \<Longrightarrow> | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1824 | ((\<lambda> x. (f' x / g' x)) ---> y) (at x) \<Longrightarrow> | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1825 | ((\<lambda> x. f x / g x) ---> y) (at x)" | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1826 | unfolding eventually_at_split filterlim_at_split | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1827 | by (auto intro!: lhopital_right_at_top[of g x g' f f'] lhopital_left_at_top[of g x g' f f']) | 
| 
d0b12171118e
conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
 hoelzl parents: 
50329diff
changeset | 1828 | |
| 50347 | 1829 | lemma lhospital_at_top_at_top: | 
| 1830 | fixes f g :: "real \<Rightarrow> real" | |
| 1831 | assumes g_0: "LIM x at_top. g x :> at_top" | |
| 1832 | assumes g': "eventually (\<lambda>x. g' x \<noteq> 0) at_top" | |
| 1833 | assumes Df: "eventually (\<lambda>x. DERIV f x :> f' x) at_top" | |
| 1834 | assumes Dg: "eventually (\<lambda>x. DERIV g x :> g' x) at_top" | |
| 1835 | assumes lim: "((\<lambda> x. (f' x / g' x)) ---> x) at_top" | |
| 1836 | shows "((\<lambda> x. f x / g x) ---> x) at_top" | |
| 1837 | unfolding filterlim_at_top_to_right | |
| 1838 | proof (rule lhopital_right_0_at_top) | |
| 1839 | let ?F = "\<lambda>x. f (inverse x)" | |
| 1840 | let ?G = "\<lambda>x. g (inverse x)" | |
| 1841 | let ?R = "at_right (0::real)" | |
| 1842 | let ?D = "\<lambda>f' x. f' (inverse x) * - (inverse x ^ Suc (Suc 0))" | |
| 1843 | ||
| 1844 | show "LIM x ?R. ?G x :> at_top" | |
| 1845 | using g_0 unfolding filterlim_at_top_to_right . | |
| 1846 | ||
| 1847 | show "eventually (\<lambda>x. DERIV ?G x :> ?D g' x) ?R" | |
| 1848 | unfolding eventually_at_right_to_top | |
| 1849 | using Dg eventually_ge_at_top[where c="1::real"] | |
| 1850 | apply eventually_elim | |
| 1851 | apply (rule DERIV_cong) | |
| 1852 | apply (rule DERIV_chain'[where f=inverse]) | |
| 1853 | apply (auto intro!: DERIV_inverse) | |
| 1854 | done | |
| 1855 | ||
| 1856 | show "eventually (\<lambda>x. DERIV ?F x :> ?D f' x) ?R" | |
| 1857 | unfolding eventually_at_right_to_top | |
| 1858 | using Df eventually_ge_at_top[where c="1::real"] | |
| 1859 | apply eventually_elim | |
| 1860 | apply (rule DERIV_cong) | |
| 1861 | apply (rule DERIV_chain'[where f=inverse]) | |
| 1862 | apply (auto intro!: DERIV_inverse) | |
| 1863 | done | |
| 1864 | ||
| 1865 | show "eventually (\<lambda>x. ?D g' x \<noteq> 0) ?R" | |
| 1866 | unfolding eventually_at_right_to_top | |
| 1867 | using g' eventually_ge_at_top[where c="1::real"] | |
| 1868 | by eventually_elim auto | |
| 1869 | ||
| 1870 | show "((\<lambda>x. ?D f' x / ?D g' x) ---> x) ?R" | |
| 1871 | unfolding filterlim_at_right_to_top | |
| 1872 | apply (intro filterlim_cong[THEN iffD2, OF refl refl _ lim]) | |
| 1873 | using eventually_ge_at_top[where c="1::real"] | |
| 56479 
91958d4b30f7
revert c1bbd3e22226, a14831ac3023, and 36489d77c484: divide_minus_left/right are again simp rules
 hoelzl parents: 
56409diff
changeset | 1874 | by eventually_elim simp | 
| 50347 | 1875 | qed | 
| 1876 | ||
| 21164 | 1877 | end |