| author | Andreas Lochbihler <mail@andreas-lochbihler.de> | 
| Sun, 31 Jan 2021 12:10:20 +0100 | |
| changeset 73213 | bb35f7f60d6c | 
| parent 72569 | d56e4eeae967 | 
| child 73795 | 8893e0ed263a | 
| permissions | -rw-r--r-- | 
| 63627 | 1 | (* Title: HOL/Analysis/Derivative.thy | 
| 53781 | 2 | Author: John Harrison | 
| 68239 | 3 | Author: Robert Himmelmann, TU Muenchen (translation from HOL Light); tidied by LCP | 
| 36350 | 4 | *) | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 5 | |
| 68838 | 6 | section \<open>Derivative\<close> | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 7 | |
| 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 8 | theory Derivative | 
| 70620 
f95193669ad7
removed Brouwer_Fixpoint from imports of Derivative
 immler parents: 
70614diff
changeset | 9 | imports | 
| 
f95193669ad7
removed Brouwer_Fixpoint from imports of Derivative
 immler parents: 
70614diff
changeset | 10 | Bounded_Linear_Function | 
| 71028 
c2465b429e6e
Line_Segment is independent of Convex_Euclidean_Space
 immler parents: 
71008diff
changeset | 11 | Line_Segment | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 12 | Convex_Euclidean_Space | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 13 | begin | 
| 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 14 | |
| 63938 | 15 | declare bounded_linear_inner_left [intro] | 
| 61915 
e9812a95d108
theory for type of bounded linear functions; differentiation under the integral sign
 immler parents: 
61907diff
changeset | 16 | |
| 56369 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 17 | declare has_derivative_bounded_linear[dest] | 
| 44137 | 18 | |
| 60420 | 19 | subsection \<open>Derivatives\<close> | 
| 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 | |
| 
400ec5ae7f8f
move FrechetDeriv from the Library to HOL/Deriv; 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 | lemma has_derivative_add_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 | 22 | "(f has_derivative f') net \<Longrightarrow> ((\<lambda>x. f x + c) has_derivative f') net" | 
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 23 | by (intro derivative_eq_intros) 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 | 24 | |
| 53781 | 25 | |
| 70136 | 26 | subsection\<^marker>\<open>tag unimportant\<close> \<open>Derivative with composed bilinear function\<close> | 
| 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 | 27 | |
| 60420 | 28 | text \<open>More explicit epsilon-delta forms.\<close> | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 29 | |
| 68838 | 30 | proposition has_derivative_within': | 
| 53781 | 31 | "(f has_derivative f')(at x within s) \<longleftrightarrow> | 
| 32 | bounded_linear f' \<and> | |
| 33 | (\<forall>e>0. \<exists>d>0. \<forall>x'\<in>s. 0 < norm (x' - x) \<and> norm (x' - x) < d \<longrightarrow> | |
| 34 | norm (f x' - f x - f'(x' - x)) / norm (x' - x) < e)" | |
| 36587 | 35 | unfolding has_derivative_within Lim_within dist_norm | 
| 53781 | 36 | by (simp add: diff_diff_eq) | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 37 | |
| 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 38 | lemma has_derivative_at': | 
| 68239 | 39 | "(f has_derivative f') (at x) | 
| 40 | \<longleftrightarrow> bounded_linear f' \<and> | |
| 41 | (\<forall>e>0. \<exists>d>0. \<forall>x'. 0 < norm (x' - x) \<and> norm (x' - x) < d \<longrightarrow> | |
| 42 | norm (f x' - f x - f'(x' - x)) / norm (x' - x) < e)" | |
| 43 | using has_derivative_within' [of f f' x UNIV] by simp | |
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 44 | |
| 70614 | 45 | lemma has_derivative_componentwise_within: | 
| 46 | "(f has_derivative f') (at a within S) \<longleftrightarrow> | |
| 47 | (\<forall>i \<in> Basis. ((\<lambda>x. f x \<bullet> i) has_derivative (\<lambda>x. f' x \<bullet> i)) (at a within S))" | |
| 48 | apply (simp add: has_derivative_within) | |
| 49 | apply (subst tendsto_componentwise_iff) | |
| 50 | apply (simp add: bounded_linear_componentwise_iff [symmetric] ball_conj_distrib) | |
| 51 | apply (simp add: algebra_simps) | |
| 52 | done | |
| 53 | ||
| 67979 
53323937ee25
new material about vec, real^1, etc.
 paulson <lp15@cam.ac.uk> parents: 
67968diff
changeset | 54 | lemma has_derivative_at_withinI: | 
| 53781 | 55 | "(f has_derivative f') (at x) \<Longrightarrow> (f has_derivative f') (at x within s)" | 
| 56 | unfolding has_derivative_within' has_derivative_at' | |
| 57 | by blast | |
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 58 | |
| 43338 | 59 | lemma has_derivative_right: | 
| 53781 | 60 | fixes f :: "real \<Rightarrow> real" | 
| 61 | and y :: "real" | |
| 69064 
5840724b1d71
Prefix form of infix with * on either side no longer needs special treatment
 nipkow parents: 
69020diff
changeset | 62 |   shows "(f has_derivative ((*) y)) (at x within ({x <..} \<inter> I)) \<longleftrightarrow>
 | 
| 68239 | 63 |          ((\<lambda>t. (f x - f t) / (x - t)) \<longlongrightarrow> y) (at x within ({x <..} \<inter> I))"
 | 
| 43338 | 64 | proof - | 
| 61973 | 65 |   have "((\<lambda>t. (f t - (f x + y * (t - x))) / \<bar>t - x\<bar>) \<longlongrightarrow> 0) (at x within ({x<..} \<inter> I)) \<longleftrightarrow>
 | 
| 66 |     ((\<lambda>t. (f t - f x) / (t - x) - y) \<longlongrightarrow> 0) (at x within ({x<..} \<inter> I))"
 | |
| 44282 
f0de18b62d63
remove bounded_(bi)linear locale interpretations, to avoid duplicating so many lemmas
 huffman parents: 
44140diff
changeset | 67 | by (intro Lim_cong_within) (auto simp add: diff_divide_distrib add_divide_distrib) | 
| 61973 | 68 |   also have "\<dots> \<longleftrightarrow> ((\<lambda>t. (f t - f x) / (t - x)) \<longlongrightarrow> y) (at x within ({x<..} \<inter> I))"
 | 
| 43338 | 69 | by (simp add: Lim_null[symmetric]) | 
| 61973 | 70 |   also have "\<dots> \<longleftrightarrow> ((\<lambda>t. (f x - f t) / (x - t)) \<longlongrightarrow> y) (at x within ({x<..} \<inter> I))"
 | 
| 44140 
2c10c35dd4be
remove several redundant and unused theorems about derivatives
 huffman parents: 
44137diff
changeset | 71 | by (intro Lim_cong_within) (simp_all add: field_simps) | 
| 43338 | 72 | finally show ?thesis | 
| 44282 
f0de18b62d63
remove bounded_(bi)linear locale interpretations, to avoid duplicating so many lemmas
 huffman parents: 
44140diff
changeset | 73 | by (simp add: bounded_linear_mult_right has_derivative_within) | 
| 43338 | 74 | qed | 
| 75 | ||
| 60420 | 76 | subsubsection \<open>Caratheodory characterization\<close> | 
| 55970 
6d123f0ae358
Some new proofs. Tidying up, esp to remove "apply rule".
 paulson <lp15@cam.ac.uk> parents: 
55665diff
changeset | 77 | |
| 
6d123f0ae358
Some new proofs. Tidying up, esp to remove "apply rule".
 paulson <lp15@cam.ac.uk> parents: 
55665diff
changeset | 78 | lemma DERIV_caratheodory_within: | 
| 68095 
4fa3e63ecc7e
starting to tidy up Interval_Integral.thy
 paulson <lp15@cam.ac.uk> parents: 
68073diff
changeset | 79 | "(f has_field_derivative l) (at x within S) \<longleftrightarrow> | 
| 
4fa3e63ecc7e
starting to tidy up Interval_Integral.thy
 paulson <lp15@cam.ac.uk> parents: 
68073diff
changeset | 80 | (\<exists>g. (\<forall>z. f z - f x = g z * (z - x)) \<and> continuous (at x within S) g \<and> g x = l)" | 
| 55970 
6d123f0ae358
Some new proofs. Tidying up, esp to remove "apply rule".
 paulson <lp15@cam.ac.uk> parents: 
55665diff
changeset | 81 | (is "?lhs = ?rhs") | 
| 
6d123f0ae358
Some new proofs. Tidying up, esp to remove "apply rule".
 paulson <lp15@cam.ac.uk> parents: 
55665diff
changeset | 82 | proof | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
56151diff
changeset | 83 | assume ?lhs | 
| 55970 
6d123f0ae358
Some new proofs. Tidying up, esp to remove "apply rule".
 paulson <lp15@cam.ac.uk> parents: 
55665diff
changeset | 84 | show ?rhs | 
| 
6d123f0ae358
Some new proofs. Tidying up, esp to remove "apply rule".
 paulson <lp15@cam.ac.uk> parents: 
55665diff
changeset | 85 | proof (intro exI conjI) | 
| 
6d123f0ae358
Some new proofs. Tidying up, esp to remove "apply rule".
 paulson <lp15@cam.ac.uk> parents: 
55665diff
changeset | 86 | let ?g = "(%z. if z = x then l else (f z - f x) / (z-x))" | 
| 
6d123f0ae358
Some new proofs. Tidying up, esp to remove "apply rule".
 paulson <lp15@cam.ac.uk> parents: 
55665diff
changeset | 87 | show "\<forall>z. f z - f x = ?g z * (z-x)" by simp | 
| 68095 
4fa3e63ecc7e
starting to tidy up Interval_Integral.thy
 paulson <lp15@cam.ac.uk> parents: 
68073diff
changeset | 88 | show "continuous (at x within S) ?g" using \<open>?lhs\<close> | 
| 68239 | 89 | by (auto simp add: continuous_within has_field_derivative_iff cong: Lim_cong_within) | 
| 55970 
6d123f0ae358
Some new proofs. Tidying up, esp to remove "apply rule".
 paulson <lp15@cam.ac.uk> parents: 
55665diff
changeset | 90 | show "?g x = l" by simp | 
| 
6d123f0ae358
Some new proofs. Tidying up, esp to remove "apply rule".
 paulson <lp15@cam.ac.uk> parents: 
55665diff
changeset | 91 | qed | 
| 
6d123f0ae358
Some new proofs. Tidying up, esp to remove "apply rule".
 paulson <lp15@cam.ac.uk> parents: 
55665diff
changeset | 92 | next | 
| 
6d123f0ae358
Some new proofs. Tidying up, esp to remove "apply rule".
 paulson <lp15@cam.ac.uk> parents: 
55665diff
changeset | 93 | assume ?rhs | 
| 
6d123f0ae358
Some new proofs. Tidying up, esp to remove "apply rule".
 paulson <lp15@cam.ac.uk> parents: 
55665diff
changeset | 94 | then obtain g where | 
| 68095 
4fa3e63ecc7e
starting to tidy up Interval_Integral.thy
 paulson <lp15@cam.ac.uk> parents: 
68073diff
changeset | 95 | "(\<forall>z. f z - f x = g z * (z-x))" and "continuous (at x within S) g" and "g x = l" by blast | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
56151diff
changeset | 96 | thus ?lhs | 
| 68239 | 97 | by (auto simp add: continuous_within has_field_derivative_iff cong: Lim_cong_within) | 
| 55970 
6d123f0ae358
Some new proofs. Tidying up, esp to remove "apply rule".
 paulson <lp15@cam.ac.uk> parents: 
55665diff
changeset | 98 | qed | 
| 
6d123f0ae358
Some new proofs. Tidying up, esp to remove "apply rule".
 paulson <lp15@cam.ac.uk> parents: 
55665diff
changeset | 99 | |
| 60420 | 100 | subsection \<open>Differentiability\<close> | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 101 | |
| 70136 | 102 | definition\<^marker>\<open>tag important\<close> | 
| 53781 | 103 |   differentiable_on :: "('a::real_normed_vector \<Rightarrow> 'b::real_normed_vector) \<Rightarrow> 'a set \<Rightarrow> bool"
 | 
| 56182 
528fae0816ea
update syntax of has_*derivative to infix 50; fixed proofs
 hoelzl parents: 
56181diff
changeset | 104 | (infix "differentiable'_on" 50) | 
| 53781 | 105 | where "f differentiable_on s \<longleftrightarrow> (\<forall>x\<in>s. f differentiable (at x within s))" | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 106 | |
| 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 107 | lemma differentiableI: "(f has_derivative f') net \<Longrightarrow> f differentiable net" | 
| 53781 | 108 | unfolding differentiable_def | 
| 109 | by auto | |
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 110 | |
| 62533 
bc25f3916a99
new material to Blochj's theorem, as well as supporting lemmas
 paulson <lp15@cam.ac.uk> parents: 
62408diff
changeset | 111 | lemma differentiable_onD: "\<lbrakk>f differentiable_on S; x \<in> S\<rbrakk> \<Longrightarrow> f differentiable (at x within S)" | 
| 
bc25f3916a99
new material to Blochj's theorem, as well as supporting lemmas
 paulson <lp15@cam.ac.uk> parents: 
62408diff
changeset | 112 | using differentiable_on_def by blast | 
| 
bc25f3916a99
new material to Blochj's theorem, as well as supporting lemmas
 paulson <lp15@cam.ac.uk> parents: 
62408diff
changeset | 113 | |
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 114 | lemma differentiable_at_withinI: "f differentiable (at x) \<Longrightarrow> f differentiable (at x within s)" | 
| 53781 | 115 | unfolding differentiable_def | 
| 67979 
53323937ee25
new material about vec, real^1, etc.
 paulson <lp15@cam.ac.uk> parents: 
67968diff
changeset | 116 | using has_derivative_at_withinI | 
| 53781 | 117 | by blast | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 118 | |
| 61104 
3c2d4636cebc
new lemmas about vector_derivative, complex numbers, paths, etc.
 paulson parents: 
61076diff
changeset | 119 | lemma differentiable_at_imp_differentiable_on: | 
| 
3c2d4636cebc
new lemmas about vector_derivative, complex numbers, paths, etc.
 paulson parents: 
61076diff
changeset | 120 | "(\<And>x. x \<in> s \<Longrightarrow> f differentiable at x) \<Longrightarrow> f differentiable_on s" | 
| 
3c2d4636cebc
new lemmas about vector_derivative, complex numbers, paths, etc.
 paulson parents: 
61076diff
changeset | 121 | by (metis differentiable_at_withinI differentiable_on_def) | 
| 
3c2d4636cebc
new lemmas about vector_derivative, complex numbers, paths, etc.
 paulson parents: 
61076diff
changeset | 122 | |
| 70136 | 123 | corollary\<^marker>\<open>tag unimportant\<close> differentiable_iff_scaleR: | 
| 61104 
3c2d4636cebc
new lemmas about vector_derivative, complex numbers, paths, etc.
 paulson parents: 
61076diff
changeset | 124 | fixes f :: "real \<Rightarrow> 'a::real_normed_vector" | 
| 
3c2d4636cebc
new lemmas about vector_derivative, complex numbers, paths, etc.
 paulson parents: 
61076diff
changeset | 125 | shows "f differentiable F \<longleftrightarrow> (\<exists>d. (f has_derivative (\<lambda>x. x *\<^sub>R d)) F)" | 
| 
3c2d4636cebc
new lemmas about vector_derivative, complex numbers, paths, etc.
 paulson parents: 
61076diff
changeset | 126 | by (auto simp: differentiable_def dest: has_derivative_linear linear_imp_scaleR) | 
| 
3c2d4636cebc
new lemmas about vector_derivative, complex numbers, paths, etc.
 paulson parents: 
61076diff
changeset | 127 | |
| 44123 | 128 | lemma differentiable_on_eq_differentiable_at: | 
| 53781 | 129 | "open s \<Longrightarrow> f differentiable_on s \<longleftrightarrow> (\<forall>x\<in>s. f differentiable at x)" | 
| 44123 | 130 | unfolding differentiable_on_def | 
| 51641 
cd05e9fcc63d
remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
 hoelzl parents: 
51478diff
changeset | 131 | by (metis at_within_interior interior_open) | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 132 | |
| 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 133 | lemma differentiable_transform_within: | 
| 62087 
44841d07ef1d
revisions to limits and derivatives, plus new lemmas
 paulson parents: 
61975diff
changeset | 134 | assumes "f differentiable (at x within s)" | 
| 
44841d07ef1d
revisions to limits and derivatives, plus new lemmas
 paulson parents: 
61975diff
changeset | 135 | and "0 < d" | 
| 53781 | 136 | and "x \<in> s" | 
| 62087 
44841d07ef1d
revisions to limits and derivatives, plus new lemmas
 paulson parents: 
61975diff
changeset | 137 | and "\<And>x'. \<lbrakk>x'\<in>s; dist x' x < d\<rbrakk> \<Longrightarrow> f x' = g x'" | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 138 | shows "g differentiable (at x within s)" | 
| 62087 
44841d07ef1d
revisions to limits and derivatives, plus new lemmas
 paulson parents: 
61975diff
changeset | 139 | using assms has_derivative_transform_within unfolding differentiable_def | 
| 
44841d07ef1d
revisions to limits and derivatives, plus new lemmas
 paulson parents: 
61975diff
changeset | 140 | by blast | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 141 | |
| 63469 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 142 | lemma differentiable_on_ident [simp, derivative_intros]: "(\<lambda>x. x) differentiable_on S" | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 143 | by (simp add: differentiable_at_imp_differentiable_on) | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 144 | |
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 145 | lemma differentiable_on_id [simp, derivative_intros]: "id differentiable_on S" | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 146 | by (simp add: id_def) | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 147 | |
| 63955 | 148 | lemma differentiable_on_const [simp, derivative_intros]: "(\<lambda>z. c) differentiable_on S" | 
| 149 | by (simp add: differentiable_on_def) | |
| 150 | ||
| 151 | lemma differentiable_on_mult [simp, derivative_intros]: | |
| 152 | fixes f :: "'M::real_normed_vector \<Rightarrow> 'a::real_normed_algebra" | |
| 153 | shows "\<lbrakk>f differentiable_on S; g differentiable_on S\<rbrakk> \<Longrightarrow> (\<lambda>z. f z * g z) differentiable_on S" | |
| 68239 | 154 | unfolding differentiable_on_def differentiable_def | 
| 63955 | 155 | using differentiable_def differentiable_mult by blast | 
| 156 | ||
| 63469 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 157 | lemma differentiable_on_compose: | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 158 | "\<lbrakk>g differentiable_on S; f differentiable_on (g ` S)\<rbrakk> \<Longrightarrow> (\<lambda>x. f (g x)) differentiable_on S" | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 159 | by (simp add: differentiable_in_compose differentiable_on_def) | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 160 | |
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 161 | lemma bounded_linear_imp_differentiable_on: "bounded_linear f \<Longrightarrow> f differentiable_on S" | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 162 | by (simp add: differentiable_on_def bounded_linear_imp_differentiable) | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 163 | |
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 164 | lemma linear_imp_differentiable_on: | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 165 | fixes f :: "'a::euclidean_space \<Rightarrow> 'b::real_normed_vector" | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 166 | shows "linear f \<Longrightarrow> f differentiable_on S" | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 167 | by (simp add: differentiable_on_def linear_imp_differentiable) | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 168 | |
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 169 | lemma differentiable_on_minus [simp, derivative_intros]: | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 170 | "f differentiable_on S \<Longrightarrow> (\<lambda>z. -(f z)) differentiable_on S" | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 171 | by (simp add: differentiable_on_def) | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 172 | |
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 173 | lemma differentiable_on_add [simp, derivative_intros]: | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 174 | "\<lbrakk>f differentiable_on S; g differentiable_on S\<rbrakk> \<Longrightarrow> (\<lambda>z. f z + g z) differentiable_on S" | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 175 | by (simp add: differentiable_on_def) | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 176 | |
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 177 | lemma differentiable_on_diff [simp, derivative_intros]: | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 178 | "\<lbrakk>f differentiable_on S; g differentiable_on S\<rbrakk> \<Longrightarrow> (\<lambda>z. f z - g z) differentiable_on S" | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 179 | by (simp add: differentiable_on_def) | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 180 | |
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 181 | lemma differentiable_on_inverse [simp, derivative_intros]: | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 182 | fixes f :: "'a :: real_normed_vector \<Rightarrow> 'b :: real_normed_field" | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 183 | shows "f differentiable_on S \<Longrightarrow> (\<And>x. x \<in> S \<Longrightarrow> f x \<noteq> 0) \<Longrightarrow> (\<lambda>x. inverse (f x)) differentiable_on S" | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 184 | by (simp add: differentiable_on_def) | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 185 | |
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 186 | lemma differentiable_on_scaleR [derivative_intros, simp]: | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 187 | "\<lbrakk>f differentiable_on S; g differentiable_on S\<rbrakk> \<Longrightarrow> (\<lambda>x. f x *\<^sub>R g x) differentiable_on S" | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 188 | unfolding differentiable_on_def | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 189 | by (blast intro: differentiable_scaleR) | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 190 | |
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 191 | lemma has_derivative_sqnorm_at [derivative_intros, simp]: | 
| 68239 | 192 | "((\<lambda>x. (norm x)\<^sup>2) has_derivative (\<lambda>x. 2 *\<^sub>R (a \<bullet> x))) (at a)" | 
| 193 | using bounded_bilinear.FDERIV [of "(\<bullet>)" id id a _ id id] | |
| 194 | by (auto simp: inner_commute dot_square_norm bounded_bilinear_inner) | |
| 63469 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 195 | |
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 196 | lemma differentiable_sqnorm_at [derivative_intros, simp]: | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 197 |   fixes a :: "'a :: {real_normed_vector,real_inner}"
 | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 198 | shows "(\<lambda>x. (norm x)\<^sup>2) differentiable (at a)" | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 199 | by (force simp add: differentiable_def intro: has_derivative_sqnorm_at) | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 200 | |
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 201 | lemma differentiable_on_sqnorm [derivative_intros, simp]: | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 202 |   fixes S :: "'a :: {real_normed_vector,real_inner} set"
 | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 203 | shows "(\<lambda>x. (norm x)\<^sup>2) differentiable_on S" | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 204 | by (simp add: differentiable_at_imp_differentiable_on) | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 205 | |
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 206 | lemma differentiable_norm_at [derivative_intros, simp]: | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 207 |   fixes a :: "'a :: {real_normed_vector,real_inner}"
 | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 208 | shows "a \<noteq> 0 \<Longrightarrow> norm differentiable (at a)" | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 209 | using differentiableI has_derivative_norm by blast | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 210 | |
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 211 | lemma differentiable_on_norm [derivative_intros, simp]: | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 212 |   fixes S :: "'a :: {real_normed_vector,real_inner} set"
 | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 213 | shows "0 \<notin> S \<Longrightarrow> norm differentiable_on S" | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 214 | by (metis differentiable_at_imp_differentiable_on differentiable_norm_at) | 
| 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 215 | |
| 53781 | 216 | |
| 60420 | 217 | subsection \<open>Frechet derivative and Jacobian matrix\<close> | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 218 | |
| 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 219 | definition "frechet_derivative f net = (SOME f'. (f has_derivative f') net)" | 
| 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 220 | |
| 68838 | 221 | proposition frechet_derivative_works: | 
| 53781 | 222 | "f differentiable net \<longleftrightarrow> (f has_derivative (frechet_derivative f net)) net" | 
| 223 | unfolding frechet_derivative_def differentiable_def | |
| 224 | unfolding some_eq_ex[of "\<lambda> f' . (f has_derivative f') net"] .. | |
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 225 | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
56151diff
changeset | 226 | lemma linear_frechet_derivative: "f differentiable net \<Longrightarrow> linear (frechet_derivative f net)" | 
| 44123 | 227 | unfolding frechet_derivative_works has_derivative_def | 
| 56369 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 228 | by (auto intro: bounded_linear.linear) | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 229 | |
| 70725 
e19c18b4a0dd
Four new results from Smooth_Manifolds/Analysis_More
 paulson <lp15@cam.ac.uk> parents: 
70641diff
changeset | 230 | lemma frechet_derivative_const [simp]: "frechet_derivative (\<lambda>x. c) (at a) = (\<lambda>x. 0)" | 
| 
e19c18b4a0dd
Four new results from Smooth_Manifolds/Analysis_More
 paulson <lp15@cam.ac.uk> parents: 
70641diff
changeset | 231 | using differentiable_const frechet_derivative_works has_derivative_const has_derivative_unique by blast | 
| 
e19c18b4a0dd
Four new results from Smooth_Manifolds/Analysis_More
 paulson <lp15@cam.ac.uk> parents: 
70641diff
changeset | 232 | |
| 
e19c18b4a0dd
Four new results from Smooth_Manifolds/Analysis_More
 paulson <lp15@cam.ac.uk> parents: 
70641diff
changeset | 233 | lemma frechet_derivative_id [simp]: "frechet_derivative id (at a) = id" | 
| 
e19c18b4a0dd
Four new results from Smooth_Manifolds/Analysis_More
 paulson <lp15@cam.ac.uk> parents: 
70641diff
changeset | 234 | using differentiable_def frechet_derivative_works has_derivative_id has_derivative_unique by blast | 
| 
e19c18b4a0dd
Four new results from Smooth_Manifolds/Analysis_More
 paulson <lp15@cam.ac.uk> parents: 
70641diff
changeset | 235 | |
| 70737 | 236 | lemma frechet_derivative_ident [simp]: "frechet_derivative (\<lambda>x. x) (at a) = (\<lambda>x. x)" | 
| 237 | by (metis eq_id_iff frechet_derivative_id) | |
| 238 | ||
| 53781 | 239 | |
| 60420 | 240 | subsection \<open>Differentiability implies continuity\<close> | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 241 | |
| 68838 | 242 | proposition differentiable_imp_continuous_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 | 243 | "f differentiable (at x within s) \<Longrightarrow> continuous (at x within s) f" | 
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
56151diff
changeset | 244 | by (auto simp: differentiable_def intro: has_derivative_continuous) | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 245 | |
| 44123 | 246 | lemma differentiable_imp_continuous_on: | 
| 247 | "f differentiable_on s \<Longrightarrow> continuous_on s f" | |
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 248 | unfolding differentiable_on_def continuous_on_eq_continuous_within | 
| 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 249 | using differentiable_imp_continuous_within by blast | 
| 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 250 | |
| 44123 | 251 | lemma differentiable_on_subset: | 
| 252 | "f differentiable_on t \<Longrightarrow> s \<subseteq> t \<Longrightarrow> f differentiable_on s" | |
| 53781 | 253 | unfolding differentiable_on_def | 
| 254 | using differentiable_within_subset | |
| 255 | by blast | |
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 256 | |
| 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 257 | lemma differentiable_on_empty: "f differentiable_on {}"
 | 
| 53781 | 258 | unfolding differentiable_on_def | 
| 259 | by auto | |
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 260 | |
| 67685 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 261 | lemma has_derivative_continuous_on: | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 262 | "(\<And>x. x \<in> s \<Longrightarrow> (f has_derivative f' x) (at x within s)) \<Longrightarrow> continuous_on s f" | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 263 | by (auto intro!: differentiable_imp_continuous_on differentiableI simp: differentiable_on_def) | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 264 | |
| 60420 | 265 | text \<open>Results about neighborhoods filter.\<close> | 
| 56151 | 266 | |
| 267 | lemma eventually_nhds_metric_le: | |
| 268 | "eventually P (nhds a) = (\<exists>d>0. \<forall>x. dist x a \<le> d \<longrightarrow> P x)" | |
| 269 | unfolding eventually_nhds_metric by (safe, rule_tac x="d / 2" in exI, auto) | |
| 270 | ||
| 271 | lemma le_nhds: "F \<le> nhds a \<longleftrightarrow> (\<forall>S. open S \<and> a \<in> S \<longrightarrow> eventually (\<lambda>x. x \<in> S) F)" | |
| 61810 | 272 | unfolding le_filter_def eventually_nhds by (fast elim: eventually_mono) | 
| 56151 | 273 | |
| 274 | lemma le_nhds_metric: "F \<le> nhds a \<longleftrightarrow> (\<forall>e>0. eventually (\<lambda>x. dist x a < e) F)" | |
| 61810 | 275 | unfolding le_filter_def eventually_nhds_metric by (fast elim: eventually_mono) | 
| 56151 | 276 | |
| 277 | lemma le_nhds_metric_le: "F \<le> nhds a \<longleftrightarrow> (\<forall>e>0. eventually (\<lambda>x. dist x a \<le> e) F)" | |
| 61810 | 278 | unfolding le_filter_def eventually_nhds_metric_le by (fast elim: eventually_mono) | 
| 56151 | 279 | |
| 60420 | 280 | text \<open>Several results are easier using a "multiplied-out" variant. | 
| 281 | (I got this idea from Dieudonne's proof of the chain rule).\<close> | |
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 282 | |
| 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 283 | lemma has_derivative_within_alt: | 
| 53781 | 284 | "(f has_derivative f') (at x within s) \<longleftrightarrow> bounded_linear f' \<and> | 
| 285 | (\<forall>e>0. \<exists>d>0. \<forall>y\<in>s. norm(y - x) < d \<longrightarrow> norm (f y - f x - f' (y - x)) \<le> e * norm (y - x))" | |
| 56151 | 286 | unfolding has_derivative_within filterlim_def le_nhds_metric_le eventually_filtermap | 
| 59815 
cce82e360c2f
explicit commutative additive inverse operation;
 haftmann parents: 
59558diff
changeset | 287 | eventually_at dist_norm diff_diff_eq | 
| 56369 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 288 | by (force simp add: linear_0 bounded_linear.linear pos_divide_le_eq) | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 289 | |
| 56320 | 290 | lemma has_derivative_within_alt2: | 
| 291 | "(f has_derivative f') (at x within s) \<longleftrightarrow> bounded_linear f' \<and> | |
| 292 | (\<forall>e>0. eventually (\<lambda>y. norm (f y - f x - f' (y - x)) \<le> e * norm (y - x)) (at x within s))" | |
| 293 | unfolding has_derivative_within filterlim_def le_nhds_metric_le eventually_filtermap | |
| 59815 
cce82e360c2f
explicit commutative additive inverse operation;
 haftmann parents: 
59558diff
changeset | 294 | eventually_at dist_norm diff_diff_eq | 
| 56369 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 295 | by (force simp add: linear_0 bounded_linear.linear pos_divide_le_eq) | 
| 56320 | 296 | |
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 297 | lemma has_derivative_at_alt: | 
| 53781 | 298 | "(f has_derivative f') (at x) \<longleftrightarrow> | 
| 299 | bounded_linear f' \<and> | |
| 300 | (\<forall>e>0. \<exists>d>0. \<forall>y. norm(y - x) < d \<longrightarrow> norm (f y - f x - f'(y - x)) \<le> e * norm (y - x))" | |
| 301 | using has_derivative_within_alt[where s=UNIV] | |
| 302 | by simp | |
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 303 | |
| 53781 | 304 | |
| 60420 | 305 | subsection \<open>The chain rule\<close> | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 306 | |
| 68838 | 307 | proposition diff_chain_within[derivative_intros]: | 
| 44123 | 308 | assumes "(f has_derivative f') (at x within s)" | 
| 53781 | 309 | and "(g has_derivative g') (at (f x) within (f ` s))" | 
| 310 | shows "((g \<circ> f) has_derivative (g' \<circ> f'))(at x within s)" | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
56151diff
changeset | 311 | using has_derivative_in_compose[OF assms] | 
| 53781 | 312 | by (simp add: comp_def) | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 313 | |
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 314 | lemma diff_chain_at[derivative_intros]: | 
| 53781 | 315 | "(f has_derivative f') (at x) \<Longrightarrow> | 
| 316 | (g has_derivative g') (at (f x)) \<Longrightarrow> ((g \<circ> f) has_derivative (g' \<circ> f')) (at x)" | |
| 56181 
2aa0b19e74f3
unify syntax for has_derivative and differentiable
 hoelzl parents: 
56151diff
changeset | 317 | using has_derivative_compose[of f f' x UNIV g g'] | 
| 53781 | 318 | by (simp add: comp_def) | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 319 | |
| 68095 
4fa3e63ecc7e
starting to tidy up Interval_Integral.thy
 paulson <lp15@cam.ac.uk> parents: 
68073diff
changeset | 320 | lemma has_vector_derivative_within_open: | 
| 
4fa3e63ecc7e
starting to tidy up Interval_Integral.thy
 paulson <lp15@cam.ac.uk> parents: 
68073diff
changeset | 321 | "a \<in> S \<Longrightarrow> open S \<Longrightarrow> | 
| 
4fa3e63ecc7e
starting to tidy up Interval_Integral.thy
 paulson <lp15@cam.ac.uk> parents: 
68073diff
changeset | 322 | (f has_vector_derivative f') (at a within S) \<longleftrightarrow> (f has_vector_derivative f') (at a)" | 
| 
4fa3e63ecc7e
starting to tidy up Interval_Integral.thy
 paulson <lp15@cam.ac.uk> parents: 
68073diff
changeset | 323 | by (simp only: at_within_interior interior_open) | 
| 
4fa3e63ecc7e
starting to tidy up Interval_Integral.thy
 paulson <lp15@cam.ac.uk> parents: 
68073diff
changeset | 324 | |
| 64394 | 325 | lemma field_vector_diff_chain_within: | 
| 68095 
4fa3e63ecc7e
starting to tidy up Interval_Integral.thy
 paulson <lp15@cam.ac.uk> parents: 
68073diff
changeset | 326 | assumes Df: "(f has_vector_derivative f') (at x within S)" | 
| 
4fa3e63ecc7e
starting to tidy up Interval_Integral.thy
 paulson <lp15@cam.ac.uk> parents: 
68073diff
changeset | 327 | and Dg: "(g has_field_derivative g') (at (f x) within f ` S)" | 
| 
4fa3e63ecc7e
starting to tidy up Interval_Integral.thy
 paulson <lp15@cam.ac.uk> parents: 
68073diff
changeset | 328 | shows "((g \<circ> f) has_vector_derivative (f' * g')) (at x within S)" | 
| 64394 | 329 | using diff_chain_within[OF Df[unfolded has_vector_derivative_def] | 
| 330 | Dg [unfolded has_field_derivative_def]] | |
| 331 | by (auto simp: o_def mult.commute has_vector_derivative_def) | |
| 332 | ||
| 333 | lemma vector_derivative_diff_chain_within: | |
| 68095 
4fa3e63ecc7e
starting to tidy up Interval_Integral.thy
 paulson <lp15@cam.ac.uk> parents: 
68073diff
changeset | 334 | assumes Df: "(f has_vector_derivative f') (at x within S)" | 
| 
4fa3e63ecc7e
starting to tidy up Interval_Integral.thy
 paulson <lp15@cam.ac.uk> parents: 
68073diff
changeset | 335 | and Dg: "(g has_derivative g') (at (f x) within f`S)" | 
| 
4fa3e63ecc7e
starting to tidy up Interval_Integral.thy
 paulson <lp15@cam.ac.uk> parents: 
68073diff
changeset | 336 | shows "((g \<circ> f) has_vector_derivative (g' f')) (at x within S)" | 
| 64394 | 337 | using diff_chain_within[OF Df[unfolded has_vector_derivative_def] Dg] | 
| 338 | linear.scaleR[OF has_derivative_linear[OF Dg]] | |
| 339 | unfolding has_vector_derivative_def o_def | |
| 340 | by (auto simp: o_def mult.commute has_vector_derivative_def) | |
| 341 | ||
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 342 | |
| 70136 | 343 | subsection\<^marker>\<open>tag unimportant\<close> \<open>Composition rules stated just for differentiability\<close> | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 344 | |
| 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 345 | lemma differentiable_chain_at: | 
| 53781 | 346 | "f differentiable (at x) \<Longrightarrow> | 
| 347 | g differentiable (at (f x)) \<Longrightarrow> (g \<circ> f) differentiable (at x)" | |
| 348 | unfolding differentiable_def | |
| 349 | by (meson diff_chain_at) | |
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 350 | |
| 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 351 | lemma differentiable_chain_within: | 
| 68095 
4fa3e63ecc7e
starting to tidy up Interval_Integral.thy
 paulson <lp15@cam.ac.uk> parents: 
68073diff
changeset | 352 | "f differentiable (at x within S) \<Longrightarrow> | 
| 
4fa3e63ecc7e
starting to tidy up Interval_Integral.thy
 paulson <lp15@cam.ac.uk> parents: 
68073diff
changeset | 353 | g differentiable (at(f x) within (f ` S)) \<Longrightarrow> (g \<circ> f) differentiable (at x within S)" | 
| 53781 | 354 | unfolding differentiable_def | 
| 355 | by (meson diff_chain_within) | |
| 356 | ||
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 357 | |
| 60420 | 358 | subsection \<open>Uniqueness of derivative\<close> | 
| 37730 | 359 | |
| 56369 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 360 | |
| 70136 | 361 | text\<^marker>\<open>tag important\<close> \<open> | 
| 37730 | 362 | The general result is a bit messy because we need approachability of the | 
| 363 | limit point from any direction. But OK for nontrivial intervals etc. | |
| 60420 | 364 | \<close> | 
| 51363 
d4d00c804645
changed has_derivative_intros into a named theorems collection
 hoelzl parents: 
50939diff
changeset | 365 | |
| 68838 | 366 | proposition frechet_derivative_unique_within: | 
| 44123 | 367 | fixes f :: "'a::euclidean_space \<Rightarrow> 'b::real_normed_vector" | 
| 68239 | 368 | assumes 1: "(f has_derivative f') (at x within S)" | 
| 369 | and 2: "(f has_derivative f'') (at x within S)" | |
| 370 | and S: "\<And>i e. \<lbrakk>i\<in>Basis; e>0\<rbrakk> \<Longrightarrow> \<exists>d. 0 < \<bar>d\<bar> \<and> \<bar>d\<bar> < e \<and> (x + d *\<^sub>R i) \<in> S" | |
| 44123 | 371 | shows "f' = f''" | 
| 53781 | 372 | proof - | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 373 | note as = assms(1,2)[unfolded has_derivative_def] | 
| 44123 | 374 | then interpret f': bounded_linear f' by auto | 
| 375 | from as interpret f'': bounded_linear f'' by auto | |
| 68058 | 376 | have "x islimpt S" unfolding islimpt_approachable | 
| 68239 | 377 | proof (intro allI impI) | 
| 53781 | 378 | fix e :: real | 
| 379 | assume "e > 0" | |
| 68058 | 380 | obtain d where "0 < \<bar>d\<bar>" and "\<bar>d\<bar> < e" and "x + d *\<^sub>R (SOME i. i \<in> Basis) \<in> S" | 
| 60420 | 381 | using assms(3) SOME_Basis \<open>e>0\<close> by blast | 
| 68058 | 382 | then show "\<exists>x'\<in>S. x' \<noteq> x \<and> dist x' x < e" | 
| 68239 | 383 | by (rule_tac x="x + d *\<^sub>R (SOME i. i \<in> Basis)" in bexI) (auto simp: dist_norm SOME_Basis nonzero_Basis) qed | 
| 68058 | 384 | then have *: "netlimit (at x within S) = x" | 
| 68239 | 385 | by (simp add: Lim_ident_at trivial_limit_within) | 
| 53781 | 386 | show ?thesis | 
| 68058 | 387 | proof (rule linear_eq_stdbasis) | 
| 388 | show "linear f'" "linear f''" | |
| 389 | unfolding linear_conv_bounded_linear using as by auto | |
| 390 | next | |
| 53781 | 391 | fix i :: 'a | 
| 392 | assume i: "i \<in> Basis" | |
| 63040 | 393 | define e where "e = norm (f' i - f'' i)" | 
| 68058 | 394 | show "f' i = f'' i" | 
| 395 | proof (rule ccontr) | |
| 396 | assume "f' i \<noteq> f'' i" | |
| 397 | then have "e > 0" | |
| 398 | unfolding e_def by auto | |
| 399 | obtain d where d: | |
| 400 | "0 < d" | |
| 401 | "(\<And>y. y\<in>S \<longrightarrow> 0 < dist y x \<and> dist y x < d \<longrightarrow> | |
| 402 | dist ((f y - f x - f' (y - x)) /\<^sub>R norm (y - x) - | |
| 403 | (f y - f x - f'' (y - x)) /\<^sub>R norm (y - x)) (0 - 0) < e)" | |
| 404 | using tendsto_diff [OF as(1,2)[THEN conjunct2]] | |
| 405 | unfolding * Lim_within | |
| 406 | using \<open>e>0\<close> by blast | |
| 407 | obtain c where c: "0 < \<bar>c\<bar>" "\<bar>c\<bar> < d \<and> x + c *\<^sub>R i \<in> S" | |
| 408 | using assms(3) i d(1) by blast | |
| 409 | have *: "norm (- ((1 / \<bar>c\<bar>) *\<^sub>R f' (c *\<^sub>R i)) + (1 / \<bar>c\<bar>) *\<^sub>R f'' (c *\<^sub>R i)) = | |
| 61945 | 410 | norm ((1 / \<bar>c\<bar>) *\<^sub>R (- (f' (c *\<^sub>R i)) + f'' (c *\<^sub>R i)))" | 
| 68058 | 411 | unfolding scaleR_right_distrib by auto | 
| 412 | also have "\<dots> = norm ((1 / \<bar>c\<bar>) *\<^sub>R (c *\<^sub>R (- (f' i) + f'' i)))" | |
| 413 | unfolding f'.scaleR f''.scaleR | |
| 414 | unfolding scaleR_right_distrib scaleR_minus_right | |
| 415 | by auto | |
| 416 | also have "\<dots> = e" | |
| 417 | unfolding e_def | |
| 418 | using c(1) | |
| 419 | using norm_minus_cancel[of "f' i - f'' i"] | |
| 420 | by auto | |
| 421 | finally show False | |
| 422 | using c | |
| 423 | using d(2)[of "x + c *\<^sub>R i"] | |
| 424 | unfolding dist_norm | |
| 425 | unfolding f'.scaleR f''.scaleR f'.add f''.add f'.diff f''.diff | |
| 426 | scaleR_scaleR scaleR_right_diff_distrib scaleR_right_distrib | |
| 427 | using i | |
| 428 | by (auto simp: inverse_eq_divide) | |
| 429 | qed | |
| 44123 | 430 | qed | 
| 431 | qed | |
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 432 | |
| 68838 | 433 | proposition frechet_derivative_unique_within_closed_interval: | 
| 56188 | 434 | fixes f::"'a::euclidean_space \<Rightarrow> 'b::real_normed_vector" | 
| 68239 | 435 | assumes ab: "\<And>i. i\<in>Basis \<Longrightarrow> a\<bullet>i < b\<bullet>i" | 
| 436 | and x: "x \<in> cbox a b" | |
| 56188 | 437 | and "(f has_derivative f' ) (at x within cbox a b)" | 
| 438 | and "(f has_derivative f'') (at x within cbox a b)" | |
| 44123 | 439 | shows "f' = f''" | 
| 68239 | 440 | proof (rule frechet_derivative_unique_within) | 
| 53781 | 441 | fix e :: real | 
| 442 | fix i :: 'a | |
| 443 | assume "e > 0" and i: "i \<in> Basis" | |
| 56188 | 444 | then show "\<exists>d. 0 < \<bar>d\<bar> \<and> \<bar>d\<bar> < e \<and> x + d *\<^sub>R i \<in> cbox a b" | 
| 53781 | 445 | proof (cases "x\<bullet>i = a\<bullet>i") | 
| 446 | case True | |
| 68239 | 447 | with ab[of i] \<open>e>0\<close> x i show ?thesis | 
| 448 | by (rule_tac x="(min (b\<bullet>i - a\<bullet>i) e) / 2" in exI) | |
| 449 | (auto simp add: mem_box field_simps inner_simps inner_Basis) | |
| 53781 | 450 | next | 
| 451 | case False | |
| 452 | moreover have "a \<bullet> i < x \<bullet> i" | |
| 68239 | 453 | using False i mem_box(2) x by force | 
| 44123 | 454 |     moreover {
 | 
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50418diff
changeset | 455 | have "a \<bullet> i * 2 + min (x \<bullet> i - a \<bullet> i) e \<le> a\<bullet>i *2 + x\<bullet>i - a\<bullet>i" | 
| 44123 | 456 | by auto | 
| 53781 | 457 | also have "\<dots> = a\<bullet>i + x\<bullet>i" | 
| 458 | by auto | |
| 459 | also have "\<dots> \<le> 2 * (x\<bullet>i)" | |
| 68239 | 460 | using \<open>a \<bullet> i < x \<bullet> i\<close> by auto | 
| 53781 | 461 | finally have "a \<bullet> i * 2 + min (x \<bullet> i - a \<bullet> i) e \<le> x \<bullet> i * 2" | 
| 462 | by auto | |
| 44123 | 463 | } | 
| 53781 | 464 | moreover have "min (x \<bullet> i - a \<bullet> i) e \<ge> 0" | 
| 68239 | 465 | by (simp add: \<open>0 < e\<close> \<open>a \<bullet> i < x \<bullet> i\<close> less_eq_real_def) | 
| 53781 | 466 | then have "x \<bullet> i * 2 \<le> b \<bullet> i * 2 + min (x \<bullet> i - a \<bullet> i) e" | 
| 68239 | 467 | using i mem_box(2) x by force | 
| 44123 | 468 | ultimately show ?thesis | 
| 68239 | 469 | using ab[of i] \<open>e>0\<close> x i | 
| 470 | by (rule_tac x="- (min (x\<bullet>i - a\<bullet>i) e) / 2" in exI) | |
| 471 | (auto simp add: mem_box field_simps inner_simps inner_Basis) | |
| 44123 | 472 | qed | 
| 68239 | 473 | qed (use assms in auto) | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 474 | |
| 44123 | 475 | lemma frechet_derivative_unique_within_open_interval: | 
| 56188 | 476 | fixes f::"'a::euclidean_space \<Rightarrow> 'b::real_normed_vector" | 
| 68239 | 477 | assumes x: "x \<in> box a b" | 
| 478 | and f: "(f has_derivative f' ) (at x within box a b)" "(f has_derivative f'') (at x within box a b)" | |
| 37650 | 479 | shows "f' = f''" | 
| 480 | proof - | |
| 68239 | 481 | have "at x within box a b = at x" | 
| 482 | by (metis x at_within_interior interior_open open_box) | |
| 483 | with f show "f' = f''" | |
| 484 | by (simp add: has_derivative_unique) | |
| 37650 | 485 | qed | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 486 | |
| 37730 | 487 | lemma frechet_derivative_at: | 
| 53781 | 488 | "(f has_derivative f') (at x) \<Longrightarrow> f' = frechet_derivative f (at x)" | 
| 68239 | 489 | using differentiable_def frechet_derivative_works has_derivative_unique by blast | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 490 | |
| 70725 
e19c18b4a0dd
Four new results from Smooth_Manifolds/Analysis_More
 paulson <lp15@cam.ac.uk> parents: 
70641diff
changeset | 491 | lemma frechet_derivative_compose: | 
| 
e19c18b4a0dd
Four new results from Smooth_Manifolds/Analysis_More
 paulson <lp15@cam.ac.uk> parents: 
70641diff
changeset | 492 | "frechet_derivative (f o g) (at x) = frechet_derivative (f) (at (g x)) o frechet_derivative g (at x)" | 
| 
e19c18b4a0dd
Four new results from Smooth_Manifolds/Analysis_More
 paulson <lp15@cam.ac.uk> parents: 
70641diff
changeset | 493 | if "g differentiable at x" "f differentiable at (g x)" | 
| 
e19c18b4a0dd
Four new results from Smooth_Manifolds/Analysis_More
 paulson <lp15@cam.ac.uk> parents: 
70641diff
changeset | 494 | by (metis diff_chain_at frechet_derivative_at frechet_derivative_works that) | 
| 
e19c18b4a0dd
Four new results from Smooth_Manifolds/Analysis_More
 paulson <lp15@cam.ac.uk> parents: 
70641diff
changeset | 495 | |
| 56188 | 496 | lemma frechet_derivative_within_cbox: | 
| 497 | fixes f :: "'a::euclidean_space \<Rightarrow> 'b::real_normed_vector" | |
| 68239 | 498 | assumes "\<And>i. i\<in>Basis \<Longrightarrow> a\<bullet>i < b\<bullet>i" | 
| 56188 | 499 | and "x \<in> cbox a b" | 
| 500 | and "(f has_derivative f') (at x within cbox a b)" | |
| 501 | shows "frechet_derivative f (at x within cbox a b) = f'" | |
| 55970 
6d123f0ae358
Some new proofs. Tidying up, esp to remove "apply rule".
 paulson <lp15@cam.ac.uk> parents: 
55665diff
changeset | 502 | using assms | 
| 
6d123f0ae358
Some new proofs. Tidying up, esp to remove "apply rule".
 paulson <lp15@cam.ac.uk> parents: 
55665diff
changeset | 503 | by (metis Derivative.differentiableI frechet_derivative_unique_within_closed_interval frechet_derivative_works) | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 504 | |
| 70725 
e19c18b4a0dd
Four new results from Smooth_Manifolds/Analysis_More
 paulson <lp15@cam.ac.uk> parents: 
70641diff
changeset | 505 | lemma frechet_derivative_transform_within_open: | 
| 
e19c18b4a0dd
Four new results from Smooth_Manifolds/Analysis_More
 paulson <lp15@cam.ac.uk> parents: 
70641diff
changeset | 506 | "frechet_derivative f (at x) = frechet_derivative g (at x)" | 
| 
e19c18b4a0dd
Four new results from Smooth_Manifolds/Analysis_More
 paulson <lp15@cam.ac.uk> parents: 
70641diff
changeset | 507 | if "f differentiable at x" "open X" "x \<in> X" "\<And>x. x \<in> X \<Longrightarrow> f x = g x" | 
| 
e19c18b4a0dd
Four new results from Smooth_Manifolds/Analysis_More
 paulson <lp15@cam.ac.uk> parents: 
70641diff
changeset | 508 | by (meson frechet_derivative_at frechet_derivative_works has_derivative_transform_within_open that) | 
| 
e19c18b4a0dd
Four new results from Smooth_Manifolds/Analysis_More
 paulson <lp15@cam.ac.uk> parents: 
70641diff
changeset | 509 | |
| 53781 | 510 | |
| 69631 | 511 | subsection \<open>Derivatives of local minima and maxima are zero\<close> | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 512 | |
| 56133 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 513 | lemma has_derivative_local_min: | 
| 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 514 | fixes f :: "'a::real_normed_vector \<Rightarrow> real" | 
| 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 515 | assumes deriv: "(f has_derivative f') (at x)" | 
| 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 516 | assumes min: "eventually (\<lambda>y. f x \<le> f y) (at x)" | 
| 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 517 | shows "f' = (\<lambda>h. 0)" | 
| 37489 
44e42d392c6e
Introduce a type class for euclidean spaces, port most lemmas from real^'n to this type class.
 hoelzl parents: 
36844diff
changeset | 518 | proof | 
| 56133 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 519 | fix h :: 'a | 
| 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 520 | interpret f': bounded_linear f' | 
| 56182 
528fae0816ea
update syntax of has_*derivative to infix 50; fixed proofs
 hoelzl parents: 
56181diff
changeset | 521 | using deriv by (rule has_derivative_bounded_linear) | 
| 56133 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 522 | show "f' h = 0" | 
| 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 523 | proof (cases "h = 0") | 
| 68239 | 524 | case False | 
| 56133 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 525 | from min obtain d where d1: "0 < d" and d2: "\<forall>y\<in>ball x d. f x \<le> f y" | 
| 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 526 | unfolding eventually_at by (force simp: dist_commute) | 
| 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 527 | have "FDERIV (\<lambda>r. x + r *\<^sub>R h) 0 :> (\<lambda>r. r *\<^sub>R h)" | 
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 528 | by (intro derivative_eq_intros) auto | 
| 56133 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 529 | then have "FDERIV (\<lambda>r. f (x + r *\<^sub>R h)) 0 :> (\<lambda>k. f' (k *\<^sub>R h))" | 
| 56182 
528fae0816ea
update syntax of has_*derivative to infix 50; fixed proofs
 hoelzl parents: 
56181diff
changeset | 530 | by (rule has_derivative_compose, simp add: deriv) | 
| 56133 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 531 | then have "DERIV (\<lambda>r. f (x + r *\<^sub>R h)) 0 :> f' h" | 
| 56182 
528fae0816ea
update syntax of has_*derivative to infix 50; fixed proofs
 hoelzl parents: 
56181diff
changeset | 532 | unfolding has_field_derivative_def by (simp add: f'.scaleR mult_commute_abs) | 
| 60420 | 533 | moreover have "0 < d / norm h" using d1 and \<open>h \<noteq> 0\<close> by simp | 
| 56133 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 534 | moreover have "\<forall>y. \<bar>0 - y\<bar> < d / norm h \<longrightarrow> f (x + 0 *\<^sub>R h) \<le> f (x + y *\<^sub>R h)" | 
| 60420 | 535 | using \<open>h \<noteq> 0\<close> by (auto simp add: d2 dist_norm pos_less_divide_eq) | 
| 56133 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 536 | ultimately show "f' h = 0" | 
| 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 537 | by (rule DERIV_local_min) | 
| 68239 | 538 | qed simp | 
| 56133 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 539 | qed | 
| 37489 
44e42d392c6e
Introduce a type class for euclidean spaces, port most lemmas from real^'n to this type class.
 hoelzl parents: 
36844diff
changeset | 540 | |
| 56133 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 541 | lemma has_derivative_local_max: | 
| 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 542 | fixes f :: "'a::real_normed_vector \<Rightarrow> real" | 
| 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 543 | assumes "(f has_derivative f') (at x)" | 
| 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 544 | assumes "eventually (\<lambda>y. f y \<le> f x) (at x)" | 
| 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 545 | shows "f' = (\<lambda>h. 0)" | 
| 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 546 | using has_derivative_local_min [of "\<lambda>x. - f x" "\<lambda>h. - f' h" "x"] | 
| 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 547 | using assms unfolding fun_eq_iff by simp | 
| 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 548 | |
| 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 549 | lemma differential_zero_maxmin: | 
| 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 550 | fixes f::"'a::real_normed_vector \<Rightarrow> real" | 
| 68239 | 551 | assumes "x \<in> S" | 
| 552 | and "open S" | |
| 56133 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 553 | and deriv: "(f has_derivative f') (at x)" | 
| 68239 | 554 | and mono: "(\<forall>y\<in>S. f y \<le> f x) \<or> (\<forall>y\<in>S. f x \<le> f y)" | 
| 56133 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 555 | shows "f' = (\<lambda>v. 0)" | 
| 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 556 | using mono | 
| 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 557 | proof | 
| 68239 | 558 | assume "\<forall>y\<in>S. f y \<le> f x" | 
| 559 | with \<open>x \<in> S\<close> and \<open>open S\<close> have "eventually (\<lambda>y. f y \<le> f x) (at x)" | |
| 56133 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 560 | unfolding eventually_at_topological by auto | 
| 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 561 | with deriv show ?thesis | 
| 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 562 | by (rule has_derivative_local_max) | 
| 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 563 | next | 
| 68239 | 564 | assume "\<forall>y\<in>S. f x \<le> f y" | 
| 565 | with \<open>x \<in> S\<close> and \<open>open S\<close> have "eventually (\<lambda>y. f x \<le> f y) (at x)" | |
| 56133 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 566 | unfolding eventually_at_topological by auto | 
| 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 567 | with deriv show ?thesis | 
| 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 568 | by (rule has_derivative_local_min) | 
| 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 569 | qed | 
| 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 570 | |
| 69020 
4f94e262976d
elimination of near duplication involving Rolle's theorem and the MVT
 paulson <lp15@cam.ac.uk> parents: 
68838diff
changeset | 571 | lemma differential_zero_maxmin_component: | 
| 37489 
44e42d392c6e
Introduce a type class for euclidean spaces, port most lemmas from real^'n to this type class.
 hoelzl parents: 
36844diff
changeset | 572 | fixes f :: "'a::euclidean_space \<Rightarrow> 'b::euclidean_space" | 
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50418diff
changeset | 573 | assumes k: "k \<in> Basis" | 
| 53781 | 574 | and ball: "0 < e" "(\<forall>y \<in> ball x e. (f y)\<bullet>k \<le> (f x)\<bullet>k) \<or> (\<forall>y\<in>ball x e. (f x)\<bullet>k \<le> (f y)\<bullet>k)" | 
| 37489 
44e42d392c6e
Introduce a type class for euclidean spaces, port most lemmas from real^'n to this type class.
 hoelzl parents: 
36844diff
changeset | 575 | and diff: "f differentiable (at x)" | 
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50418diff
changeset | 576 | shows "(\<Sum>j\<in>Basis. (frechet_derivative f (at x) j \<bullet> k) *\<^sub>R j) = (0::'a)" (is "?D k = 0") | 
| 37489 
44e42d392c6e
Introduce a type class for euclidean spaces, port most lemmas from real^'n to this type class.
 hoelzl parents: 
36844diff
changeset | 577 | proof - | 
| 56133 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 578 | let ?f' = "frechet_derivative f (at x)" | 
| 60420 | 579 | have "x \<in> ball x e" using \<open>0 < e\<close> by simp | 
| 56133 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 580 | moreover have "open (ball x e)" by simp | 
| 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 581 | moreover have "((\<lambda>x. f x \<bullet> k) has_derivative (\<lambda>h. ?f' h \<bullet> k)) (at x)" | 
| 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 582 | using bounded_linear_inner_left diff[unfolded frechet_derivative_works] | 
| 56182 
528fae0816ea
update syntax of has_*derivative to infix 50; fixed proofs
 hoelzl parents: 
56181diff
changeset | 583 | by (rule bounded_linear.has_derivative) | 
| 56133 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 584 | ultimately have "(\<lambda>h. frechet_derivative f (at x) h \<bullet> k) = (\<lambda>v. 0)" | 
| 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 585 | using ball(2) by (rule differential_zero_maxmin) | 
| 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 586 | then show ?thesis | 
| 
304e37faf1ac
generalization of differential_zero_maxmin to class real_normed_vector
 huffman parents: 
56117diff
changeset | 587 | unfolding fun_eq_iff by simp | 
| 37489 
44e42d392c6e
Introduce a type class for euclidean spaces, port most lemmas from real^'n to this type class.
 hoelzl parents: 
36844diff
changeset | 588 | qed | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 589 | |
| 60420 | 590 | subsection \<open>One-dimensional mean value theorem\<close> | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 591 | |
| 44123 | 592 | lemma mvt_simple: | 
| 53781 | 593 | fixes f :: "real \<Rightarrow> real" | 
| 594 | assumes "a < b" | |
| 68241 
39a311f50344
correcting the statements of the MVTs
 paulson <lp15@cam.ac.uk> parents: 
68239diff
changeset | 595 |     and derf: "\<And>x. \<lbrakk>a \<le> x; x \<le> b\<rbrakk> \<Longrightarrow> (f has_derivative f' x) (at x within {a..b})"
 | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 596 |   shows "\<exists>x\<in>{a<..<b}. f b - f a = f' x (b - a)"
 | 
| 56264 | 597 | proof (rule mvt) | 
| 598 |   have "f differentiable_on {a..b}"
 | |
| 68241 
39a311f50344
correcting the statements of the MVTs
 paulson <lp15@cam.ac.uk> parents: 
68239diff
changeset | 599 | using derf unfolding differentiable_on_def differentiable_def by force | 
| 56264 | 600 |   then show "continuous_on {a..b} f"
 | 
| 601 | by (rule differentiable_imp_continuous_on) | |
| 68239 | 602 | show "(f has_derivative f' x) (at x)" if "a < x" "x < b" for x | 
| 68241 
39a311f50344
correcting the statements of the MVTs
 paulson <lp15@cam.ac.uk> parents: 
68239diff
changeset | 603 | by (metis at_within_Icc_at derf leI order.asym that) | 
| 69020 
4f94e262976d
elimination of near duplication involving Rolle's theorem and the MVT
 paulson <lp15@cam.ac.uk> parents: 
68838diff
changeset | 604 | qed (use assms in auto) | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 605 | |
| 44123 | 606 | lemma mvt_very_simple: | 
| 53781 | 607 | fixes f :: "real \<Rightarrow> real" | 
| 608 | assumes "a \<le> b" | |
| 68241 
39a311f50344
correcting the statements of the MVTs
 paulson <lp15@cam.ac.uk> parents: 
68239diff
changeset | 609 |     and derf: "\<And>x. \<lbrakk>a \<le> x; x \<le> b\<rbrakk> \<Longrightarrow> (f has_derivative f' x) (at x within {a..b})"
 | 
| 68239 | 610 |   shows "\<exists>x\<in>{a..b}. f b - f a = f' x (b - a)"
 | 
| 44123 | 611 | proof (cases "a = b") | 
| 53781 | 612 | interpret bounded_linear "f' b" | 
| 613 | using assms(2) assms(1) by auto | |
| 614 | case True | |
| 615 | then show ?thesis | |
| 68239 | 616 | by force | 
| 53781 | 617 | next | 
| 618 | case False | |
| 619 | then show ?thesis | |
| 68239 | 620 | using mvt_simple[OF _ derf] | 
| 621 | by (metis \<open>a \<le> b\<close> atLeastAtMost_iff dual_order.order_iff_strict greaterThanLessThan_iff) | |
| 44123 | 622 | qed | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 623 | |
| 60420 | 624 | text \<open>A nice generalization (see Havin's proof of 5.19 from Rudin's book).\<close> | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 625 | |
| 44123 | 626 | lemma mvt_general: | 
| 56223 
7696903b9e61
generalize theory of operator norms to work with class real_normed_vector
 huffman parents: 
56217diff
changeset | 627 | fixes f :: "real \<Rightarrow> 'a::real_inner" | 
| 53781 | 628 | assumes "a < b" | 
| 68239 | 629 |     and contf: "continuous_on {a..b} f"
 | 
| 630 | and derf: "\<And>x. \<lbrakk>a < x; x < b\<rbrakk> \<Longrightarrow> (f has_derivative f' x) (at x)" | |
| 53781 | 631 |   shows "\<exists>x\<in>{a<..<b}. norm (f b - f a) \<le> norm (f' x (b - a))"
 | 
| 632 | proof - | |
| 56264 | 633 |   have "\<exists>x\<in>{a<..<b}. (f b - f a) \<bullet> f b - (f b - f a) \<bullet> f a = (f b - f a) \<bullet> f' x (b - a)"
 | 
| 69020 
4f94e262976d
elimination of near duplication involving Rolle's theorem and the MVT
 paulson <lp15@cam.ac.uk> parents: 
68838diff
changeset | 634 | apply (rule mvt [OF \<open>a < b\<close>, where f = "\<lambda>x. (f b - f a) \<bullet> f x"]) | 
| 68239 | 635 | apply (intro continuous_intros contf) | 
| 69020 
4f94e262976d
elimination of near duplication involving Rolle's theorem and the MVT
 paulson <lp15@cam.ac.uk> parents: 
68838diff
changeset | 636 | using derf apply (auto intro: has_derivative_inner_right) | 
| 53781 | 637 | done | 
| 68239 | 638 |   then obtain x where x: "x \<in> {a<..<b}"
 | 
| 56264 | 639 | "(f b - f a) \<bullet> f b - (f b - f a) \<bullet> f a = (f b - f a) \<bullet> f' x (b - a)" .. | 
| 53781 | 640 | show ?thesis | 
| 641 | proof (cases "f a = f b") | |
| 36844 | 642 | case False | 
| 53077 | 643 | have "norm (f b - f a) * norm (f b - f a) = (norm (f b - f a))\<^sup>2" | 
| 44123 | 644 | by (simp add: power2_eq_square) | 
| 53781 | 645 | also have "\<dots> = (f b - f a) \<bullet> (f b - f a)" | 
| 646 | unfolding power2_norm_eq_inner .. | |
| 44123 | 647 | also have "\<dots> = (f b - f a) \<bullet> f' x (b - a)" | 
| 56264 | 648 | using x(2) by (simp only: inner_diff_right) | 
| 44123 | 649 | also have "\<dots> \<le> norm (f b - f a) * norm (f' x (b - a))" | 
| 650 | by (rule norm_cauchy_schwarz) | |
| 53781 | 651 | finally show ?thesis | 
| 652 | using False x(1) | |
| 56217 
dc429a5b13c4
Some rationalisation of basic lemmas
 paulson <lp15@cam.ac.uk> parents: 
56196diff
changeset | 653 | by (auto simp add: mult_left_cancel) | 
| 44123 | 654 | next | 
| 53781 | 655 | case True | 
| 656 | then show ?thesis | |
| 68239 | 657 | using \<open>a < b\<close> by (rule_tac x="(a + b) /2" in bexI) auto | 
| 44123 | 658 | qed | 
| 659 | qed | |
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 660 | |
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 661 | |
| 60420 | 662 | subsection \<open>More general bound theorems\<close> | 
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 663 | |
| 68239 | 664 | proposition differentiable_bound_general: | 
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 665 | fixes f :: "real \<Rightarrow> 'a::real_normed_vector" | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 666 | assumes "a < b" | 
| 68239 | 667 |     and f_cont: "continuous_on {a..b} f"
 | 
| 668 |     and phi_cont: "continuous_on {a..b} \<phi>"
 | |
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 669 | and f': "\<And>x. a < x \<Longrightarrow> x < b \<Longrightarrow> (f has_vector_derivative f' x) (at x)" | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 670 | and phi': "\<And>x. a < x \<Longrightarrow> x < b \<Longrightarrow> (\<phi> has_vector_derivative \<phi>' x) (at x)" | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 671 | and bnd: "\<And>x. a < x \<Longrightarrow> x < b \<Longrightarrow> norm (f' x) \<le> \<phi>' x" | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 672 | shows "norm (f b - f a) \<le> \<phi> b - \<phi> a" | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 673 | proof - | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 674 |   {
 | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 675 | fix x assume x: "a < x" "x < b" | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 676 | have "0 \<le> norm (f' x)" by simp | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 677 | also have "\<dots> \<le> \<phi>' x" using x by (auto intro!: bnd) | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 678 | finally have "0 \<le> \<phi>' x" . | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 679 | } note phi'_nonneg = this | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 680 | note f_tendsto = assms(2)[simplified continuous_on_def, rule_format] | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 681 | note phi_tendsto = assms(3)[simplified continuous_on_def, rule_format] | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 682 |   {
 | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 683 | fix e::real assume "e > 0" | 
| 63040 | 684 | define e2 where "e2 = e / 2" | 
| 685 | with \<open>e > 0\<close> have "e2 > 0" by simp | |
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 686 | let ?le = "\<lambda>x1. norm (f x1 - f a) \<le> \<phi> x1 - \<phi> a + e * (x1 - a) + e" | 
| 63040 | 687 |     define A where "A = {x2. a \<le> x2 \<and> x2 \<le> b \<and> (\<forall>x1\<in>{a ..< x2}. ?le x1)}"
 | 
| 68239 | 688 |     have A_subset: "A \<subseteq> {a..b}" by (auto simp: A_def)
 | 
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 689 |     {
 | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 690 | fix x2 | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 691 |       assume a: "a \<le> x2" "x2 \<le> b" and le: "\<forall>x1\<in>{a..<x2}. ?le x1"
 | 
| 60420 | 692 | have "?le x2" using \<open>e > 0\<close> | 
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 693 | proof cases | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 694 | assume "x2 \<noteq> a" with a have "a < x2" by simp | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 695 |         have "at x2 within {a <..<x2}\<noteq> bot"
 | 
| 60420 | 696 | using \<open>a < x2\<close> | 
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 697 | by (auto simp: trivial_limit_within islimpt_in_closure) | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 698 | moreover | 
| 61973 | 699 |         have "((\<lambda>x1. (\<phi> x1 - \<phi> a) + e * (x1 - a) + e) \<longlongrightarrow> (\<phi> x2 - \<phi> a) + e * (x2 - a) + e) (at x2 within {a <..<x2})"
 | 
| 700 |           "((\<lambda>x1. norm (f x1 - f a)) \<longlongrightarrow> norm (f x2 - f a)) (at x2 within {a <..<x2})"
 | |
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 701 | using a | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 702 | by (auto intro!: tendsto_eq_intros f_tendsto phi_tendsto | 
| 68239 | 703 |             intro: tendsto_within_subset[where S="{a..b}"])
 | 
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 704 | moreover | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 705 |         have "eventually (\<lambda>x. x > a) (at x2 within {a <..<x2})"
 | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 706 | by (auto simp: eventually_at_filter) | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 707 |         hence "eventually ?le (at x2 within {a <..<x2})"
 | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 708 | unfolding eventually_at_filter | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 709 | by eventually_elim (insert le, auto) | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 710 | ultimately | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 711 | show ?thesis | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 712 | by (rule tendsto_le) | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 713 | qed simp | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 714 | } note le_cont = this | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 715 | have "a \<in> A" | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 716 | using assms by (auto simp: A_def) | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 717 |     hence [simp]: "A \<noteq> {}" by auto
 | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 718 |     have A_ivl: "\<And>x1 x2. x2 \<in> A \<Longrightarrow> x1 \<in> {a ..x2} \<Longrightarrow> x1 \<in> A"
 | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 719 | by (simp add: A_def) | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 720 | have [simp]: "bdd_above A" by (auto simp: A_def) | 
| 63040 | 721 | define y where "y = Sup A" | 
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 722 | have "y \<le> b" | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 723 | unfolding y_def | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 724 | by (simp add: cSup_le_iff) (simp add: A_def) | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 725 | have leI: "\<And>x x1. a \<le> x1 \<Longrightarrow> x \<in> A \<Longrightarrow> x1 < x \<Longrightarrow> ?le x1" | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 726 | by (auto simp: A_def intro!: le_cont) | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 727 |     have y_all_le: "\<forall>x1\<in>{a..<y}. ?le x1"
 | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 728 | by (auto simp: y_def less_cSup_iff leI) | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 729 | have "a \<le> y" | 
| 60420 | 730 | by (metis \<open>a \<in> A\<close> \<open>bdd_above A\<close> cSup_upper y_def) | 
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 731 | have "y \<in> A" | 
| 60420 | 732 | using y_all_le \<open>a \<le> y\<close> \<open>y \<le> b\<close> | 
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 733 | by (auto simp: A_def) | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 734 |     hence "A = {a .. y}"
 | 
| 68239 | 735 | using A_subset by (auto simp: subset_iff y_def cSup_upper intro: A_ivl) | 
| 60420 | 736 | from le_cont[OF \<open>a \<le> y\<close> \<open>y \<le> b\<close> y_all_le] have le_y: "?le y" . | 
| 68239 | 737 | have "y = b" | 
| 738 | proof (cases "a = y") | |
| 739 | case True | |
| 60420 | 740 | with \<open>a < b\<close> have "y < b" by simp | 
| 741 | with \<open>a = y\<close> f_cont phi_cont \<open>e2 > 0\<close> | |
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 742 |       have 1: "\<forall>\<^sub>F x in at y within {y..b}. dist (f x) (f y) < e2"
 | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 743 |        and 2: "\<forall>\<^sub>F x in at y within {y..b}. dist (\<phi> x) (\<phi> y) < e2"
 | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 744 | by (auto simp: continuous_on_def tendsto_iff) | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 745 |       have 3: "eventually (\<lambda>x. y < x) (at y within {y..b})"
 | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 746 | by (auto simp: eventually_at_filter) | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 747 |       have 4: "eventually (\<lambda>x::real. x < b) (at y within {y..b})"
 | 
| 60420 | 748 | using _ \<open>y < b\<close> | 
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 749 | by (rule order_tendstoD) (auto intro!: tendsto_eq_intros) | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 750 | from 1 2 3 4 | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 751 |       have eventually_le: "eventually (\<lambda>x. ?le x) (at y within {y .. b})"
 | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 752 | proof eventually_elim | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 753 | case (elim x1) | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 754 | have "norm (f x1 - f a) = norm (f x1 - f y)" | 
| 60420 | 755 | by (simp add: \<open>a = y\<close>) | 
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 756 | also have "norm (f x1 - f y) \<le> e2" | 
| 60420 | 757 | using elim \<open>a = y\<close> by (auto simp : dist_norm intro!: less_imp_le) | 
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 758 | also have "\<dots> \<le> e2 + (\<phi> x1 - \<phi> a + e2 + e * (x1 - a))" | 
| 60420 | 759 | using \<open>0 < e\<close> elim | 
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 760 | by (intro add_increasing2[OF add_nonneg_nonneg order.refl]) | 
| 60420 | 761 | (auto simp: \<open>a = y\<close> dist_norm intro!: mult_nonneg_nonneg) | 
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 762 | also have "\<dots> = \<phi> x1 - \<phi> a + e * (x1 - a) + e" | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 763 | by (simp add: e2_def) | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 764 | finally show "?le x1" . | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 765 | qed | 
| 60420 | 766 | from this[unfolded eventually_at_topological] \<open>?le y\<close> | 
| 68239 | 767 |       obtain S where S: "open S" "y \<in> S" "\<And>x. x\<in>S \<Longrightarrow> x \<in> {y..b} \<Longrightarrow> ?le x"
 | 
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 768 | by metis | 
| 60420 | 769 | from \<open>open S\<close> obtain d where d: "\<And>x. dist x y < d \<Longrightarrow> x \<in> S" "d > 0" | 
| 62101 | 770 | by (force simp: dist_commute open_dist ball_def dest!: bspec[OF _ \<open>y \<in> S\<close>]) | 
| 63040 | 771 | define d' where "d' = min b (y + (d/2))" | 
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 772 | have "d' \<in> A" | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 773 | unfolding A_def | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 774 | proof safe | 
| 60420 | 775 | show "a \<le> d'" using \<open>a = y\<close> \<open>0 < d\<close> \<open>y < b\<close> by (simp add: d'_def) | 
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 776 | show "d' \<le> b" by (simp add: d'_def) | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 777 | fix x1 | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 778 |         assume "x1 \<in> {a..<d'}"
 | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 779 |         hence "x1 \<in> S" "x1 \<in> {y..b}"
 | 
| 60420 | 780 | by (auto simp: \<open>a = y\<close> d'_def dist_real_def intro!: d ) | 
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 781 | thus "?le x1" | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 782 | by (rule S) | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 783 | qed | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 784 | hence "d' \<le> y" | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 785 | unfolding y_def | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 786 | by (rule cSup_upper) simp | 
| 68239 | 787 | then show "y = b" using \<open>d > 0\<close> \<open>y < b\<close> | 
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 788 | by (simp add: d'_def) | 
| 68239 | 789 | next | 
| 790 | case False | |
| 791 | with \<open>a \<le> y\<close> have "a < y" by simp | |
| 792 | show "y = b" | |
| 793 | proof (rule ccontr) | |
| 794 | assume "y \<noteq> b" | |
| 795 | hence "y < b" using \<open>y \<le> b\<close> by simp | |
| 796 |         let ?F = "at y within {y..<b}"
 | |
| 797 | from f' phi' | |
| 798 | have "(f has_vector_derivative f' y) ?F" | |
| 799 | and "(\<phi> has_vector_derivative \<phi>' y) ?F" | |
| 800 | using \<open>a < y\<close> \<open>y < b\<close> | |
| 801 |           by (auto simp add: at_within_open[of _ "{a<..<b}"] has_vector_derivative_def
 | |
| 802 |             intro!: has_derivative_subset[where s="{a<..<b}" and t="{y..<b}"])
 | |
| 803 | hence "\<forall>\<^sub>F x1 in ?F. norm (f x1 - f y - (x1 - y) *\<^sub>R f' y) \<le> e2 * \<bar>x1 - y\<bar>" | |
| 804 | "\<forall>\<^sub>F x1 in ?F. norm (\<phi> x1 - \<phi> y - (x1 - y) *\<^sub>R \<phi>' y) \<le> e2 * \<bar>x1 - y\<bar>" | |
| 805 | using \<open>e2 > 0\<close> | |
| 806 | by (auto simp: has_derivative_within_alt2 has_vector_derivative_def) | |
| 807 | moreover | |
| 808 | have "\<forall>\<^sub>F x1 in ?F. y \<le> x1" "\<forall>\<^sub>F x1 in ?F. x1 < b" | |
| 809 | by (auto simp: eventually_at_filter) | |
| 810 | ultimately | |
| 811 | have "\<forall>\<^sub>F x1 in ?F. norm (f x1 - f y) \<le> (\<phi> x1 - \<phi> y) + e * \<bar>x1 - y\<bar>" | |
| 812 | (is "\<forall>\<^sub>F x1 in ?F. ?le' x1") | |
| 813 | proof eventually_elim | |
| 814 | case (elim x1) | |
| 815 | from norm_triangle_ineq2[THEN order_trans, OF elim(1)] | |
| 816 | have "norm (f x1 - f y) \<le> norm (f' y) * \<bar>x1 - y\<bar> + e2 * \<bar>x1 - y\<bar>" | |
| 817 | by (simp add: ac_simps) | |
| 818 | also have "norm (f' y) \<le> \<phi>' y" using bnd \<open>a < y\<close> \<open>y < b\<close> by simp | |
| 819 | also have "\<phi>' y * \<bar>x1 - y\<bar> \<le> \<phi> x1 - \<phi> y + e2 * \<bar>x1 - y\<bar>" | |
| 820 | using elim by (simp add: ac_simps) | |
| 821 | finally | |
| 822 | have "norm (f x1 - f y) \<le> \<phi> x1 - \<phi> y + e2 * \<bar>x1 - y\<bar> + e2 * \<bar>x1 - y\<bar>" | |
| 823 | by (auto simp: mult_right_mono) | |
| 824 | thus ?case by (simp add: e2_def) | |
| 825 | qed | |
| 826 | moreover have "?le' y" by simp | |
| 827 | ultimately obtain S | |
| 828 |         where S: "open S" "y \<in> S" "\<And>x. x\<in>S \<Longrightarrow> x \<in> {y..<b} \<Longrightarrow> ?le' x"
 | |
| 829 | unfolding eventually_at_topological | |
| 830 | by metis | |
| 831 | from \<open>open S\<close> obtain d where d: "\<And>x. dist x y < d \<Longrightarrow> x \<in> S" "d > 0" | |
| 832 | by (force simp: dist_commute open_dist ball_def dest!: bspec[OF _ \<open>y \<in> S\<close>]) | |
| 833 | define d' where "d' = min ((y + b)/2) (y + (d/2))" | |
| 834 | have "d' \<in> A" | |
| 835 | unfolding A_def | |
| 836 | proof safe | |
| 837 | show "a \<le> d'" using \<open>a < y\<close> \<open>0 < d\<close> \<open>y < b\<close> by (simp add: d'_def) | |
| 838 | show "d' \<le> b" using \<open>y < b\<close> by (simp add: d'_def min_def) | |
| 839 | fix x1 | |
| 840 |           assume x1: "x1 \<in> {a..<d'}"
 | |
| 841 | show "?le x1" | |
| 842 | proof (cases "x1 < y") | |
| 843 | case True | |
| 844 | then show ?thesis | |
| 845 | using \<open>y \<in> A\<close> local.leI x1 by auto | |
| 846 | next | |
| 847 | case False | |
| 848 |             hence x1': "x1 \<in> S" "x1 \<in> {y..<b}" using x1
 | |
| 849 | by (auto simp: d'_def dist_real_def intro!: d) | |
| 850 | have "norm (f x1 - f a) \<le> norm (f x1 - f y) + norm (f y - f a)" | |
| 851 | by (rule order_trans[OF _ norm_triangle_ineq]) simp | |
| 852 | also note S(3)[OF x1'] | |
| 853 | also note le_y | |
| 854 | finally show "?le x1" | |
| 855 | using False by (auto simp: algebra_simps) | |
| 856 | qed | |
| 857 | qed | |
| 858 | hence "d' \<le> y" | |
| 859 | unfolding y_def by (rule cSup_upper) simp | |
| 860 | thus False using \<open>d > 0\<close> \<open>y < b\<close> | |
| 861 | by (simp add: d'_def min_def split: if_split_asm) | |
| 862 | qed | |
| 863 | qed | |
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 864 | with le_y have "norm (f b - f a) \<le> \<phi> b - \<phi> a + e * (b - a + 1)" | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 865 | by (simp add: algebra_simps) | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 866 | } note * = this | 
| 68239 | 867 | show ?thesis | 
| 868 | proof (rule field_le_epsilon) | |
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 869 | fix e::real assume "e > 0" | 
| 68239 | 870 | then show "norm (f b - f a) \<le> \<phi> b - \<phi> a + e" | 
| 60420 | 871 | using *[of "e / (b - a + 1)"] \<open>a < b\<close> by simp | 
| 68239 | 872 | qed | 
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 873 | qed | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 874 | |
| 44123 | 875 | lemma differentiable_bound: | 
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 876 | fixes f :: "'a::real_normed_vector \<Rightarrow> 'b::real_normed_vector" | 
| 68239 | 877 | assumes "convex S" | 
| 878 | and derf: "\<And>x. x\<in>S \<Longrightarrow> (f has_derivative f' x) (at x within S)" | |
| 879 | and B: "\<And>x. x \<in> S \<Longrightarrow> onorm (f' x) \<le> B" | |
| 880 | and x: "x \<in> S" | |
| 881 | and y: "y \<in> S" | |
| 53781 | 882 | shows "norm (f x - f y) \<le> B * norm (x - y)" | 
| 883 | proof - | |
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 884 | let ?p = "\<lambda>u. x + u *\<^sub>R (y - x)" | 
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 885 | let ?\<phi> = "\<lambda>h. h * B * norm (x - y)" | 
| 68239 | 886 |   have *: "x + u *\<^sub>R (y - x) \<in> S" if "u \<in> {0..1}" for u
 | 
| 887 | proof - | |
| 888 | have "u *\<^sub>R y = u *\<^sub>R (y - x) + u *\<^sub>R x" | |
| 889 | by (simp add: scale_right_diff_distrib) | |
| 890 | then show "x + u *\<^sub>R (y - x) \<in> S" | |
| 70346 | 891 | using that \<open>convex S\<close> x y by (simp add: convex_alt) | 
| 892 | (metis pth_b(2) pth_c(1) scaleR_collapse) | |
| 68239 | 893 | qed | 
| 894 |   have "\<And>z. z \<in> (\<lambda>u. x + u *\<^sub>R (y - x)) ` {0..1} \<Longrightarrow>
 | |
| 895 |           (f has_derivative f' z) (at z within (\<lambda>u. x + u *\<^sub>R (y - x)) ` {0..1})"
 | |
| 72445 
2c2de074832e
tidying and removal of legacy name
 paulson <lp15@cam.ac.uk> parents: 
71633diff
changeset | 896 | by (auto intro: * has_derivative_subset [OF derf]) | 
| 68239 | 897 |   then have "continuous_on (?p ` {0..1}) f"
 | 
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 898 | unfolding continuous_on_eq_continuous_within | 
| 68239 | 899 | by (meson has_derivative_continuous) | 
| 900 |   with * have 1: "continuous_on {0 .. 1} (f \<circ> ?p)"
 | |
| 901 | by (intro continuous_intros)+ | |
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 902 |   {
 | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 903 |     fix u::real assume u: "u \<in>{0 <..< 1}"
 | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 904 | let ?u = "?p u" | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 905 | interpret linear "(f' ?u)" | 
| 68239 | 906 | using u by (auto intro!: has_derivative_linear derf *) | 
| 56188 | 907 | have "(f \<circ> ?p has_derivative (f' ?u) \<circ> (\<lambda>u. 0 + u *\<^sub>R (y - x))) (at u within box 0 1)" | 
| 72445 
2c2de074832e
tidying and removal of legacy name
 paulson <lp15@cam.ac.uk> parents: 
71633diff
changeset | 908 | by (intro derivative_intros has_derivative_subset [OF derf]) (use u * in auto) | 
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 909 | hence "((f \<circ> ?p) has_vector_derivative f' ?u (y - x)) (at u)" | 
| 70999 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 910 | by (simp add: at_within_open[OF u open_greaterThanLessThan] scaleR has_vector_derivative_def o_def) | 
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 911 | } note 2 = this | 
| 68239 | 912 |   have 3: "continuous_on {0..1} ?\<phi>"
 | 
| 913 | by (rule continuous_intros)+ | |
| 914 | have 4: "(?\<phi> has_vector_derivative B * norm (x - y)) (at u)" for u | |
| 915 | by (auto simp: has_vector_derivative_def intro!: derivative_eq_intros) | |
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 916 |   {
 | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 917 |     fix u::real assume u: "u \<in>{0 <..< 1}"
 | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 918 | let ?u = "?p u" | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 919 | interpret bounded_linear "(f' ?u)" | 
| 68239 | 920 | using u by (auto intro!: has_derivative_bounded_linear derf *) | 
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 921 | have "norm (f' ?u (y - x)) \<le> onorm (f' ?u) * norm (y - x)" | 
| 67682 
00c436488398
tuned proofs -- prefer explicit names for facts from 'interpret';
 wenzelm parents: 
67399diff
changeset | 922 | by (rule onorm) (rule bounded_linear) | 
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 923 | also have "onorm (f' ?u) \<le> B" | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 924 | using u by (auto intro!: assms(3)[rule_format] *) | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 925 | finally have "norm ((f' ?u) (y - x)) \<le> B * norm (x - y)" | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 926 | by (simp add: mult_right_mono norm_minus_commute) | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 927 | } note 5 = this | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 928 | have "norm (f x - f y) = norm ((f \<circ> (\<lambda>u. x + u *\<^sub>R (y - x))) 1 - (f \<circ> (\<lambda>u. x + u *\<^sub>R (y - x))) 0)" | 
| 53781 | 929 | by (auto simp add: norm_minus_commute) | 
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 930 | also | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 931 | from differentiable_bound_general[OF zero_less_one 1, OF 3 2 4 5] | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 932 | have "norm ((f \<circ> ?p) 1 - (f \<circ> ?p) 0) \<le> B * norm (x - y)" | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 933 | by simp | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 934 | finally show ?thesis . | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 935 | qed | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 936 | |
| 71167 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 937 | lemma field_differentiable_bound: | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 938 | fixes S :: "'a::real_normed_field set" | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 939 | assumes cvs: "convex S" | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 940 | and df: "\<And>z. z \<in> S \<Longrightarrow> (f has_field_derivative f' z) (at z within S)" | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 941 | and dn: "\<And>z. z \<in> S \<Longrightarrow> norm (f' z) \<le> B" | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 942 | and "x \<in> S" "y \<in> S" | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 943 | shows "norm(f x - f y) \<le> B * norm(x - y)" | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 944 | apply (rule differentiable_bound [OF cvs]) | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 945 | apply (erule df [unfolded has_field_derivative_def]) | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 946 | apply (rule onorm_le, simp_all add: norm_mult mult_right_mono assms) | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 947 | done | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 948 | |
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 949 | lemma | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 950 | differentiable_bound_segment: | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 951 | fixes f::"'a::real_normed_vector \<Rightarrow> 'b::real_normed_vector" | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 952 |   assumes "\<And>t. t \<in> {0..1} \<Longrightarrow> x0 + t *\<^sub>R a \<in> G"
 | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 953 | assumes f': "\<And>x. x \<in> G \<Longrightarrow> (f has_derivative f' x) (at x within G)" | 
| 68239 | 954 |   assumes B: "\<And>x. x \<in> {0..1} \<Longrightarrow> onorm (f' (x0 + x *\<^sub>R a)) \<le> B"
 | 
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 955 | shows "norm (f (x0 + a) - f x0) \<le> norm a * B" | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 956 | proof - | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 957 |   let ?G = "(\<lambda>x. x0 + x *\<^sub>R a) ` {0..1}"
 | 
| 67399 | 958 |   have "?G = (+) x0 ` (\<lambda>x. x *\<^sub>R a) ` {0..1}" by auto
 | 
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 959 | also have "convex \<dots>" | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 960 | by (intro convex_translation convex_scaled convex_real_interval) | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 961 | finally have "convex ?G" . | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 962 | moreover have "?G \<subseteq> G" "x0 \<in> ?G" "x0 + a \<in> ?G" using assms by (auto intro: image_eqI[where x=1]) | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 963 | ultimately show ?thesis | 
| 60420 | 964 | using has_derivative_subset[OF f' \<open>?G \<subseteq> G\<close>] B | 
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 965 |       differentiable_bound[of "(\<lambda>x. x0 + x *\<^sub>R a) ` {0..1}" f f' B "x0 + a" x0]
 | 
| 68239 | 966 | by (force simp: ac_simps) | 
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 967 | qed | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 968 | |
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 969 | lemma differentiable_bound_linearization: | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 970 | fixes f::"'a::real_normed_vector \<Rightarrow> 'b::real_normed_vector" | 
| 68239 | 971 |   assumes S: "\<And>t. t \<in> {0..1} \<Longrightarrow> a + t *\<^sub>R (b - a) \<in> S"
 | 
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 972 | assumes f'[derivative_intros]: "\<And>x. x \<in> S \<Longrightarrow> (f has_derivative f' x) (at x within S)" | 
| 68239 | 973 | assumes B: "\<And>x. x \<in> S \<Longrightarrow> onorm (f' x - f' x0) \<le> B" | 
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 974 | assumes "x0 \<in> S" | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 975 | shows "norm (f b - f a - f' x0 (b - a)) \<le> norm (b - a) * B" | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 976 | proof - | 
| 63040 | 977 | define g where [abs_def]: "g x = f x - f' x0 x" for x | 
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 978 | have g: "\<And>x. x \<in> S \<Longrightarrow> (g has_derivative (\<lambda>i. f' x i - f' x0 i)) (at x within S)" | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 979 | unfolding g_def using assms | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 980 | by (auto intro!: derivative_eq_intros | 
| 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 981 | bounded_linear.has_derivative[OF has_derivative_bounded_linear, OF f']) | 
| 68239 | 982 |   from B have "\<forall>x\<in>{0..1}. onorm (\<lambda>i. f' (a + x *\<^sub>R (b - a)) i - f' x0 i) \<le> B"
 | 
| 983 | using assms by (auto simp: fun_diff_def) | |
| 984 | with differentiable_bound_segment[OF S g] \<open>x0 \<in> S\<close> | |
| 60178 
f620c70f9e9b
generalized differentiable_bound; some further variations of differentiable_bound
 immler parents: 
60177diff
changeset | 985 | show ?thesis | 
| 63469 
b6900858dcb9
lots of new theorems about differentiable_on, retracts, ANRs, etc.
 paulson <lp15@cam.ac.uk> parents: 
63170diff
changeset | 986 | by (simp add: g_def field_simps linear_diff[OF has_derivative_linear[OF f']]) | 
| 44123 | 987 | qed | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 988 | |
| 67685 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 989 | lemma vector_differentiable_bound_linearization: | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 990 | fixes f::"real \<Rightarrow> 'b::real_normed_vector" | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 991 | assumes f': "\<And>x. x \<in> S \<Longrightarrow> (f has_vector_derivative f' x) (at x within S)" | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 992 | assumes "closed_segment a b \<subseteq> S" | 
| 68239 | 993 | assumes B: "\<And>x. x \<in> S \<Longrightarrow> norm (f' x - f' x0) \<le> B" | 
| 67685 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 994 | assumes "x0 \<in> S" | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 995 | shows "norm (f b - f a - (b - a) *\<^sub>R f' x0) \<le> norm (b - a) * B" | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 996 | using assms | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 997 | by (intro differentiable_bound_linearization[of a b S f "\<lambda>x h. h *\<^sub>R f' x" x0 B]) | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 998 | (force simp: closed_segment_real_eq has_vector_derivative_def | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 999 | scaleR_diff_right[symmetric] mult.commute[of B] | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 1000 | intro!: onorm_le mult_left_mono)+ | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 1001 | |
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 1002 | |
| 60420 | 1003 | text \<open>In particular.\<close> | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 1004 | |
| 44123 | 1005 | lemma has_derivative_zero_constant: | 
| 60179 | 1006 | fixes f :: "'a::real_normed_vector \<Rightarrow> 'b::real_normed_vector" | 
| 53781 | 1007 | assumes "convex s" | 
| 56369 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 1008 | and "\<And>x. x \<in> s \<Longrightarrow> (f has_derivative (\<lambda>h. 0)) (at x within s)" | 
| 44123 | 1009 | shows "\<exists>c. \<forall>x\<in>s. f x = c" | 
| 56332 | 1010 | proof - | 
| 1011 |   { fix x y assume "x \<in> s" "y \<in> s"
 | |
| 1012 | then have "norm (f x - f y) \<le> 0 * norm (x - y)" | |
| 1013 | using assms by (intro differentiable_bound[of s]) (auto simp: onorm_zero) | |
| 1014 | then have "f x = f y" | |
| 1015 | by simp } | |
| 53781 | 1016 | then show ?thesis | 
| 56332 | 1017 | by metis | 
| 53781 | 1018 | qed | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 1019 | |
| 61524 
f2e51e704a96
added many small lemmas about setsum/setprod/powr/...
 eberlm parents: 
61520diff
changeset | 1020 | lemma has_field_derivative_zero_constant: | 
| 
f2e51e704a96
added many small lemmas about setsum/setprod/powr/...
 eberlm parents: 
61520diff
changeset | 1021 | assumes "convex s" "\<And>x. x \<in> s \<Longrightarrow> (f has_field_derivative 0) (at x within s)" | 
| 
f2e51e704a96
added many small lemmas about setsum/setprod/powr/...
 eberlm parents: 
61520diff
changeset | 1022 | shows "\<exists>c. \<forall>x\<in>s. f (x) = (c :: 'a :: real_normed_field)" | 
| 
f2e51e704a96
added many small lemmas about setsum/setprod/powr/...
 eberlm parents: 
61520diff
changeset | 1023 | proof (rule has_derivative_zero_constant) | 
| 69064 
5840724b1d71
Prefix form of infix with * on either side no longer needs special treatment
 nipkow parents: 
69020diff
changeset | 1024 | have A: "(*) 0 = (\<lambda>_. 0 :: 'a)" by (intro ext) simp | 
| 61524 
f2e51e704a96
added many small lemmas about setsum/setprod/powr/...
 eberlm parents: 
61520diff
changeset | 1025 | fix x assume "x \<in> s" thus "(f has_derivative (\<lambda>h. 0)) (at x within s)" | 
| 
f2e51e704a96
added many small lemmas about setsum/setprod/powr/...
 eberlm parents: 
61520diff
changeset | 1026 | using assms(2)[of x] by (simp add: has_field_derivative_def A) | 
| 
f2e51e704a96
added many small lemmas about setsum/setprod/powr/...
 eberlm parents: 
61520diff
changeset | 1027 | qed fact | 
| 
f2e51e704a96
added many small lemmas about setsum/setprod/powr/...
 eberlm parents: 
61520diff
changeset | 1028 | |
| 67685 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 1029 | lemma | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 1030 | has_vector_derivative_zero_constant: | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 1031 | assumes "convex s" | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 1032 | assumes "\<And>x. x \<in> s \<Longrightarrow> (f has_vector_derivative 0) (at x within s)" | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 1033 | obtains c where "\<And>x. x \<in> s \<Longrightarrow> f x = c" | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 1034 | using has_derivative_zero_constant[of s f] assms | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 1035 | by (auto simp: has_vector_derivative_def) | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 1036 | |
| 53781 | 1037 | lemma has_derivative_zero_unique: | 
| 60179 | 1038 | fixes f :: "'a::real_normed_vector \<Rightarrow> 'b::real_normed_vector" | 
| 53781 | 1039 | assumes "convex s" | 
| 56369 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 1040 | and "\<And>x. x \<in> s \<Longrightarrow> (f has_derivative (\<lambda>h. 0)) (at x within s)" | 
| 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 1041 | and "x \<in> s" "y \<in> s" | 
| 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 1042 | shows "f x = f y" | 
| 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 1043 | using has_derivative_zero_constant[OF assms(1,2)] assms(3-) by force | 
| 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 1044 | |
| 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 1045 | lemma has_derivative_zero_unique_connected: | 
| 60179 | 1046 | fixes f :: "'a::real_normed_vector \<Rightarrow> 'b::real_normed_vector" | 
| 56369 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 1047 | assumes "open s" "connected s" | 
| 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 1048 | assumes f: "\<And>x. x \<in> s \<Longrightarrow> (f has_derivative (\<lambda>x. 0)) (at x)" | 
| 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 1049 | assumes "x \<in> s" "y \<in> s" | 
| 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 1050 | shows "f x = f y" | 
| 60420 | 1051 | proof (rule connected_local_const[where f=f, OF \<open>connected s\<close> \<open>x\<in>s\<close> \<open>y\<in>s\<close>]) | 
| 56369 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 1052 | show "\<forall>a\<in>s. eventually (\<lambda>b. f a = f b) (at a within s)" | 
| 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 1053 | proof | 
| 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 1054 | fix a assume "a \<in> s" | 
| 60420 | 1055 | with \<open>open s\<close> obtain e where "0 < e" "ball a e \<subseteq> s" | 
| 56369 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 1056 | by (rule openE) | 
| 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 1057 | then have "\<exists>c. \<forall>x\<in>ball a e. f x = c" | 
| 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 1058 | by (intro has_derivative_zero_constant) | 
| 71633 | 1059 | (auto simp: at_within_open[OF _ open_ball] f) | 
| 60420 | 1060 | with \<open>0<e\<close> have "\<forall>x\<in>ball a e. f a = f x" | 
| 56369 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 1061 | by auto | 
| 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 1062 | then show "eventually (\<lambda>b. f a = f b) (at a within s)" | 
| 60420 | 1063 | using \<open>0<e\<close> unfolding eventually_at_topological | 
| 56369 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 1064 | by (intro exI[of _ "ball a e"]) auto | 
| 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 1065 | qed | 
| 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 1066 | qed | 
| 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 1067 | |
| 60420 | 1068 | subsection \<open>Differentiability of inverse function (most basic form)\<close> | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 1069 | |
| 44123 | 1070 | lemma has_derivative_inverse_basic: | 
| 56226 | 1071 | fixes f :: "'a::real_normed_vector \<Rightarrow> 'b::real_normed_vector" | 
| 68055 | 1072 | assumes derf: "(f has_derivative f') (at (g y))" | 
| 1073 | and ling': "bounded_linear g'" | |
| 53781 | 1074 | and "g' \<circ> f' = id" | 
| 68055 | 1075 | and contg: "continuous (at y) g" | 
| 1076 | and "open T" | |
| 1077 | and "y \<in> T" | |
| 1078 | and fg: "\<And>z. z \<in> T \<Longrightarrow> f (g z) = z" | |
| 44123 | 1079 | shows "(g has_derivative g') (at y)" | 
| 53781 | 1080 | proof - | 
| 44123 | 1081 | interpret f': bounded_linear f' | 
| 1082 | using assms unfolding has_derivative_def by auto | |
| 53781 | 1083 | interpret g': bounded_linear g' | 
| 1084 | using assms by auto | |
| 55665 | 1085 | obtain C where C: "0 < C" "\<And>x. norm (g' x) \<le> norm x * C" | 
| 1086 | using bounded_linear.pos_bounded[OF assms(2)] by blast | |
| 53781 | 1087 | have lem1: "\<forall>e>0. \<exists>d>0. \<forall>z. | 
| 1088 | norm (z - y) < d \<longrightarrow> norm (g z - g y - g'(z - y)) \<le> e * norm (g z - g y)" | |
| 68055 | 1089 | proof (intro allI impI) | 
| 61165 | 1090 | fix e :: real | 
| 1091 | assume "e > 0" | |
| 1092 | with C(1) have *: "e / C > 0" by auto | |
| 68055 | 1093 | obtain d0 where "0 < d0" and d0: | 
| 1094 | "\<And>u. norm (u - g y) < d0 \<Longrightarrow> norm (f u - f (g y) - f' (u - g y)) \<le> e / C * norm (u - g y)" | |
| 1095 | using derf * unfolding has_derivative_at_alt by blast | |
| 1096 | obtain d1 where "0 < d1" and d1: "\<And>x. \<lbrakk>0 < dist x y; dist x y < d1\<rbrakk> \<Longrightarrow> dist (g x) (g y) < d0" | |
| 1097 | using contg \<open>0 < d0\<close> unfolding continuous_at Lim_at by blast | |
| 1098 | obtain d2 where "0 < d2" and d2: "\<And>u. dist u y < d2 \<Longrightarrow> u \<in> T" | |
| 1099 | using \<open>open T\<close> \<open>y \<in> T\<close> unfolding open_dist by blast | |
| 55665 | 1100 | obtain d where d: "0 < d" "d < d1" "d < d2" | 
| 68527 
2f4e2aab190a
Generalising and renaming some basic results
 paulson <lp15@cam.ac.uk> parents: 
68241diff
changeset | 1101 | using field_lbound_gt_zero[OF \<open>0 < d1\<close> \<open>0 < d2\<close>] by blast | 
| 68055 | 1102 | show "\<exists>d>0. \<forall>z. norm (z - y) < d \<longrightarrow> norm (g z - g y - g' (z - y)) \<le> e * norm (g z - g y)" | 
| 1103 | proof (intro exI allI impI conjI) | |
| 53781 | 1104 | fix z | 
| 1105 | assume as: "norm (z - y) < d" | |
| 68055 | 1106 | then have "z \<in> T" | 
| 44123 | 1107 | using d2 d unfolding dist_norm by auto | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 1108 | have "norm (g z - g y - g' (z - y)) \<le> norm (g' (f (g z) - y - f' (g z - g y)))" | 
| 44123 | 1109 | unfolding g'.diff f'.diff | 
| 68055 | 1110 | unfolding assms(3)[unfolded o_def id_def, THEN fun_cong] fg[OF \<open>z\<in>T\<close>] | 
| 1111 | by (simp add: norm_minus_commute) | |
| 53781 | 1112 | also have "\<dots> \<le> norm (f (g z) - y - f' (g z - g y)) * C" | 
| 55665 | 1113 | by (rule C(2)) | 
| 44123 | 1114 | also have "\<dots> \<le> (e / C) * norm (g z - g y) * C" | 
| 68055 | 1115 | proof - | 
| 1116 | have "norm (g z - g y) < d0" | |
| 1117 | by (metis as cancel_comm_monoid_add_class.diff_cancel d(2) \<open>0 < d0\<close> d1 diff_gt_0_iff_gt diff_strict_mono dist_norm dist_self zero_less_dist_iff) | |
| 1118 | then show ?thesis | |
| 72569 
d56e4eeae967
mult_le_cancel_iff1, mult_le_cancel_iff2, mult_less_iff1 generalised from the real_ versions
 paulson <lp15@cam.ac.uk> parents: 
72445diff
changeset | 1119 | by (metis C(1) \<open>y \<in> T\<close> d0 fg mult_le_cancel_iff1) | 
| 68055 | 1120 | qed | 
| 44123 | 1121 | also have "\<dots> \<le> e * norm (g z - g y)" | 
| 1122 | using C by (auto simp add: field_simps) | |
| 1123 | finally show "norm (g z - g y - g' (z - y)) \<le> e * norm (g z - g y)" | |
| 1124 | by simp | |
| 68055 | 1125 | qed (use d in auto) | 
| 44123 | 1126 | qed | 
| 53781 | 1127 | have *: "(0::real) < 1 / 2" | 
| 1128 | by auto | |
| 68055 | 1129 | obtain d where "0 < d" and d: | 
| 1130 | "\<And>z. norm (z - y) < d \<Longrightarrow> norm (g z - g y - g' (z - y)) \<le> 1/2 * norm (g z - g y)" | |
| 55665 | 1131 | using lem1 * by blast | 
| 63040 | 1132 | define B where "B = C * 2" | 
| 53781 | 1133 | have "B > 0" | 
| 1134 | unfolding B_def using C by auto | |
| 61165 | 1135 | have lem2: "norm (g z - g y) \<le> B * norm (z - y)" if z: "norm(z - y) < d" for z | 
| 1136 | proof - | |
| 44123 | 1137 | have "norm (g z - g y) \<le> norm(g' (z - y)) + norm ((g z - g y) - g'(z - y))" | 
| 53781 | 1138 | by (rule norm_triangle_sub) | 
| 1139 | also have "\<dots> \<le> norm (g' (z - y)) + 1 / 2 * norm (g z - g y)" | |
| 68055 | 1140 | by (rule add_left_mono) (use d z in auto) | 
| 44123 | 1141 | also have "\<dots> \<le> norm (z - y) * C + 1 / 2 * norm (g z - g y)" | 
| 68055 | 1142 | by (rule add_right_mono) (use C in auto) | 
| 61165 | 1143 | finally show "norm (g z - g y) \<le> B * norm (z - y)" | 
| 53781 | 1144 | unfolding B_def | 
| 1145 | by (auto simp add: field_simps) | |
| 44123 | 1146 | qed | 
| 53781 | 1147 | show ?thesis | 
| 1148 | unfolding has_derivative_at_alt | |
| 68055 | 1149 | proof (intro conjI assms allI impI) | 
| 61165 | 1150 | fix e :: real | 
| 1151 | assume "e > 0" | |
| 1152 | then have *: "e / B > 0" by (metis \<open>B > 0\<close> divide_pos_pos) | |
| 68055 | 1153 | obtain d' where "0 < d'" and d': | 
| 1154 | "\<And>z. norm (z - y) < d' \<Longrightarrow> norm (g z - g y - g' (z - y)) \<le> e / B * norm (g z - g y)" | |
| 55665 | 1155 | using lem1 * by blast | 
| 1156 | obtain k where k: "0 < k" "k < d" "k < d'" | |
| 68527 
2f4e2aab190a
Generalising and renaming some basic results
 paulson <lp15@cam.ac.uk> parents: 
68241diff
changeset | 1157 | using field_lbound_gt_zero[OF \<open>0 < d\<close> \<open>0 < d'\<close>] by blast | 
| 61165 | 1158 | show "\<exists>d>0. \<forall>ya. norm (ya - y) < d \<longrightarrow> norm (g ya - g y - g' (ya - y)) \<le> e * norm (ya - y)" | 
| 68055 | 1159 | proof (intro exI allI impI conjI) | 
| 53781 | 1160 | fix z | 
| 1161 | assume as: "norm (z - y) < k" | |
| 1162 | then have "norm (g z - g y - g' (z - y)) \<le> e / B * norm(g z - g y)" | |
| 44123 | 1163 | using d' k by auto | 
| 53781 | 1164 | also have "\<dots> \<le> e * norm (z - y)" | 
| 60420 | 1165 | unfolding times_divide_eq_left pos_divide_le_eq[OF \<open>B>0\<close>] | 
| 68055 | 1166 | using lem2[of z] k as \<open>e > 0\<close> | 
| 44123 | 1167 | by (auto simp add: field_simps) | 
| 1168 | finally show "norm (g z - g y - g' (z - y)) \<le> e * norm (z - y)" | |
| 53781 | 1169 | by simp | 
| 68055 | 1170 | qed (use k in auto) | 
| 44123 | 1171 | qed | 
| 1172 | qed | |
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 1173 | |
| 71167 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 1174 | text\<^marker>\<open>tag unimportant\<close>\<open>Inverse function theorem for complex derivatives\<close> | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 1175 | lemma has_field_derivative_inverse_basic: | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 1176 | shows "DERIV f (g y) :> f' \<Longrightarrow> | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 1177 | f' \<noteq> 0 \<Longrightarrow> | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 1178 | continuous (at y) g \<Longrightarrow> | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 1179 | open t \<Longrightarrow> | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 1180 | y \<in> t \<Longrightarrow> | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 1181 | (\<And>z. z \<in> t \<Longrightarrow> f (g z) = z) | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 1182 | \<Longrightarrow> DERIV g y :> inverse (f')" | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 1183 | unfolding has_field_derivative_def | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 1184 | apply (rule has_derivative_inverse_basic) | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 1185 | apply (auto simp: bounded_linear_mult_right) | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 1186 | done | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 1187 | |
| 60420 | 1188 | text \<open>Simply rewrite that based on the domain point x.\<close> | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 1189 | |
| 44123 | 1190 | lemma has_derivative_inverse_basic_x: | 
| 56226 | 1191 | fixes f :: "'a::real_normed_vector \<Rightarrow> 'b::real_normed_vector" | 
| 53781 | 1192 | assumes "(f has_derivative f') (at x)" | 
| 1193 | and "bounded_linear g'" | |
| 1194 | and "g' \<circ> f' = id" | |
| 1195 | and "continuous (at (f x)) g" | |
| 1196 | and "g (f x) = x" | |
| 68055 | 1197 | and "open T" | 
| 1198 | and "f x \<in> T" | |
| 1199 | and "\<And>y. y \<in> T \<Longrightarrow> f (g y) = y" | |
| 53781 | 1200 | shows "(g has_derivative g') (at (f x))" | 
| 68055 | 1201 | by (rule has_derivative_inverse_basic) (use assms in auto) | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 1202 | |
| 60420 | 1203 | text \<open>This is the version in Dieudonne', assuming continuity of f and g.\<close> | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 1204 | |
| 44123 | 1205 | lemma has_derivative_inverse_dieudonne: | 
| 56226 | 1206 | fixes f :: "'a::real_normed_vector \<Rightarrow> 'b::real_normed_vector" | 
| 68055 | 1207 | assumes "open S" | 
| 1208 | and "open (f ` S)" | |
| 1209 | and "continuous_on S f" | |
| 1210 | and "continuous_on (f ` S) g" | |
| 1211 | and "\<And>x. x \<in> S \<Longrightarrow> g (f x) = x" | |
| 1212 | and "x \<in> S" | |
| 53781 | 1213 | and "(f has_derivative f') (at x)" | 
| 1214 | and "bounded_linear g'" | |
| 1215 | and "g' \<circ> f' = id" | |
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 1216 | shows "(g has_derivative g') (at (f x))" | 
| 53781 | 1217 | apply (rule has_derivative_inverse_basic_x[OF assms(7-9) _ _ assms(2)]) | 
| 1218 | using assms(3-6) | |
| 1219 | unfolding continuous_on_eq_continuous_at[OF assms(1)] continuous_on_eq_continuous_at[OF assms(2)] | |
| 1220 | apply auto | |
| 1221 | done | |
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 1222 | |
| 60420 | 1223 | text \<open>Here's the simplest way of not assuming much about g.\<close> | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 1224 | |
| 68838 | 1225 | proposition has_derivative_inverse: | 
| 56226 | 1226 | fixes f :: "'a::real_normed_vector \<Rightarrow> 'b::real_normed_vector" | 
| 68055 | 1227 | assumes "compact S" | 
| 1228 | and "x \<in> S" | |
| 1229 | and fx: "f x \<in> interior (f ` S)" | |
| 1230 | and "continuous_on S f" | |
| 68239 | 1231 | and gf: "\<And>y. y \<in> S \<Longrightarrow> g (f y) = y" | 
| 53781 | 1232 | and "(f has_derivative f') (at x)" | 
| 1233 | and "bounded_linear g'" | |
| 1234 | and "g' \<circ> f' = id" | |
| 44123 | 1235 | shows "(g has_derivative g') (at (f x))" | 
| 53781 | 1236 | proof - | 
| 68239 | 1237 | have *: "\<And>y. y \<in> interior (f ` S) \<Longrightarrow> f (g y) = y" | 
| 1238 | by (metis gf image_iff interior_subset subsetCE) | |
| 44123 | 1239 | show ?thesis | 
| 68055 | 1240 | apply (rule has_derivative_inverse_basic_x[OF assms(6-8), where T = "interior (f ` S)"]) | 
| 1241 | apply (rule continuous_on_interior[OF _ fx]) | |
| 1242 | apply (rule continuous_on_inv) | |
| 1243 | apply (simp_all add: assms *) | |
| 53781 | 1244 | done | 
| 44123 | 1245 | qed | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 1246 | |
| 53781 | 1247 | |
| 70381 
b151d1f00204
More results about measure and integration theory
 paulson <lp15@cam.ac.uk> parents: 
70365diff
changeset | 1248 | text \<open>Invertible derivative continuous at a point implies local | 
| 44123 | 1249 | injectivity. It's only for this we need continuity of the derivative, | 
| 1250 | except of course if we want the fact that the inverse derivative is | |
| 1251 | also continuous. So if we know for some other reason that the inverse | |
| 60420 | 1252 | function exists, it's OK.\<close> | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 1253 | |
| 62381 
a6479cb85944
New and revised material for (multivariate) analysis
 paulson <lp15@cam.ac.uk> parents: 
62207diff
changeset | 1254 | proposition has_derivative_locally_injective: | 
| 53781 | 1255 | fixes f :: "'n::euclidean_space \<Rightarrow> 'm::euclidean_space" | 
| 68239 | 1256 | assumes "a \<in> S" | 
| 1257 | and "open S" | |
| 68055 | 1258 | and bling: "bounded_linear g'" | 
| 62381 
a6479cb85944
New and revised material for (multivariate) analysis
 paulson <lp15@cam.ac.uk> parents: 
62207diff
changeset | 1259 | and "g' \<circ> f' a = id" | 
| 68239 | 1260 | and derf: "\<And>x. x \<in> S \<Longrightarrow> (f has_derivative f' x) (at x)" | 
| 62381 
a6479cb85944
New and revised material for (multivariate) analysis
 paulson <lp15@cam.ac.uk> parents: 
62207diff
changeset | 1261 | and "\<And>e. e > 0 \<Longrightarrow> \<exists>d>0. \<forall>x. dist a x < d \<longrightarrow> onorm (\<lambda>v. f' x v - f' a v) < e" | 
| 68239 | 1262 | obtains r where "r > 0" "ball a r \<subseteq> S" "inj_on f (ball a r)" | 
| 53781 | 1263 | proof - | 
| 1264 | interpret bounded_linear g' | |
| 1265 | using assms by auto | |
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 1266 | note f'g' = assms(4)[unfolded id_def o_def,THEN cong] | 
| 53781 | 1267 | have "g' (f' a (\<Sum>Basis)) = (\<Sum>Basis)" "(\<Sum>Basis) \<noteq> (0::'n)" | 
| 68055 | 1268 | using f'g' by auto | 
| 53781 | 1269 | then have *: "0 < onorm g'" | 
| 56223 
7696903b9e61
generalize theory of operator norms to work with class real_normed_vector
 huffman parents: 
56217diff
changeset | 1270 | unfolding onorm_pos_lt[OF assms(3)] | 
| 53781 | 1271 | by fastforce | 
| 63040 | 1272 | define k where "k = 1 / onorm g' / 2" | 
| 53781 | 1273 | have *: "k > 0" | 
| 1274 | unfolding k_def using * by auto | |
| 55665 | 1275 | obtain d1 where d1: | 
| 1276 | "0 < d1" | |
| 1277 | "\<And>x. dist a x < d1 \<Longrightarrow> onorm (\<lambda>v. f' x v - f' a v) < k" | |
| 1278 | using assms(6) * by blast | |
| 68239 | 1279 | from \<open>open S\<close> obtain d2 where "d2 > 0" "ball a d2 \<subseteq> S" | 
| 1280 | using \<open>a\<in>S\<close> .. | |
| 1281 | obtain d2 where d2: "0 < d2" "ball a d2 \<subseteq> S" | |
| 1282 | using \<open>0 < d2\<close> \<open>ball a d2 \<subseteq> S\<close> by blast | |
| 55665 | 1283 | obtain d where d: "0 < d" "d < d1" "d < d2" | 
| 68527 
2f4e2aab190a
Generalising and renaming some basic results
 paulson <lp15@cam.ac.uk> parents: 
68241diff
changeset | 1284 | using field_lbound_gt_zero[OF d1(1) d2(1)] by blast | 
| 44123 | 1285 | show ?thesis | 
| 1286 | proof | |
| 62381 
a6479cb85944
New and revised material for (multivariate) analysis
 paulson <lp15@cam.ac.uk> parents: 
62207diff
changeset | 1287 | show "0 < d" by (fact d) | 
| 68239 | 1288 | show "ball a d \<subseteq> S" | 
| 1289 | using \<open>d < d2\<close> \<open>ball a d2 \<subseteq> S\<close> by auto | |
| 62381 
a6479cb85944
New and revised material for (multivariate) analysis
 paulson <lp15@cam.ac.uk> parents: 
62207diff
changeset | 1290 | show "inj_on f (ball a d)" | 
| 
a6479cb85944
New and revised material for (multivariate) analysis
 paulson <lp15@cam.ac.uk> parents: 
62207diff
changeset | 1291 | unfolding inj_on_def | 
| 44123 | 1292 | proof (intro strip) | 
| 53781 | 1293 | fix x y | 
| 1294 | assume as: "x \<in> ball a d" "y \<in> ball a d" "f x = f y" | |
| 63040 | 1295 | define ph where [abs_def]: "ph w = w - g' (f w - f x)" for w | 
| 44123 | 1296 | have ph':"ph = g' \<circ> (\<lambda>w. f' a w - (f w - f x))" | 
| 68239 | 1297 | unfolding ph_def o_def by (simp add: diff f'g') | 
| 53781 | 1298 | have "norm (ph x - ph y) \<le> (1 / 2) * norm (x - y)" | 
| 68239 | 1299 | proof (rule differentiable_bound[OF convex_ball _ _ as(1-2)]) | 
| 53781 | 1300 | fix u | 
| 1301 | assume u: "u \<in> ball a d" | |
| 68239 | 1302 | then have "u \<in> S" | 
| 53781 | 1303 | using d d2 by auto | 
| 1304 | have *: "(\<lambda>v. v - g' (f' u v)) = g' \<circ> (\<lambda>w. f' a w - f' u w)" | |
| 1305 | unfolding o_def and diff | |
| 1306 | using f'g' by auto | |
| 68055 | 1307 | have blin: "bounded_linear (f' a)" | 
| 68239 | 1308 | using \<open>a \<in> S\<close> derf by blast | 
| 41958 | 1309 | show "(ph has_derivative (\<lambda>v. v - g' (f' u v))) (at u within ball a d)" | 
| 68055 | 1310 | unfolding ph' * comp_def | 
| 68239 | 1311 | by (rule \<open>u \<in> S\<close> derivative_eq_intros has_derivative_at_withinI [OF derf] bounded_linear.has_derivative [OF blin] bounded_linear.has_derivative [OF bling] |simp)+ | 
| 53781 | 1312 | have **: "bounded_linear (\<lambda>x. f' u x - f' a x)" "bounded_linear (\<lambda>x. f' a x - f' u x)" | 
| 68239 | 1313 | using \<open>u \<in> S\<close> blin bounded_linear_sub derf by auto | 
| 1314 | then have "onorm (\<lambda>v. v - g' (f' u v)) \<le> onorm g' * onorm (\<lambda>w. f' a w - f' u w)" | |
| 1315 | by (simp add: "*" bounded_linear_axioms onorm_compose) | |
| 44123 | 1316 | also have "\<dots> \<le> onorm g' * k" | 
| 53781 | 1317 | apply (rule mult_left_mono) | 
| 55665 | 1318 | using d1(2)[of u] | 
| 68239 | 1319 | using onorm_neg[where f="\<lambda>x. f' u x - f' a x"] d u onorm_pos_le[OF bling] apply (auto simp: algebra_simps) | 
| 53781 | 1320 | done | 
| 1321 | also have "\<dots> \<le> 1 / 2" | |
| 1322 | unfolding k_def by auto | |
| 1323 | finally show "onorm (\<lambda>v. v - g' (f' u v)) \<le> 1 / 2" . | |
| 44123 | 1324 | qed | 
| 1325 | moreover have "norm (ph y - ph x) = norm (y - x)" | |
| 68239 | 1326 | by (simp add: as(3) ph_def) | 
| 53781 | 1327 | ultimately show "x = y" | 
| 1328 | unfolding norm_minus_commute by auto | |
| 44123 | 1329 | qed | 
| 62381 
a6479cb85944
New and revised material for (multivariate) analysis
 paulson <lp15@cam.ac.uk> parents: 
62207diff
changeset | 1330 | qed | 
| 44123 | 1331 | qed | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 1332 | |
| 53781 | 1333 | |
| 60420 | 1334 | subsection \<open>Uniformly convergent sequence of derivatives\<close> | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 1335 | |
| 44123 | 1336 | lemma has_derivative_sequence_lipschitz_lemma: | 
| 60179 | 1337 | fixes f :: "nat \<Rightarrow> 'a::real_normed_vector \<Rightarrow> 'b::real_normed_vector" | 
| 68239 | 1338 | assumes "convex S" | 
| 1339 | and derf: "\<And>n x. x \<in> S \<Longrightarrow> ((f n) has_derivative (f' n x)) (at x within S)" | |
| 1340 | and nle: "\<And>n x h. \<lbrakk>n\<ge>N; x \<in> S\<rbrakk> \<Longrightarrow> norm (f' n x h - g' x h) \<le> e * norm h" | |
| 56271 
61b1e3d88e91
generalized theorems about derivatives of limits of sequences of funtions
 huffman parents: 
56264diff
changeset | 1341 | and "0 \<le> e" | 
| 68239 | 1342 | shows "\<forall>m\<ge>N. \<forall>n\<ge>N. \<forall>x\<in>S. \<forall>y\<in>S. norm ((f m x - f n x) - (f m y - f n y)) \<le> 2 * e * norm (x - y)" | 
| 1343 | proof clarify | |
| 53781 | 1344 | fix m n x y | 
| 68239 | 1345 | assume as: "N \<le> m" "N \<le> n" "x \<in> S" "y \<in> S" | 
| 53781 | 1346 | show "norm ((f m x - f n x) - (f m y - f n y)) \<le> 2 * e * norm (x - y)" | 
| 68239 | 1347 | proof (rule differentiable_bound[where f'="\<lambda>x h. f' m x h - f' n x h", OF \<open>convex S\<close> _ _ as(3-4)]) | 
| 53781 | 1348 | fix x | 
| 68239 | 1349 | assume "x \<in> S" | 
| 1350 | show "((\<lambda>a. f m a - f n a) has_derivative (\<lambda>h. f' m x h - f' n x h)) (at x within S)" | |
| 1351 | by (rule derivative_intros derf \<open>x\<in>S\<close>)+ | |
| 56271 
61b1e3d88e91
generalized theorems about derivatives of limits of sequences of funtions
 huffman parents: 
56264diff
changeset | 1352 | show "onorm (\<lambda>h. f' m x h - f' n x h) \<le> 2 * e" | 
| 
61b1e3d88e91
generalized theorems about derivatives of limits of sequences of funtions
 huffman parents: 
56264diff
changeset | 1353 | proof (rule onorm_bound) | 
| 53781 | 1354 | fix h | 
| 44123 | 1355 | have "norm (f' m x h - f' n x h) \<le> norm (f' m x h - g' x h) + norm (f' n x h - g' x h)" | 
| 1356 | using norm_triangle_ineq[of "f' m x h - g' x h" "- f' n x h + g' x h"] | |
| 68239 | 1357 | by (auto simp add: algebra_simps norm_minus_commute) | 
| 53781 | 1358 | also have "\<dots> \<le> e * norm h + e * norm h" | 
| 68239 | 1359 | using nle[OF \<open>N \<le> m\<close> \<open>x \<in> S\<close>, of h] nle[OF \<open>N \<le> n\<close> \<open>x \<in> S\<close>, of h] | 
| 53781 | 1360 | by (auto simp add: field_simps) | 
| 56271 
61b1e3d88e91
generalized theorems about derivatives of limits of sequences of funtions
 huffman parents: 
56264diff
changeset | 1361 | finally show "norm (f' m x h - f' n x h) \<le> 2 * e * norm h" | 
| 53781 | 1362 | by auto | 
| 60420 | 1363 | qed (simp add: \<open>0 \<le> e\<close>) | 
| 44123 | 1364 | qed | 
| 1365 | qed | |
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 1366 | |
| 68055 | 1367 | lemma has_derivative_sequence_Lipschitz: | 
| 60179 | 1368 | fixes f :: "nat \<Rightarrow> 'a::real_normed_vector \<Rightarrow> 'b::real_normed_vector" | 
| 68055 | 1369 | assumes "convex S" | 
| 1370 | and "\<And>n x. x \<in> S \<Longrightarrow> ((f n) has_derivative (f' n x)) (at x within S)" | |
| 68239 | 1371 | and nle: "\<And>e. e > 0 \<Longrightarrow> \<forall>\<^sub>F n in sequentially. \<forall>x\<in>S. \<forall>h. norm (f' n x h - g' x h) \<le> e * norm h" | 
| 68055 | 1372 | and "e > 0" | 
| 1373 | shows "\<exists>N. \<forall>m\<ge>N. \<forall>n\<ge>N. \<forall>x\<in>S. \<forall>y\<in>S. | |
| 53781 | 1374 | norm ((f m x - f n x) - (f m y - f n y)) \<le> e * norm (x - y)" | 
| 68055 | 1375 | proof - | 
| 68239 | 1376 | have *: "2 * (e/2) = e" | 
| 1377 | using \<open>e > 0\<close> by auto | |
| 1378 | obtain N where "\<forall>n\<ge>N. \<forall>x\<in>S. \<forall>h. norm (f' n x h - g' x h) \<le> (e/2) * norm h" | |
| 1379 | using nle \<open>e > 0\<close> | |
| 1380 | unfolding eventually_sequentially | |
| 1381 | by (metis less_divide_eq_numeral1(1) mult_zero_left) | |
| 68055 | 1382 | then show "\<exists>N. \<forall>m\<ge>N. \<forall>n\<ge>N. \<forall>x\<in>S. \<forall>y\<in>S. norm (f m x - f n x - (f m y - f n y)) \<le> e * norm (x - y)" | 
| 53781 | 1383 | apply (rule_tac x=N in exI) | 
| 68239 | 1384 | apply (rule has_derivative_sequence_lipschitz_lemma[where e="e/2", unfolded *]) | 
| 60420 | 1385 | using assms \<open>e > 0\<close> | 
| 53781 | 1386 | apply auto | 
| 1387 | done | |
| 44123 | 1388 | qed | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 1389 | |
| 68838 | 1390 | proposition has_derivative_sequence: | 
| 60179 | 1391 | fixes f :: "nat \<Rightarrow> 'a::real_normed_vector \<Rightarrow> 'b::banach" | 
| 68055 | 1392 | assumes "convex S" | 
| 68239 | 1393 | and derf: "\<And>n x. x \<in> S \<Longrightarrow> ((f n) has_derivative (f' n x)) (at x within S)" | 
| 1394 | and nle: "\<And>e. e > 0 \<Longrightarrow> \<forall>\<^sub>F n in sequentially. \<forall>x\<in>S. \<forall>h. norm (f' n x h - g' x h) \<le> e * norm h" | |
| 68055 | 1395 | and "x0 \<in> S" | 
| 68239 | 1396 | and lim: "((\<lambda>n. f n x0) \<longlongrightarrow> l) sequentially" | 
| 1397 | shows "\<exists>g. \<forall>x\<in>S. (\<lambda>n. f n x) \<longlonglongrightarrow> g x \<and> (g has_derivative g'(x)) (at x within S)" | |
| 53781 | 1398 | proof - | 
| 68055 | 1399 | have lem1: "\<And>e. e > 0 \<Longrightarrow> \<exists>N. \<forall>m\<ge>N. \<forall>n\<ge>N. \<forall>x\<in>S. \<forall>y\<in>S. | 
| 53781 | 1400 | norm ((f m x - f n x) - (f m y - f n y)) \<le> e * norm (x - y)" | 
| 68055 | 1401 | using assms(1,2,3) by (rule has_derivative_sequence_Lipschitz) | 
| 1402 | have "\<exists>g. \<forall>x\<in>S. ((\<lambda>n. f n x) \<longlongrightarrow> g x) sequentially" | |
| 68239 | 1403 | proof (intro ballI bchoice) | 
| 53781 | 1404 | fix x | 
| 68055 | 1405 | assume "x \<in> S" | 
| 68239 | 1406 | show "\<exists>y. (\<lambda>n. f n x) \<longlonglongrightarrow> y" | 
| 1407 | unfolding convergent_eq_Cauchy | |
| 53781 | 1408 | proof (cases "x = x0") | 
| 1409 | case True | |
| 68239 | 1410 | then show "Cauchy (\<lambda>n. f n x)" | 
| 1411 | using LIMSEQ_imp_Cauchy[OF lim] by auto | |
| 44123 | 1412 | next | 
| 53781 | 1413 | case False | 
| 68239 | 1414 | show "Cauchy (\<lambda>n. f n x)" | 
| 53781 | 1415 | unfolding Cauchy_def | 
| 68055 | 1416 | proof (intro allI impI) | 
| 53781 | 1417 | fix e :: real | 
| 1418 | assume "e > 0" | |
| 56541 | 1419 | hence *: "e / 2 > 0" "e / 2 / norm (x - x0) > 0" using False by auto | 
| 55665 | 1420 | obtain M where M: "\<forall>m\<ge>M. \<forall>n\<ge>M. dist (f m x0) (f n x0) < e / 2" | 
| 68239 | 1421 | using LIMSEQ_imp_Cauchy[OF lim] * unfolding Cauchy_def by blast | 
| 55665 | 1422 | obtain N where N: | 
| 1423 | "\<forall>m\<ge>N. \<forall>n\<ge>N. | |
| 68239 | 1424 | \<forall>u\<in>S. \<forall>y\<in>S. norm (f m u - f n u - (f m y - f n y)) \<le> | 
| 1425 | e / 2 / norm (x - x0) * norm (u - y)" | |
| 55665 | 1426 | using lem1 *(2) by blast | 
| 44123 | 1427 | show "\<exists>M. \<forall>m\<ge>M. \<forall>n\<ge>M. dist (f m x) (f n x) < e" | 
| 68055 | 1428 | proof (intro exI allI impI) | 
| 53781 | 1429 | fix m n | 
| 1430 | assume as: "max M N \<le>m" "max M N\<le>n" | |
| 68239 | 1431 | have "dist (f m x) (f n x) \<le> norm (f m x0 - f n x0) + norm (f m x - f n x - (f m x0 - f n x0))" | 
| 53781 | 1432 | unfolding dist_norm | 
| 1433 | by (rule norm_triangle_sub) | |
| 44123 | 1434 | also have "\<dots> \<le> norm (f m x0 - f n x0) + e / 2" | 
| 68239 | 1435 | using N \<open>x\<in>S\<close> \<open>x0\<in>S\<close> as False by fastforce | 
| 44123 | 1436 | also have "\<dots> < e / 2 + e / 2" | 
| 68239 | 1437 | by (rule add_strict_right_mono) (use as M in \<open>auto simp: dist_norm\<close>) | 
| 53781 | 1438 | finally show "dist (f m x) (f n x) < e" | 
| 1439 | by auto | |
| 44123 | 1440 | qed | 
| 1441 | qed | |
| 1442 | qed | |
| 1443 | qed | |
| 68055 | 1444 | then obtain g where g: "\<forall>x\<in>S. (\<lambda>n. f n x) \<longlonglongrightarrow> g x" .. | 
| 68239 | 1445 | have lem2: "\<exists>N. \<forall>n\<ge>N. \<forall>x\<in>S. \<forall>y\<in>S. norm ((f n x - f n y) - (g x - g y)) \<le> e * norm (x - y)" if "e > 0" for e | 
| 1446 | proof - | |
| 55665 | 1447 | obtain N where | 
| 68055 | 1448 | N: "\<forall>m\<ge>N. \<forall>n\<ge>N. \<forall>x\<in>S. \<forall>y\<in>S. norm (f m x - f n x - (f m y - f n y)) \<le> e * norm (x - y)" | 
| 68239 | 1449 | using lem1 \<open>e > 0\<close> by blast | 
| 68055 | 1450 | show "\<exists>N. \<forall>n\<ge>N. \<forall>x\<in>S. \<forall>y\<in>S. norm (f n x - f n y - (g x - g y)) \<le> e * norm (x - y)" | 
| 68239 | 1451 | proof (intro exI ballI allI impI) | 
| 53781 | 1452 | fix n x y | 
| 68055 | 1453 | assume as: "N \<le> n" "x \<in> S" "y \<in> S" | 
| 61973 | 1454 | have "((\<lambda>m. norm (f n x - f n y - (f m x - f m y))) \<longlongrightarrow> norm (f n x - f n y - (g x - g y))) sequentially" | 
| 56320 | 1455 | by (intro tendsto_intros g[rule_format] as) | 
| 1456 | moreover have "eventually (\<lambda>m. norm (f n x - f n y - (f m x - f m y)) \<le> e * norm (x - y)) sequentially" | |
| 44123 | 1457 | unfolding eventually_sequentially | 
| 68055 | 1458 | proof (intro exI allI impI) | 
| 53781 | 1459 | fix m | 
| 1460 | assume "N \<le> m" | |
| 1461 | then show "norm (f n x - f n y - (f m x - f m y)) \<le> e * norm (x - y)" | |
| 68239 | 1462 | using N as by (auto simp add: algebra_simps) | 
| 44123 | 1463 | qed | 
| 56320 | 1464 | ultimately show "norm (f n x - f n y - (g x - g y)) \<le> e * norm (x - y)" | 
| 63952 
354808e9f44b
new material connected with HOL Light measure theory, plus more rationalisation
 paulson <lp15@cam.ac.uk> parents: 
63938diff
changeset | 1465 | by (simp add: tendsto_upperbound) | 
| 44123 | 1466 | qed | 
| 1467 | qed | |
| 68055 | 1468 | have "\<forall>x\<in>S. ((\<lambda>n. f n x) \<longlongrightarrow> g x) sequentially \<and> (g has_derivative g' x) (at x within S)" | 
| 56320 | 1469 | unfolding has_derivative_within_alt2 | 
| 68239 | 1470 | proof (intro ballI conjI allI impI) | 
| 53781 | 1471 | fix x | 
| 68055 | 1472 | assume "x \<in> S" | 
| 68239 | 1473 | then show "(\<lambda>n. f n x) \<longlonglongrightarrow> g x" | 
| 56320 | 1474 | by (simp add: g) | 
| 68239 | 1475 | have tog': "(\<lambda>n. f' n x u) \<longlonglongrightarrow> g' x u" for u | 
| 56320 | 1476 | unfolding filterlim_def le_nhds_metric_le eventually_filtermap dist_norm | 
| 1477 | proof (intro allI impI) | |
| 53781 | 1478 | fix e :: real | 
| 1479 | assume "e > 0" | |
| 56320 | 1480 | show "eventually (\<lambda>n. norm (f' n x u - g' x u) \<le> e) sequentially" | 
| 53781 | 1481 | proof (cases "u = 0") | 
| 1482 | case True | |
| 56320 | 1483 | have "eventually (\<lambda>n. norm (f' n x u - g' x u) \<le> e * norm u) sequentially" | 
| 68239 | 1484 | using nle \<open>0 < e\<close> \<open>x \<in> S\<close> by (fast elim: eventually_mono) | 
| 56320 | 1485 | then show ?thesis | 
| 68239 | 1486 | using \<open>u = 0\<close> \<open>0 < e\<close> by (auto elim: eventually_mono) | 
| 44123 | 1487 | next | 
| 53781 | 1488 | case False | 
| 60420 | 1489 | with \<open>0 < e\<close> have "0 < e / norm u" by simp | 
| 56320 | 1490 | then have "eventually (\<lambda>n. norm (f' n x u - g' x u) \<le> e / norm u * norm u) sequentially" | 
| 68239 | 1491 | using nle \<open>x \<in> S\<close> by (fast elim: eventually_mono) | 
| 56320 | 1492 | then show ?thesis | 
| 60420 | 1493 | using \<open>u \<noteq> 0\<close> by simp | 
| 44123 | 1494 | qed | 
| 1495 | qed | |
| 1496 | show "bounded_linear (g' x)" | |
| 56271 
61b1e3d88e91
generalized theorems about derivatives of limits of sequences of funtions
 huffman parents: 
56264diff
changeset | 1497 | proof | 
| 
61b1e3d88e91
generalized theorems about derivatives of limits of sequences of funtions
 huffman parents: 
56264diff
changeset | 1498 | fix x' y z :: 'a | 
| 53781 | 1499 | fix c :: real | 
| 68055 | 1500 | note lin = assms(2)[rule_format,OF \<open>x\<in>S\<close>,THEN has_derivative_bounded_linear] | 
| 44123 | 1501 | show "g' x (c *\<^sub>R x') = c *\<^sub>R g' x x'" | 
| 68239 | 1502 | apply (rule tendsto_unique[OF trivial_limit_sequentially tog']) | 
| 56369 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 1503 | unfolding lin[THEN bounded_linear.linear, THEN linear_cmul] | 
| 68239 | 1504 | apply (intro tendsto_intros tog') | 
| 53781 | 1505 | done | 
| 44123 | 1506 | show "g' x (y + z) = g' x y + g' x z" | 
| 68239 | 1507 | apply (rule tendsto_unique[OF trivial_limit_sequentially tog']) | 
| 56369 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 1508 | unfolding lin[THEN bounded_linear.linear, THEN linear_add] | 
| 53781 | 1509 | apply (rule tendsto_add) | 
| 68239 | 1510 | apply (rule tog')+ | 
| 53781 | 1511 | done | 
| 56271 
61b1e3d88e91
generalized theorems about derivatives of limits of sequences of funtions
 huffman parents: 
56264diff
changeset | 1512 | obtain N where N: "\<forall>h. norm (f' N x h - g' x h) \<le> 1 * norm h" | 
| 68239 | 1513 | using nle \<open>x \<in> S\<close> unfolding eventually_sequentially by (fast intro: zero_less_one) | 
| 56271 
61b1e3d88e91
generalized theorems about derivatives of limits of sequences of funtions
 huffman parents: 
56264diff
changeset | 1514 | have "bounded_linear (f' N x)" | 
| 68239 | 1515 | using derf \<open>x \<in> S\<close> by fast | 
| 56271 
61b1e3d88e91
generalized theorems about derivatives of limits of sequences of funtions
 huffman parents: 
56264diff
changeset | 1516 | from bounded_linear.bounded [OF this] | 
| 
61b1e3d88e91
generalized theorems about derivatives of limits of sequences of funtions
 huffman parents: 
56264diff
changeset | 1517 | obtain K where K: "\<forall>h. norm (f' N x h) \<le> norm h * K" .. | 
| 
61b1e3d88e91
generalized theorems about derivatives of limits of sequences of funtions
 huffman parents: 
56264diff
changeset | 1518 |       {
 | 
| 
61b1e3d88e91
generalized theorems about derivatives of limits of sequences of funtions
 huffman parents: 
56264diff
changeset | 1519 | fix h | 
| 
61b1e3d88e91
generalized theorems about derivatives of limits of sequences of funtions
 huffman parents: 
56264diff
changeset | 1520 | have "norm (g' x h) = norm (f' N x h - (f' N x h - g' x h))" | 
| 
61b1e3d88e91
generalized theorems about derivatives of limits of sequences of funtions
 huffman parents: 
56264diff
changeset | 1521 | by simp | 
| 
61b1e3d88e91
generalized theorems about derivatives of limits of sequences of funtions
 huffman parents: 
56264diff
changeset | 1522 | also have "\<dots> \<le> norm (f' N x h) + norm (f' N x h - g' x h)" | 
| 
61b1e3d88e91
generalized theorems about derivatives of limits of sequences of funtions
 huffman parents: 
56264diff
changeset | 1523 | by (rule norm_triangle_ineq4) | 
| 
61b1e3d88e91
generalized theorems about derivatives of limits of sequences of funtions
 huffman parents: 
56264diff
changeset | 1524 | also have "\<dots> \<le> norm h * K + 1 * norm h" | 
| 
61b1e3d88e91
generalized theorems about derivatives of limits of sequences of funtions
 huffman parents: 
56264diff
changeset | 1525 | using N K by (fast intro: add_mono) | 
| 
61b1e3d88e91
generalized theorems about derivatives of limits of sequences of funtions
 huffman parents: 
56264diff
changeset | 1526 | finally have "norm (g' x h) \<le> norm h * (K + 1)" | 
| 
61b1e3d88e91
generalized theorems about derivatives of limits of sequences of funtions
 huffman parents: 
56264diff
changeset | 1527 | by (simp add: ring_distribs) | 
| 
61b1e3d88e91
generalized theorems about derivatives of limits of sequences of funtions
 huffman parents: 
56264diff
changeset | 1528 | } | 
| 
61b1e3d88e91
generalized theorems about derivatives of limits of sequences of funtions
 huffman parents: 
56264diff
changeset | 1529 | then show "\<exists>K. \<forall>h. norm (g' x h) \<le> norm h * K" by fast | 
| 44123 | 1530 | qed | 
| 68239 | 1531 | show "eventually (\<lambda>y. norm (g y - g x - g' x (y - x)) \<le> e * norm (y - x)) (at x within S)" | 
| 1532 | if "e > 0" for e | |
| 1533 | proof - | |
| 1534 | have *: "e / 3 > 0" | |
| 1535 | using that by auto | |
| 68055 | 1536 | obtain N1 where N1: "\<forall>n\<ge>N1. \<forall>x\<in>S. \<forall>h. norm (f' n x h - g' x h) \<le> e / 3 * norm h" | 
| 68239 | 1537 | using nle * unfolding eventually_sequentially by blast | 
| 55665 | 1538 | obtain N2 where | 
| 68239 | 1539 | N2[rule_format]: "\<forall>n\<ge>N2. \<forall>x\<in>S. \<forall>y\<in>S. norm (f n x - f n y - (g x - g y)) \<le> e / 3 * norm (x - y)" | 
| 55665 | 1540 | using lem2 * by blast | 
| 56320 | 1541 | let ?N = "max N1 N2" | 
| 68055 | 1542 | have "eventually (\<lambda>y. norm (f ?N y - f ?N x - f' ?N x (y - x)) \<le> e / 3 * norm (y - x)) (at x within S)" | 
| 68239 | 1543 | using derf[unfolded has_derivative_within_alt2] and \<open>x \<in> S\<close> and * by fast | 
| 68055 | 1544 | moreover have "eventually (\<lambda>y. y \<in> S) (at x within S)" | 
| 56320 | 1545 | unfolding eventually_at by (fast intro: zero_less_one) | 
| 68055 | 1546 | ultimately show "\<forall>\<^sub>F y in at x within S. norm (g y - g x - g' x (y - x)) \<le> e * norm (y - x)" | 
| 56320 | 1547 | proof (rule eventually_elim2) | 
| 53781 | 1548 | fix y | 
| 68055 | 1549 | assume "y \<in> S" | 
| 56320 | 1550 | assume "norm (f ?N y - f ?N x - f' ?N x (y - x)) \<le> e / 3 * norm (y - x)" | 
| 1551 | moreover have "norm (g y - g x - (f ?N y - f ?N x)) \<le> e / 3 * norm (y - x)" | |
| 68239 | 1552 | using N2[OF _ \<open>y \<in> S\<close> \<open>x \<in> S\<close>] | 
| 56320 | 1553 | by (simp add: norm_minus_commute) | 
| 1554 | ultimately have "norm (g y - g x - f' ?N x (y - x)) \<le> 2 * e / 3 * norm (y - x)" | |
| 44123 | 1555 | using norm_triangle_le[of "g y - g x - (f ?N y - f ?N x)" "f ?N y - f ?N x - f' ?N x (y - x)" "2 * e / 3 * norm (y - x)"] | 
| 53781 | 1556 | by (auto simp add: algebra_simps) | 
| 44123 | 1557 | moreover | 
| 1558 | have " norm (f' ?N x (y - x) - g' x (y - x)) \<le> e / 3 * norm (y - x)" | |
| 68055 | 1559 | using N1 \<open>x \<in> S\<close> by auto | 
| 41958 | 1560 | ultimately show "norm (g y - g x - g' x (y - x)) \<le> e * norm (y - x)" | 
| 44123 | 1561 | using norm_triangle_le[of "g y - g x - f' (max N1 N2) x (y - x)" "f' (max N1 N2) x (y - x) - g' x (y - x)"] | 
| 53781 | 1562 | by (auto simp add: algebra_simps) | 
| 44123 | 1563 | qed | 
| 1564 | qed | |
| 1565 | qed | |
| 56320 | 1566 | then show ?thesis by fast | 
| 44123 | 1567 | qed | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 1568 | |
| 60420 | 1569 | text \<open>Can choose to line up antiderivatives if we want.\<close> | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 1570 | |
| 44123 | 1571 | lemma has_antiderivative_sequence: | 
| 60179 | 1572 | fixes f :: "nat \<Rightarrow> 'a::real_normed_vector \<Rightarrow> 'b::banach" | 
| 68055 | 1573 | assumes "convex S" | 
| 1574 | and der: "\<And>n x. x \<in> S \<Longrightarrow> ((f n) has_derivative (f' n x)) (at x within S)" | |
| 68239 | 1575 | and no: "\<And>e. e > 0 \<Longrightarrow> \<forall>\<^sub>F n in sequentially. | 
| 1576 | \<forall>x\<in>S. \<forall>h. norm (f' n x h - g' x h) \<le> e * norm h" | |
| 68055 | 1577 | shows "\<exists>g. \<forall>x\<in>S. (g has_derivative g' x) (at x within S)" | 
| 1578 | proof (cases "S = {}")
 | |
| 53781 | 1579 | case False | 
| 68055 | 1580 | then obtain a where "a \<in> S" | 
| 53781 | 1581 | by auto | 
| 68055 | 1582 | have *: "\<And>P Q. \<exists>g. \<forall>x\<in>S. P g x \<and> Q g x \<Longrightarrow> \<exists>g. \<forall>x\<in>S. Q g x" | 
| 53781 | 1583 | by auto | 
| 44123 | 1584 | show ?thesis | 
| 53781 | 1585 | apply (rule *) | 
| 68055 | 1586 | apply (rule has_derivative_sequence [OF \<open>convex S\<close> _ no, of "\<lambda>n x. f n x + (f 0 a - f n a)"]) | 
| 1587 | apply (metis assms(2) has_derivative_add_const) | |
| 1588 | using \<open>a \<in> S\<close> | |
| 68239 | 1589 | apply auto | 
| 53781 | 1590 | done | 
| 44123 | 1591 | qed auto | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 1592 | |
| 44123 | 1593 | lemma has_antiderivative_limit: | 
| 60179 | 1594 | fixes g' :: "'a::real_normed_vector \<Rightarrow> 'a \<Rightarrow> 'b::banach" | 
| 68055 | 1595 | assumes "convex S" | 
| 1596 | and "\<And>e. e>0 \<Longrightarrow> \<exists>f f'. \<forall>x\<in>S. | |
| 1597 | (f has_derivative (f' x)) (at x within S) \<and> (\<forall>h. norm (f' x h - g' x h) \<le> e * norm h)" | |
| 1598 | shows "\<exists>g. \<forall>x\<in>S. (g has_derivative g' x) (at x within S)" | |
| 53781 | 1599 | proof - | 
| 68055 | 1600 | have *: "\<forall>n. \<exists>f f'. \<forall>x\<in>S. | 
| 1601 | (f has_derivative (f' x)) (at x within S) \<and> | |
| 53781 | 1602 | (\<forall>h. norm(f' x h - g' x h) \<le> inverse (real (Suc n)) * norm h)" | 
| 61649 
268d88ec9087
Tweaks for "real": Removal of [iff] status for some lemmas, adding [simp] for others. Plus fixes.
 paulson <lp15@cam.ac.uk> parents: 
61560diff
changeset | 1603 | by (simp add: assms(2)) | 
| 55665 | 1604 | obtain f where | 
| 68055 | 1605 | *: "\<And>x. \<exists>f'. \<forall>xa\<in>S. (f x has_derivative f' xa) (at xa within S) \<and> | 
| 1606 | (\<forall>h. norm (f' xa h - g' xa h) \<le> inverse (real (Suc x)) * norm h)" | |
| 1607 | using * by metis | |
| 55665 | 1608 | obtain f' where | 
| 68055 | 1609 | f': "\<And>x. \<forall>z\<in>S. (f x has_derivative f' x z) (at z within S) \<and> | 
| 1610 | (\<forall>h. norm (f' x z h - g' z h) \<le> inverse (real (Suc x)) * norm h)" | |
| 1611 | using * by metis | |
| 53781 | 1612 | show ?thesis | 
| 68055 | 1613 | proof (rule has_antiderivative_sequence[OF \<open>convex S\<close>, of f f']) | 
| 53781 | 1614 | fix e :: real | 
| 1615 | assume "e > 0" | |
| 55665 | 1616 | obtain N where N: "inverse (real (Suc N)) < e" | 
| 60420 | 1617 | using reals_Archimedean[OF \<open>e>0\<close>] .. | 
| 68239 | 1618 | show "\<forall>\<^sub>F n in sequentially. \<forall>x\<in>S. \<forall>h. norm (f' n x h - g' x h) \<le> e * norm h" | 
| 1619 | unfolding eventually_sequentially | |
| 68055 | 1620 | proof (intro exI allI ballI impI) | 
| 61165 | 1621 | fix n x h | 
| 68055 | 1622 | assume n: "N \<le> n" and x: "x \<in> S" | 
| 53781 | 1623 | have *: "inverse (real (Suc n)) \<le> e" | 
| 1624 | apply (rule order_trans[OF _ N[THEN less_imp_le]]) | |
| 68239 | 1625 | using n apply (auto simp add: field_simps) | 
| 53781 | 1626 | done | 
| 61165 | 1627 | show "norm (f' n x h - g' x h) \<le> e * norm h" | 
| 68055 | 1628 | by (meson "*" mult_right_mono norm_ge_zero order.trans x f') | 
| 44123 | 1629 | qed | 
| 68055 | 1630 | qed (use f' in auto) | 
| 44123 | 1631 | qed | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 1632 | |
| 53781 | 1633 | |
| 60420 | 1634 | subsection \<open>Differentiation of a series\<close> | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 1635 | |
| 68838 | 1636 | proposition has_derivative_series: | 
| 60179 | 1637 | fixes f :: "nat \<Rightarrow> 'a::real_normed_vector \<Rightarrow> 'b::banach" | 
| 68055 | 1638 | assumes "convex S" | 
| 1639 | and "\<And>n x. x \<in> S \<Longrightarrow> ((f n) has_derivative (f' n x)) (at x within S)" | |
| 68239 | 1640 |     and "\<And>e. e>0 \<Longrightarrow> \<forall>\<^sub>F n in sequentially. \<forall>x\<in>S. \<forall>h. norm (sum (\<lambda>i. f' i x h) {..<n} - g' x h) \<le> e * norm h"
 | 
| 68055 | 1641 | and "x \<in> S" | 
| 56183 | 1642 | and "(\<lambda>n. f n x) sums l" | 
| 68055 | 1643 | shows "\<exists>g. \<forall>x\<in>S. (\<lambda>n. f n x) sums (g x) \<and> (g has_derivative g' x) (at x within S)" | 
| 56183 | 1644 | unfolding sums_def | 
| 53781 | 1645 | apply (rule has_derivative_sequence[OF assms(1) _ assms(3)]) | 
| 64267 | 1646 | apply (metis assms(2) has_derivative_sum) | 
| 53781 | 1647 | using assms(4-5) | 
| 56183 | 1648 | unfolding sums_def | 
| 53781 | 1649 | apply auto | 
| 1650 | done | |
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 1651 | |
| 61531 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 1652 | lemma has_field_derivative_series: | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 1653 |   fixes f :: "nat \<Rightarrow> ('a :: {real_normed_field,banach}) \<Rightarrow> 'a"
 | 
| 68055 | 1654 | assumes "convex S" | 
| 1655 | assumes "\<And>n x. x \<in> S \<Longrightarrow> (f n has_field_derivative f' n x) (at x within S)" | |
| 1656 | assumes "uniform_limit S (\<lambda>n x. \<Sum>i<n. f' i x) g' sequentially" | |
| 1657 | assumes "x0 \<in> S" "summable (\<lambda>n. f n x0)" | |
| 1658 | shows "\<exists>g. \<forall>x\<in>S. (\<lambda>n. f n x) sums g x \<and> (g has_field_derivative g' x) (at x within S)" | |
| 61531 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 1659 | unfolding has_field_derivative_def | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 1660 | proof (rule has_derivative_series) | 
| 68239 | 1661 | show "\<forall>\<^sub>F n in sequentially. | 
| 1662 | \<forall>x\<in>S. \<forall>h. norm ((\<Sum>i<n. f' i x * h) - g' x * h) \<le> e * norm h" if "e > 0" for e | |
| 1663 | unfolding eventually_sequentially | |
| 68055 | 1664 | proof - | 
| 1665 | from that assms(3) obtain N where N: "\<And>n x. n \<ge> N \<Longrightarrow> x \<in> S \<Longrightarrow> norm ((\<Sum>i<n. f' i x) - g' x) < e" | |
| 61531 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 1666 | unfolding uniform_limit_iff eventually_at_top_linorder dist_norm by blast | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 1667 |     {
 | 
| 68055 | 1668 | fix n :: nat and x h :: 'a assume nx: "n \<ge> N" "x \<in> S" | 
| 61531 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 1669 | have "norm ((\<Sum>i<n. f' i x * h) - g' x * h) = norm ((\<Sum>i<n. f' i x) - g' x) * norm h" | 
| 64267 | 1670 | by (simp add: norm_mult [symmetric] ring_distribs sum_distrib_right) | 
| 61531 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 1671 | also from N[OF nx] have "norm ((\<Sum>i<n. f' i x) - g' x) \<le> e" by simp | 
| 61649 
268d88ec9087
Tweaks for "real": Removal of [iff] status for some lemmas, adding [simp] for others. Plus fixes.
 paulson <lp15@cam.ac.uk> parents: 
61560diff
changeset | 1672 | hence "norm ((\<Sum>i<n. f' i x) - g' x) * norm h \<le> e * norm h" | 
| 61531 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 1673 | by (intro mult_right_mono) simp_all | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 1674 | finally have "norm ((\<Sum>i<n. f' i x * h) - g' x * h) \<le> e * norm h" . | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 1675 | } | 
| 68055 | 1676 | thus "\<exists>N. \<forall>n\<ge>N. \<forall>x\<in>S. \<forall>h. norm ((\<Sum>i<n. f' i x * h) - g' x * h) \<le> e * norm h" by blast | 
| 61531 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 1677 | qed | 
| 68055 | 1678 | qed (use assms in \<open>auto simp: has_field_derivative_def\<close>) | 
| 61531 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 1679 | |
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 1680 | lemma has_field_derivative_series': | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 1681 |   fixes f :: "nat \<Rightarrow> ('a :: {real_normed_field,banach}) \<Rightarrow> 'a"
 | 
| 68055 | 1682 | assumes "convex S" | 
| 1683 | assumes "\<And>n x. x \<in> S \<Longrightarrow> (f n has_field_derivative f' n x) (at x within S)" | |
| 1684 | assumes "uniformly_convergent_on S (\<lambda>n x. \<Sum>i<n. f' i x)" | |
| 1685 | assumes "x0 \<in> S" "summable (\<lambda>n. f n x0)" "x \<in> interior S" | |
| 61531 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 1686 | shows "summable (\<lambda>n. f n x)" "((\<lambda>x. \<Sum>n. f n x) has_field_derivative (\<Sum>n. f' n x)) (at x)" | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 1687 | proof - | 
| 68055 | 1688 | from \<open>x \<in> interior S\<close> have "x \<in> S" using interior_subset by blast | 
| 63040 | 1689 | define g' where [abs_def]: "g' x = (\<Sum>i. f' i x)" for x | 
| 68055 | 1690 | from assms(3) have "uniform_limit S (\<lambda>n x. \<Sum>i<n. f' i x) g' sequentially" | 
| 61531 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 1691 | by (simp add: uniformly_convergent_uniform_limit_iff suminf_eq_lim g'_def) | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 1692 | from has_field_derivative_series[OF assms(1,2) this assms(4,5)] obtain g where g: | 
| 68055 | 1693 | "\<And>x. x \<in> S \<Longrightarrow> (\<lambda>n. f n x) sums g x" | 
| 1694 | "\<And>x. x \<in> S \<Longrightarrow> (g has_field_derivative g' x) (at x within S)" by blast | |
| 1695 | from g(1)[OF \<open>x \<in> S\<close>] show "summable (\<lambda>n. f n x)" by (simp add: sums_iff) | |
| 1696 | from g(2)[OF \<open>x \<in> S\<close>] \<open>x \<in> interior S\<close> have "(g has_field_derivative g' x) (at x)" | |
| 1697 | by (simp add: at_within_interior[of x S]) | |
| 61649 
268d88ec9087
Tweaks for "real": Removal of [iff] status for some lemmas, adding [simp] for others. Plus fixes.
 paulson <lp15@cam.ac.uk> parents: 
61560diff
changeset | 1698 | also have "(g has_field_derivative g' x) (at x) \<longleftrightarrow> | 
| 61531 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 1699 | ((\<lambda>x. \<Sum>n. f n x) has_field_derivative g' x) (at x)" | 
| 68055 | 1700 | using eventually_nhds_in_nhd[OF \<open>x \<in> interior S\<close>] interior_subset[of S] g(1) | 
| 61810 | 1701 | by (intro DERIV_cong_ev) (auto elim!: eventually_mono simp: sums_iff) | 
| 61531 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 1702 | finally show "((\<lambda>x. \<Sum>n. f n x) has_field_derivative g' x) (at x)" . | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 1703 | qed | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 1704 | |
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 1705 | lemma differentiable_series: | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 1706 |   fixes f :: "nat \<Rightarrow> ('a :: {real_normed_field,banach}) \<Rightarrow> 'a"
 | 
| 68055 | 1707 | assumes "convex S" "open S" | 
| 1708 | assumes "\<And>n x. x \<in> S \<Longrightarrow> (f n has_field_derivative f' n x) (at x)" | |
| 1709 | assumes "uniformly_convergent_on S (\<lambda>n x. \<Sum>i<n. f' i x)" | |
| 1710 | assumes "x0 \<in> S" "summable (\<lambda>n. f n x0)" and x: "x \<in> S" | |
| 61531 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 1711 | shows "summable (\<lambda>n. f n x)" and "(\<lambda>x. \<Sum>n. f n x) differentiable (at x)" | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 1712 | proof - | 
| 68055 | 1713 | from assms(4) obtain g' where A: "uniform_limit S (\<lambda>n x. \<Sum>i<n. f' i x) g' sequentially" | 
| 61531 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 1714 | unfolding uniformly_convergent_on_def by blast | 
| 68055 | 1715 | from x and \<open>open S\<close> have S: "at x within S = at x" by (rule at_within_open) | 
| 1716 | have "\<exists>g. \<forall>x\<in>S. (\<lambda>n. f n x) sums g x \<and> (g has_field_derivative g' x) (at x within S)" | |
| 1717 | by (intro has_field_derivative_series[of S f f' g' x0] assms A has_field_derivative_at_within) | |
| 1718 | then obtain g where g: "\<And>x. x \<in> S \<Longrightarrow> (\<lambda>n. f n x) sums g x" | |
| 1719 | "\<And>x. x \<in> S \<Longrightarrow> (g has_field_derivative g' x) (at x within S)" by blast | |
| 61531 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 1720 | from g[OF x] show "summable (\<lambda>n. f n x)" by (auto simp: summable_def) | 
| 69064 
5840724b1d71
Prefix form of infix with * on either side no longer needs special treatment
 nipkow parents: 
69020diff
changeset | 1721 | from g(2)[OF x] have g': "(g has_derivative (*) (g' x)) (at x)" | 
| 68055 | 1722 | by (simp add: has_field_derivative_def S) | 
| 69064 
5840724b1d71
Prefix form of infix with * on either side no longer needs special treatment
 nipkow parents: 
69020diff
changeset | 1723 | have "((\<lambda>x. \<Sum>n. f n x) has_derivative (*) (g' x)) (at x)" | 
| 68055 | 1724 | by (rule has_derivative_transform_within_open[OF g' \<open>open S\<close> x]) | 
| 61531 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 1725 | (insert g, auto simp: sums_iff) | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 1726 | thus "(\<lambda>x. \<Sum>n. f n x) differentiable (at x)" unfolding differentiable_def | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 1727 | by (auto simp: summable_def differentiable_def has_field_derivative_def) | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 1728 | qed | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 1729 | |
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 1730 | lemma differentiable_series': | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 1731 |   fixes f :: "nat \<Rightarrow> ('a :: {real_normed_field,banach}) \<Rightarrow> 'a"
 | 
| 68055 | 1732 | assumes "convex S" "open S" | 
| 1733 | assumes "\<And>n x. x \<in> S \<Longrightarrow> (f n has_field_derivative f' n x) (at x)" | |
| 1734 | assumes "uniformly_convergent_on S (\<lambda>n x. \<Sum>i<n. f' i x)" | |
| 1735 | assumes "x0 \<in> S" "summable (\<lambda>n. f n x0)" | |
| 61531 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 1736 | shows "(\<lambda>x. \<Sum>n. f n x) differentiable (at x0)" | 
| 68055 | 1737 | using differentiable_series[OF assms, of x0] \<open>x0 \<in> S\<close> by blast+ | 
| 61531 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 1738 | |
| 68838 | 1739 | subsection \<open>Derivative as a vector\<close> | 
| 1740 | ||
| 69597 | 1741 | text \<open>Considering derivative \<^typ>\<open>real \<Rightarrow> 'b::real_normed_vector\<close> as a vector.\<close> | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 1742 | |
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 1743 | definition "vector_derivative f net = (SOME f'. (f has_vector_derivative f') net)" | 
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 1744 | |
| 61245 | 1745 | lemma vector_derivative_unique_within: | 
| 68055 | 1746 | assumes not_bot: "at x within S \<noteq> bot" | 
| 1747 | and f': "(f has_vector_derivative f') (at x within S)" | |
| 1748 | and f'': "(f has_vector_derivative f'') (at x within S)" | |
| 37730 | 1749 | shows "f' = f''" | 
| 53781 | 1750 | proof - | 
| 37730 | 1751 | have "(\<lambda>x. x *\<^sub>R f') = (\<lambda>x. x *\<^sub>R f'')" | 
| 68239 | 1752 | proof (rule frechet_derivative_unique_within, simp_all) | 
| 1753 | show "\<exists>d. d \<noteq> 0 \<and> \<bar>d\<bar> < e \<and> x + d \<in> S" if "0 < e" for e | |
| 1754 | proof - | |
| 1755 | from that | |
| 68055 | 1756 | obtain x' where "x' \<in> S" "x' \<noteq> x" "\<bar>x' - x\<bar> < e" | 
| 68239 | 1757 | using islimpt_approachable_real[of x S] not_bot | 
| 61245 | 1758 | by (auto simp add: trivial_limit_within) | 
| 68239 | 1759 | then show ?thesis | 
| 1760 | using eq_iff_diff_eq_0 by fastforce | |
| 61245 | 1761 | qed | 
| 68239 | 1762 | qed (use f' f'' in \<open>auto simp: has_vector_derivative_def\<close>) | 
| 53781 | 1763 | then show ?thesis | 
| 61649 
268d88ec9087
Tweaks for "real": Removal of [iff] status for some lemmas, adding [simp] for others. Plus fixes.
 paulson <lp15@cam.ac.uk> parents: 
61560diff
changeset | 1764 | unfolding fun_eq_iff by (metis scaleR_one) | 
| 37730 | 1765 | qed | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 1766 | |
| 61245 | 1767 | lemma vector_derivative_unique_at: | 
| 1768 | "(f has_vector_derivative f') (at x) \<Longrightarrow> (f has_vector_derivative f'') (at x) \<Longrightarrow> f' = f''" | |
| 1769 | by (rule vector_derivative_unique_within) auto | |
| 1770 | ||
| 1771 | lemma differentiableI_vector: "(f has_vector_derivative y) F \<Longrightarrow> f differentiable F" | |
| 1772 | by (auto simp: differentiable_def has_vector_derivative_def) | |
| 1773 | ||
| 68838 | 1774 | proposition vector_derivative_works: | 
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 1775 | "f differentiable net \<longleftrightarrow> (f has_vector_derivative (vector_derivative f net)) net" | 
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 1776 | (is "?l = ?r") | 
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 1777 | proof | 
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 1778 | assume ?l | 
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 1779 | obtain f' where f': "(f has_derivative f') net" | 
| 60420 | 1780 | using \<open>?l\<close> unfolding differentiable_def .. | 
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 1781 | then interpret bounded_linear f' | 
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 1782 | by auto | 
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 1783 | show ?r | 
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 1784 | unfolding vector_derivative_def has_vector_derivative_def | 
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 1785 | by (rule someI[of _ "f' 1"]) (simp add: scaleR[symmetric] f') | 
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 1786 | qed (auto simp: vector_derivative_def has_vector_derivative_def differentiable_def) | 
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 1787 | |
| 61245 | 1788 | lemma vector_derivative_within: | 
| 68055 | 1789 | assumes not_bot: "at x within S \<noteq> bot" and y: "(f has_vector_derivative y) (at x within S)" | 
| 1790 | shows "vector_derivative f (at x within S) = y" | |
| 61245 | 1791 | using y | 
| 1792 | by (intro vector_derivative_unique_within[OF not_bot vector_derivative_works[THEN iffD1] y]) | |
| 1793 | (auto simp: differentiable_def has_vector_derivative_def) | |
| 1794 | ||
| 61520 
8f85bb443d33
Cauchy's integral formula, required lemmas, and a bit of reorganisation
 paulson <lp15@cam.ac.uk> parents: 
61518diff
changeset | 1795 | lemma frechet_derivative_eq_vector_derivative: | 
| 
8f85bb443d33
Cauchy's integral formula, required lemmas, and a bit of reorganisation
 paulson <lp15@cam.ac.uk> parents: 
61518diff
changeset | 1796 | assumes "f differentiable (at x)" | 
| 
8f85bb443d33
Cauchy's integral formula, required lemmas, and a bit of reorganisation
 paulson <lp15@cam.ac.uk> parents: 
61518diff
changeset | 1797 | shows "(frechet_derivative f (at x)) = (\<lambda>r. r *\<^sub>R vector_derivative f (at x))" | 
| 
8f85bb443d33
Cauchy's integral formula, required lemmas, and a bit of reorganisation
 paulson <lp15@cam.ac.uk> parents: 
61518diff
changeset | 1798 | using assms | 
| 
8f85bb443d33
Cauchy's integral formula, required lemmas, and a bit of reorganisation
 paulson <lp15@cam.ac.uk> parents: 
61518diff
changeset | 1799 | by (auto simp: differentiable_iff_scaleR vector_derivative_def has_vector_derivative_def | 
| 
8f85bb443d33
Cauchy's integral formula, required lemmas, and a bit of reorganisation
 paulson <lp15@cam.ac.uk> parents: 
61518diff
changeset | 1800 | intro: someI frechet_derivative_at [symmetric]) | 
| 
8f85bb443d33
Cauchy's integral formula, required lemmas, and a bit of reorganisation
 paulson <lp15@cam.ac.uk> parents: 
61518diff
changeset | 1801 | |
| 
8f85bb443d33
Cauchy's integral formula, required lemmas, and a bit of reorganisation
 paulson <lp15@cam.ac.uk> parents: 
61518diff
changeset | 1802 | lemma has_real_derivative: | 
| 61649 
268d88ec9087
Tweaks for "real": Removal of [iff] status for some lemmas, adding [simp] for others. Plus fixes.
 paulson <lp15@cam.ac.uk> parents: 
61560diff
changeset | 1803 | fixes f :: "real \<Rightarrow> real" | 
| 61520 
8f85bb443d33
Cauchy's integral formula, required lemmas, and a bit of reorganisation
 paulson <lp15@cam.ac.uk> parents: 
61518diff
changeset | 1804 | assumes "(f has_derivative f') F" | 
| 
8f85bb443d33
Cauchy's integral formula, required lemmas, and a bit of reorganisation
 paulson <lp15@cam.ac.uk> parents: 
61518diff
changeset | 1805 | obtains c where "(f has_real_derivative c) F" | 
| 
8f85bb443d33
Cauchy's integral formula, required lemmas, and a bit of reorganisation
 paulson <lp15@cam.ac.uk> parents: 
61518diff
changeset | 1806 | proof - | 
| 
8f85bb443d33
Cauchy's integral formula, required lemmas, and a bit of reorganisation
 paulson <lp15@cam.ac.uk> parents: 
61518diff
changeset | 1807 | obtain c where "f' = (\<lambda>x. x * c)" | 
| 
8f85bb443d33
Cauchy's integral formula, required lemmas, and a bit of reorganisation
 paulson <lp15@cam.ac.uk> parents: 
61518diff
changeset | 1808 | by (metis assms has_derivative_bounded_linear real_bounded_linear) | 
| 
8f85bb443d33
Cauchy's integral formula, required lemmas, and a bit of reorganisation
 paulson <lp15@cam.ac.uk> parents: 
61518diff
changeset | 1809 | then show ?thesis | 
| 
8f85bb443d33
Cauchy's integral formula, required lemmas, and a bit of reorganisation
 paulson <lp15@cam.ac.uk> parents: 
61518diff
changeset | 1810 | by (metis assms that has_field_derivative_def mult_commute_abs) | 
| 
8f85bb443d33
Cauchy's integral formula, required lemmas, and a bit of reorganisation
 paulson <lp15@cam.ac.uk> parents: 
61518diff
changeset | 1811 | qed | 
| 
8f85bb443d33
Cauchy's integral formula, required lemmas, and a bit of reorganisation
 paulson <lp15@cam.ac.uk> parents: 
61518diff
changeset | 1812 | |
| 
8f85bb443d33
Cauchy's integral formula, required lemmas, and a bit of reorganisation
 paulson <lp15@cam.ac.uk> parents: 
61518diff
changeset | 1813 | lemma has_real_derivative_iff: | 
| 61649 
268d88ec9087
Tweaks for "real": Removal of [iff] status for some lemmas, adding [simp] for others. Plus fixes.
 paulson <lp15@cam.ac.uk> parents: 
61560diff
changeset | 1814 | fixes f :: "real \<Rightarrow> real" | 
| 61520 
8f85bb443d33
Cauchy's integral formula, required lemmas, and a bit of reorganisation
 paulson <lp15@cam.ac.uk> parents: 
61518diff
changeset | 1815 | shows "(\<exists>c. (f has_real_derivative c) F) = (\<exists>D. (f has_derivative D) F)" | 
| 
8f85bb443d33
Cauchy's integral formula, required lemmas, and a bit of reorganisation
 paulson <lp15@cam.ac.uk> parents: 
61518diff
changeset | 1816 | by (metis has_field_derivative_def has_real_derivative) | 
| 
8f85bb443d33
Cauchy's integral formula, required lemmas, and a bit of reorganisation
 paulson <lp15@cam.ac.uk> parents: 
61518diff
changeset | 1817 | |
| 64008 
17a20ca86d62
HOL-Probability: more about probability, prepare for Markov processes in the AFP
 hoelzl parents: 
63955diff
changeset | 1818 | lemma has_vector_derivative_cong_ev: | 
| 68055 | 1819 | assumes *: "eventually (\<lambda>x. x \<in> S \<longrightarrow> f x = g x) (nhds x)" "f x = g x" | 
| 1820 | shows "(f has_vector_derivative f') (at x within S) = (g has_vector_derivative f') (at x within S)" | |
| 64008 
17a20ca86d62
HOL-Probability: more about probability, prepare for Markov processes in the AFP
 hoelzl parents: 
63955diff
changeset | 1821 | unfolding has_vector_derivative_def has_derivative_def | 
| 
17a20ca86d62
HOL-Probability: more about probability, prepare for Markov processes in the AFP
 hoelzl parents: 
63955diff
changeset | 1822 | using * | 
| 68055 | 1823 | apply (cases "at x within S \<noteq> bot") | 
| 64008 
17a20ca86d62
HOL-Probability: more about probability, prepare for Markov processes in the AFP
 hoelzl parents: 
63955diff
changeset | 1824 | apply (intro refl conj_cong filterlim_cong) | 
| 70065 
cc89a395b5a3
Free_Abelian_Groups finally working; fixed some duplicates; cleaned up some proofs
 paulson <lp15@cam.ac.uk> parents: 
69712diff
changeset | 1825 | apply (auto simp: Lim_ident_at eventually_at_filter elim: eventually_mono) | 
| 64008 
17a20ca86d62
HOL-Probability: more about probability, prepare for Markov processes in the AFP
 hoelzl parents: 
63955diff
changeset | 1826 | done | 
| 
17a20ca86d62
HOL-Probability: more about probability, prepare for Markov processes in the AFP
 hoelzl parents: 
63955diff
changeset | 1827 | |
| 61245 | 1828 | lemma islimpt_closure_open: | 
| 1829 | fixes s :: "'a::perfect_space set" | |
| 1830 | assumes "open s" and t: "t = closure s" "x \<in> t" | |
| 1831 | shows "x islimpt t" | |
| 1832 | proof cases | |
| 61649 
268d88ec9087
Tweaks for "real": Removal of [iff] status for some lemmas, adding [simp] for others. Plus fixes.
 paulson <lp15@cam.ac.uk> parents: 
61560diff
changeset | 1833 | assume "x \<in> s" | 
| 61245 | 1834 |   { fix T assume "x \<in> T" "open T"
 | 
| 1835 | then have "open (s \<inter> T)" | |
| 1836 | using \<open>open s\<close> by auto | |
| 1837 |     then have "s \<inter> T \<noteq> {x}"
 | |
| 1838 | using not_open_singleton[of x] by auto | |
| 1839 | with \<open>x \<in> T\<close> \<open>x \<in> s\<close> have "\<exists>y\<in>t. y \<in> T \<and> y \<noteq> x" | |
| 1840 | using closure_subset[of s] by (auto simp: t) } | |
| 1841 | then show ?thesis | |
| 1842 | by (auto intro!: islimptI) | |
| 1843 | next | |
| 1844 | assume "x \<notin> s" with t show ?thesis | |
| 1845 | unfolding t closure_def by (auto intro: islimpt_subset) | |
| 1846 | qed | |
| 1847 | ||
| 44123 | 1848 | lemma vector_derivative_unique_within_closed_interval: | 
| 61245 | 1849 | assumes ab: "a < b" "x \<in> cbox a b" | 
| 1850 | assumes D: "(f has_vector_derivative f') (at x within cbox a b)" "(f has_vector_derivative f'') (at x within cbox a b)" | |
| 44123 | 1851 | shows "f' = f''" | 
| 61245 | 1852 | using ab | 
| 1853 | by (intro vector_derivative_unique_within[OF _ D]) | |
| 1854 |      (auto simp: trivial_limit_within intro!: islimpt_closure_open[where s="{a <..< b}"])
 | |
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 1855 | |
| 37730 | 1856 | lemma vector_derivative_at: | 
| 53781 | 1857 | "(f has_vector_derivative f') (at x) \<Longrightarrow> vector_derivative f (at x) = f'" | 
| 61245 | 1858 | by (intro vector_derivative_within at_neq_bot) | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 1859 | |
| 61104 
3c2d4636cebc
new lemmas about vector_derivative, complex numbers, paths, etc.
 paulson parents: 
61076diff
changeset | 1860 | lemma has_vector_derivative_id_at [simp]: "vector_derivative (\<lambda>x. x) (at a) = 1" | 
| 
3c2d4636cebc
new lemmas about vector_derivative, complex numbers, paths, etc.
 paulson parents: 
61076diff
changeset | 1861 | by (simp add: vector_derivative_at) | 
| 
3c2d4636cebc
new lemmas about vector_derivative, complex numbers, paths, etc.
 paulson parents: 
61076diff
changeset | 1862 | |
| 
3c2d4636cebc
new lemmas about vector_derivative, complex numbers, paths, etc.
 paulson parents: 
61076diff
changeset | 1863 | lemma vector_derivative_minus_at [simp]: | 
| 
3c2d4636cebc
new lemmas about vector_derivative, complex numbers, paths, etc.
 paulson parents: 
61076diff
changeset | 1864 | "f differentiable at a | 
| 
3c2d4636cebc
new lemmas about vector_derivative, complex numbers, paths, etc.
 paulson parents: 
61076diff
changeset | 1865 | \<Longrightarrow> vector_derivative (\<lambda>x. - f x) (at a) = - vector_derivative f (at a)" | 
| 
3c2d4636cebc
new lemmas about vector_derivative, complex numbers, paths, etc.
 paulson parents: 
61076diff
changeset | 1866 | by (simp add: vector_derivative_at has_vector_derivative_minus vector_derivative_works [symmetric]) | 
| 
3c2d4636cebc
new lemmas about vector_derivative, complex numbers, paths, etc.
 paulson parents: 
61076diff
changeset | 1867 | |
| 
3c2d4636cebc
new lemmas about vector_derivative, complex numbers, paths, etc.
 paulson parents: 
61076diff
changeset | 1868 | lemma vector_derivative_add_at [simp]: | 
| 
3c2d4636cebc
new lemmas about vector_derivative, complex numbers, paths, etc.
 paulson parents: 
61076diff
changeset | 1869 | "\<lbrakk>f differentiable at a; g differentiable at a\<rbrakk> | 
| 
3c2d4636cebc
new lemmas about vector_derivative, complex numbers, paths, etc.
 paulson parents: 
61076diff
changeset | 1870 | \<Longrightarrow> vector_derivative (\<lambda>x. f x + g x) (at a) = vector_derivative f (at a) + vector_derivative g (at a)" | 
| 
3c2d4636cebc
new lemmas about vector_derivative, complex numbers, paths, etc.
 paulson parents: 
61076diff
changeset | 1871 | by (simp add: vector_derivative_at has_vector_derivative_add vector_derivative_works [symmetric]) | 
| 
3c2d4636cebc
new lemmas about vector_derivative, complex numbers, paths, etc.
 paulson parents: 
61076diff
changeset | 1872 | |
| 
3c2d4636cebc
new lemmas about vector_derivative, complex numbers, paths, etc.
 paulson parents: 
61076diff
changeset | 1873 | lemma vector_derivative_diff_at [simp]: | 
| 
3c2d4636cebc
new lemmas about vector_derivative, complex numbers, paths, etc.
 paulson parents: 
61076diff
changeset | 1874 | "\<lbrakk>f differentiable at a; g differentiable at a\<rbrakk> | 
| 
3c2d4636cebc
new lemmas about vector_derivative, complex numbers, paths, etc.
 paulson parents: 
61076diff
changeset | 1875 | \<Longrightarrow> vector_derivative (\<lambda>x. f x - g x) (at a) = vector_derivative f (at a) - vector_derivative g (at a)" | 
| 
3c2d4636cebc
new lemmas about vector_derivative, complex numbers, paths, etc.
 paulson parents: 
61076diff
changeset | 1876 | by (simp add: vector_derivative_at has_vector_derivative_diff vector_derivative_works [symmetric]) | 
| 
3c2d4636cebc
new lemmas about vector_derivative, complex numbers, paths, etc.
 paulson parents: 
61076diff
changeset | 1877 | |
| 61204 | 1878 | lemma vector_derivative_mult_at [simp]: | 
| 1879 | fixes f g :: "real \<Rightarrow> 'a :: real_normed_algebra" | |
| 1880 | shows "\<lbrakk>f differentiable at a; g differentiable at a\<rbrakk> | |
| 1881 | \<Longrightarrow> vector_derivative (\<lambda>x. f x * g x) (at a) = f a * vector_derivative g (at a) + vector_derivative f (at a) * g a" | |
| 1882 | by (simp add: vector_derivative_at has_vector_derivative_mult vector_derivative_works [symmetric]) | |
| 1883 | ||
| 1884 | lemma vector_derivative_scaleR_at [simp]: | |
| 1885 | "\<lbrakk>f differentiable at a; g differentiable at a\<rbrakk> | |
| 1886 | \<Longrightarrow> vector_derivative (\<lambda>x. f x *\<^sub>R g x) (at a) = f a *\<^sub>R vector_derivative g (at a) + vector_derivative f (at a) *\<^sub>R g a" | |
| 1887 | apply (rule vector_derivative_at) | |
| 1888 | apply (rule has_vector_derivative_scaleR) | |
| 1889 | apply (auto simp: vector_derivative_works has_vector_derivative_def has_field_derivative_def mult_commute_abs) | |
| 1890 | done | |
| 1891 | ||
| 67685 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 1892 | lemma vector_derivative_within_cbox: | 
| 61245 | 1893 | assumes ab: "a < b" "x \<in> cbox a b" | 
| 1894 | assumes f: "(f has_vector_derivative f') (at x within cbox a b)" | |
| 56188 | 1895 | shows "vector_derivative f (at x within cbox a b) = f'" | 
| 61245 | 1896 | by (intro vector_derivative_unique_within_closed_interval[OF ab _ f] | 
| 1897 | vector_derivative_works[THEN iffD1] differentiableI_vector) | |
| 1898 | fact | |
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 1899 | |
| 67685 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 1900 | lemma vector_derivative_within_closed_interval: | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 1901 | fixes f::"real \<Rightarrow> 'a::euclidean_space" | 
| 68239 | 1902 |   assumes "a < b" and "x \<in> {a..b}"
 | 
| 1903 |   assumes "(f has_vector_derivative f') (at x within {a..b})"
 | |
| 1904 |   shows "vector_derivative f (at x within {a..b}) = f'"
 | |
| 67685 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 1905 | using assms vector_derivative_within_cbox | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 1906 | by fastforce | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 1907 | |
| 53781 | 1908 | lemma has_vector_derivative_within_subset: | 
| 68239 | 1909 | "(f has_vector_derivative f') (at x within S) \<Longrightarrow> T \<subseteq> S \<Longrightarrow> (f has_vector_derivative f') (at x within T)" | 
| 72445 
2c2de074832e
tidying and removal of legacy name
 paulson <lp15@cam.ac.uk> parents: 
71633diff
changeset | 1910 | by (auto simp: has_vector_derivative_def intro: has_derivative_subset) | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 1911 | |
| 44123 | 1912 | lemma has_vector_derivative_at_within: | 
| 68239 | 1913 | "(f has_vector_derivative f') (at x) \<Longrightarrow> (f has_vector_derivative f') (at x within S)" | 
| 44123 | 1914 | unfolding has_vector_derivative_def | 
| 67979 
53323937ee25
new material about vec, real^1, etc.
 paulson <lp15@cam.ac.uk> parents: 
67968diff
changeset | 1915 | by (rule has_derivative_at_withinI) | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 1916 | |
| 61880 
ff4d33058566
moved some theorems from the CLT proof; reordered some theorems / notation
 hoelzl parents: 
61824diff
changeset | 1917 | lemma has_vector_derivative_weaken: | 
| 68239 | 1918 | fixes x D and f g S T | 
| 1919 | assumes f: "(f has_vector_derivative D) (at x within T)" | |
| 1920 | and "x \<in> S" "S \<subseteq> T" | |
| 1921 | and "\<And>x. x \<in> S \<Longrightarrow> f x = g x" | |
| 1922 | shows "(g has_vector_derivative D) (at x within S)" | |
| 61880 
ff4d33058566
moved some theorems from the CLT proof; reordered some theorems / notation
 hoelzl parents: 
61824diff
changeset | 1923 | proof - | 
| 68239 | 1924 | have "(f has_vector_derivative D) (at x within S) \<longleftrightarrow> (g has_vector_derivative D) (at x within S)" | 
| 61880 
ff4d33058566
moved some theorems from the CLT proof; reordered some theorems / notation
 hoelzl parents: 
61824diff
changeset | 1925 | unfolding has_vector_derivative_def has_derivative_iff_norm | 
| 
ff4d33058566
moved some theorems from the CLT proof; reordered some theorems / notation
 hoelzl parents: 
61824diff
changeset | 1926 | using assms by (intro conj_cong Lim_cong_within refl) auto | 
| 
ff4d33058566
moved some theorems from the CLT proof; reordered some theorems / notation
 hoelzl parents: 
61824diff
changeset | 1927 | then show ?thesis | 
| 68239 | 1928 | using has_vector_derivative_within_subset[OF f \<open>S \<subseteq> T\<close>] by simp | 
| 61880 
ff4d33058566
moved some theorems from the CLT proof; reordered some theorems / notation
 hoelzl parents: 
61824diff
changeset | 1929 | qed | 
| 
ff4d33058566
moved some theorems from the CLT proof; reordered some theorems / notation
 hoelzl parents: 
61824diff
changeset | 1930 | |
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 1931 | lemma has_vector_derivative_transform_within: | 
| 68239 | 1932 | assumes "(f has_vector_derivative f') (at x within S)" | 
| 62087 
44841d07ef1d
revisions to limits and derivatives, plus new lemmas
 paulson parents: 
61975diff
changeset | 1933 | and "0 < d" | 
| 68239 | 1934 | and "x \<in> S" | 
| 1935 | and "\<And>x'. \<lbrakk>x'\<in>S; dist x' x < d\<rbrakk> \<Longrightarrow> f x' = g x'" | |
| 1936 | shows "(g has_vector_derivative f') (at x within S)" | |
| 53781 | 1937 | using assms | 
| 1938 | unfolding has_vector_derivative_def | |
| 44123 | 1939 | by (rule has_derivative_transform_within) | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 1940 | |
| 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 1941 | lemma has_vector_derivative_transform_within_open: | 
| 62087 
44841d07ef1d
revisions to limits and derivatives, plus new lemmas
 paulson parents: 
61975diff
changeset | 1942 | assumes "(f has_vector_derivative f') (at x)" | 
| 68239 | 1943 | and "open S" | 
| 1944 | and "x \<in> S" | |
| 1945 | and "\<And>y. y\<in>S \<Longrightarrow> f y = g y" | |
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 1946 | shows "(g has_vector_derivative f') (at x)" | 
| 53781 | 1947 | using assms | 
| 1948 | unfolding has_vector_derivative_def | |
| 44123 | 1949 | by (rule has_derivative_transform_within_open) | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 1950 | |
| 67685 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 1951 | lemma has_vector_derivative_transform: | 
| 68239 | 1952 | assumes "x \<in> S" "\<And>x. x \<in> S \<Longrightarrow> g x = f x" | 
| 1953 | assumes f': "(f has_vector_derivative f') (at x within S)" | |
| 1954 | shows "(g has_vector_derivative f') (at x within S)" | |
| 67685 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 1955 | using assms | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 1956 | unfolding has_vector_derivative_def | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 1957 | by (rule has_derivative_transform) | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 1958 | |
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 1959 | lemma vector_diff_chain_at: | 
| 44123 | 1960 | assumes "(f has_vector_derivative f') (at x)" | 
| 53781 | 1961 | and "(g has_vector_derivative g') (at (f x))" | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 1962 | shows "((g \<circ> f) has_vector_derivative (f' *\<^sub>R g')) (at x)" | 
| 68239 | 1963 | using assms has_vector_derivative_at_within has_vector_derivative_def vector_derivative_diff_chain_within by blast | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 1964 | |
| 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 1965 | lemma vector_diff_chain_within: | 
| 44123 | 1966 | assumes "(f has_vector_derivative f') (at x within s)" | 
| 53781 | 1967 | and "(g has_vector_derivative g') (at (f x) within f ` s)" | 
| 1968 | shows "((g \<circ> f) has_vector_derivative (f' *\<^sub>R g')) (at x within s)" | |
| 68239 | 1969 | using assms has_vector_derivative_def vector_derivative_diff_chain_within by blast | 
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 1970 | |
| 60762 | 1971 | lemma vector_derivative_const_at [simp]: "vector_derivative (\<lambda>x. c) (at a) = 0" | 
| 1972 | by (simp add: vector_derivative_at) | |
| 1973 | ||
| 60800 
7d04351c795a
New material for Cauchy's integral theorem
 paulson <lp15@cam.ac.uk> parents: 
60762diff
changeset | 1974 | lemma vector_derivative_at_within_ivl: | 
| 
7d04351c795a
New material for Cauchy's integral theorem
 paulson <lp15@cam.ac.uk> parents: 
60762diff
changeset | 1975 | "(f has_vector_derivative f') (at x) \<Longrightarrow> | 
| 
7d04351c795a
New material for Cauchy's integral theorem
 paulson <lp15@cam.ac.uk> parents: 
60762diff
changeset | 1976 |     a \<le> x \<Longrightarrow> x \<le> b \<Longrightarrow> a<b \<Longrightarrow> vector_derivative f (at x within {a..b}) = f'"
 | 
| 67685 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 1977 | using has_vector_derivative_at_within vector_derivative_within_cbox by fastforce | 
| 60800 
7d04351c795a
New material for Cauchy's integral theorem
 paulson <lp15@cam.ac.uk> parents: 
60762diff
changeset | 1978 | |
| 61204 | 1979 | lemma vector_derivative_chain_at: | 
| 1980 | assumes "f differentiable at x" "(g differentiable at (f x))" | |
| 1981 | shows "vector_derivative (g \<circ> f) (at x) = | |
| 1982 | vector_derivative f (at x) *\<^sub>R vector_derivative g (at (f x))" | |
| 1983 | by (metis vector_diff_chain_at vector_derivative_at vector_derivative_works assms) | |
| 1984 | ||
| 62408 
86f27b264d3d
Conformal_mappings: a big development in complex analysis (+ some lemmas)
 paulson <lp15@cam.ac.uk> parents: 
62393diff
changeset | 1985 | lemma field_vector_diff_chain_at: (*thanks to Wenda Li*) | 
| 
86f27b264d3d
Conformal_mappings: a big development in complex analysis (+ some lemmas)
 paulson <lp15@cam.ac.uk> parents: 
62393diff
changeset | 1986 | assumes Df: "(f has_vector_derivative f') (at x)" | 
| 
86f27b264d3d
Conformal_mappings: a big development in complex analysis (+ some lemmas)
 paulson <lp15@cam.ac.uk> parents: 
62393diff
changeset | 1987 | and Dg: "(g has_field_derivative g') (at (f x))" | 
| 
86f27b264d3d
Conformal_mappings: a big development in complex analysis (+ some lemmas)
 paulson <lp15@cam.ac.uk> parents: 
62393diff
changeset | 1988 | shows "((g \<circ> f) has_vector_derivative (f' * g')) (at x)" | 
| 
86f27b264d3d
Conformal_mappings: a big development in complex analysis (+ some lemmas)
 paulson <lp15@cam.ac.uk> parents: 
62393diff
changeset | 1989 | using diff_chain_at[OF Df[unfolded has_vector_derivative_def] | 
| 
86f27b264d3d
Conformal_mappings: a big development in complex analysis (+ some lemmas)
 paulson <lp15@cam.ac.uk> parents: 
62393diff
changeset | 1990 | Dg [unfolded has_field_derivative_def]] | 
| 
86f27b264d3d
Conformal_mappings: a big development in complex analysis (+ some lemmas)
 paulson <lp15@cam.ac.uk> parents: 
62393diff
changeset | 1991 | by (auto simp: o_def mult.commute has_vector_derivative_def) | 
| 
86f27b264d3d
Conformal_mappings: a big development in complex analysis (+ some lemmas)
 paulson <lp15@cam.ac.uk> parents: 
62393diff
changeset | 1992 | |
| 64394 | 1993 | lemma vector_derivative_chain_within: | 
| 68239 | 1994 | assumes "at x within S \<noteq> bot" "f differentiable (at x within S)" | 
| 1995 | "(g has_derivative g') (at (f x) within f ` S)" | |
| 1996 | shows "vector_derivative (g \<circ> f) (at x within S) = | |
| 1997 | g' (vector_derivative f (at x within S)) " | |
| 1998 | apply (rule vector_derivative_within [OF \<open>at x within S \<noteq> bot\<close>]) | |
| 64394 | 1999 | apply (rule vector_derivative_diff_chain_within) | 
| 2000 | using assms(2-3) vector_derivative_works | |
| 2001 | by auto | |
| 2002 | ||
| 69553 | 2003 | subsection \<open>Field differentiability\<close> | 
| 64394 | 2004 | |
| 70136 | 2005 | definition\<^marker>\<open>tag important\<close> field_differentiable :: "['a \<Rightarrow> 'a::real_normed_field, 'a filter] \<Rightarrow> bool" | 
| 64394 | 2006 | (infixr "(field'_differentiable)" 50) | 
| 2007 | where "f field_differentiable F \<equiv> \<exists>f'. (f has_field_derivative f') F" | |
| 2008 | ||
| 2009 | lemma field_differentiable_imp_differentiable: | |
| 2010 | "f field_differentiable F \<Longrightarrow> f differentiable F" | |
| 2011 | unfolding field_differentiable_def differentiable_def | |
| 2012 | using has_field_derivative_imp_has_derivative by auto | |
| 2013 | ||
| 2014 | lemma field_differentiable_imp_continuous_at: | |
| 68239 | 2015 | "f field_differentiable (at x within S) \<Longrightarrow> continuous (at x within S) f" | 
| 64394 | 2016 | by (metis DERIV_continuous field_differentiable_def) | 
| 2017 | ||
| 2018 | lemma field_differentiable_within_subset: | |
| 68239 | 2019 | "\<lbrakk>f field_differentiable (at x within S); T \<subseteq> S\<rbrakk> \<Longrightarrow> f field_differentiable (at x within T)" | 
| 64394 | 2020 | by (metis DERIV_subset field_differentiable_def) | 
| 2021 | ||
| 2022 | lemma field_differentiable_at_within: | |
| 2023 | "\<lbrakk>f field_differentiable (at x)\<rbrakk> | |
| 68239 | 2024 | \<Longrightarrow> f field_differentiable (at x within S)" | 
| 64394 | 2025 | unfolding field_differentiable_def | 
| 2026 | by (metis DERIV_subset top_greatest) | |
| 2027 | ||
| 69064 
5840724b1d71
Prefix form of infix with * on either side no longer needs special treatment
 nipkow parents: 
69020diff
changeset | 2028 | lemma field_differentiable_linear [simp,derivative_intros]: "((*) c) field_differentiable F" | 
| 68239 | 2029 | unfolding field_differentiable_def has_field_derivative_def mult_commute_abs | 
| 2030 | by (force intro: has_derivative_mult_right) | |
| 64394 | 2031 | |
| 2032 | lemma field_differentiable_const [simp,derivative_intros]: "(\<lambda>z. c) field_differentiable F" | |
| 2033 | unfolding field_differentiable_def has_field_derivative_def | |
| 2034 | using DERIV_const has_field_derivative_imp_has_derivative by blast | |
| 2035 | ||
| 2036 | lemma field_differentiable_ident [simp,derivative_intros]: "(\<lambda>z. z) field_differentiable F" | |
| 2037 | unfolding field_differentiable_def has_field_derivative_def | |
| 2038 | using DERIV_ident has_field_derivative_def by blast | |
| 2039 | ||
| 2040 | lemma field_differentiable_id [simp,derivative_intros]: "id field_differentiable F" | |
| 2041 | unfolding id_def by (rule field_differentiable_ident) | |
| 2042 | ||
| 2043 | lemma field_differentiable_minus [derivative_intros]: | |
| 2044 | "f field_differentiable F \<Longrightarrow> (\<lambda>z. - (f z)) field_differentiable F" | |
| 2045 | unfolding field_differentiable_def | |
| 2046 | by (metis field_differentiable_minus) | |
| 2047 | ||
| 2048 | lemma field_differentiable_add [derivative_intros]: | |
| 2049 | assumes "f field_differentiable F" "g field_differentiable F" | |
| 2050 | shows "(\<lambda>z. f z + g z) field_differentiable F" | |
| 2051 | using assms unfolding field_differentiable_def | |
| 2052 | by (metis field_differentiable_add) | |
| 2053 | ||
| 2054 | lemma field_differentiable_add_const [simp,derivative_intros]: | |
| 67399 | 2055 | "(+) c field_differentiable F" | 
| 64394 | 2056 | by (simp add: field_differentiable_add) | 
| 2057 | ||
| 2058 | lemma field_differentiable_sum [derivative_intros]: | |
| 2059 | "(\<And>i. i \<in> I \<Longrightarrow> (f i) field_differentiable F) \<Longrightarrow> (\<lambda>z. \<Sum>i\<in>I. f i z) field_differentiable F" | |
| 2060 | by (induct I rule: infinite_finite_induct) | |
| 2061 | (auto intro: field_differentiable_add field_differentiable_const) | |
| 2062 | ||
| 2063 | lemma field_differentiable_diff [derivative_intros]: | |
| 2064 | assumes "f field_differentiable F" "g field_differentiable F" | |
| 2065 | shows "(\<lambda>z. f z - g z) field_differentiable F" | |
| 2066 | using assms unfolding field_differentiable_def | |
| 2067 | by (metis field_differentiable_diff) | |
| 2068 | ||
| 2069 | lemma field_differentiable_inverse [derivative_intros]: | |
| 68239 | 2070 | assumes "f field_differentiable (at a within S)" "f a \<noteq> 0" | 
| 2071 | shows "(\<lambda>z. inverse (f z)) field_differentiable (at a within S)" | |
| 64394 | 2072 | using assms unfolding field_differentiable_def | 
| 2073 | by (metis DERIV_inverse_fun) | |
| 2074 | ||
| 2075 | lemma field_differentiable_mult [derivative_intros]: | |
| 68239 | 2076 | assumes "f field_differentiable (at a within S)" | 
| 2077 | "g field_differentiable (at a within S)" | |
| 2078 | shows "(\<lambda>z. f z * g z) field_differentiable (at a within S)" | |
| 64394 | 2079 | using assms unfolding field_differentiable_def | 
| 68239 | 2080 | by (metis DERIV_mult [of f _ a S g]) | 
| 64394 | 2081 | |
| 2082 | lemma field_differentiable_divide [derivative_intros]: | |
| 68239 | 2083 | assumes "f field_differentiable (at a within S)" | 
| 2084 | "g field_differentiable (at a within S)" | |
| 64394 | 2085 | "g a \<noteq> 0" | 
| 68239 | 2086 | shows "(\<lambda>z. f z / g z) field_differentiable (at a within S)" | 
| 64394 | 2087 | using assms unfolding field_differentiable_def | 
| 68239 | 2088 | by (metis DERIV_divide [of f _ a S g]) | 
| 64394 | 2089 | |
| 2090 | lemma field_differentiable_power [derivative_intros]: | |
| 68239 | 2091 | assumes "f field_differentiable (at a within S)" | 
| 2092 | shows "(\<lambda>z. f z ^ n) field_differentiable (at a within S)" | |
| 64394 | 2093 | using assms unfolding field_differentiable_def | 
| 2094 | by (metis DERIV_power) | |
| 2095 | ||
| 2096 | lemma field_differentiable_transform_within: | |
| 2097 | "0 < d \<Longrightarrow> | |
| 68239 | 2098 | x \<in> S \<Longrightarrow> | 
| 2099 | (\<And>x'. x' \<in> S \<Longrightarrow> dist x' x < d \<Longrightarrow> f x' = g x') \<Longrightarrow> | |
| 2100 | f field_differentiable (at x within S) | |
| 2101 | \<Longrightarrow> g field_differentiable (at x within S)" | |
| 64394 | 2102 | unfolding field_differentiable_def has_field_derivative_def | 
| 2103 | by (blast intro: has_derivative_transform_within) | |
| 2104 | ||
| 2105 | lemma field_differentiable_compose_within: | |
| 68239 | 2106 | assumes "f field_differentiable (at a within S)" | 
| 2107 | "g field_differentiable (at (f a) within f`S)" | |
| 2108 | shows "(g o f) field_differentiable (at a within S)" | |
| 64394 | 2109 | using assms unfolding field_differentiable_def | 
| 2110 | by (metis DERIV_image_chain) | |
| 2111 | ||
| 2112 | lemma field_differentiable_compose: | |
| 2113 | "f field_differentiable at z \<Longrightarrow> g field_differentiable at (f z) | |
| 2114 | \<Longrightarrow> (g o f) field_differentiable at z" | |
| 2115 | by (metis field_differentiable_at_within field_differentiable_compose_within) | |
| 2116 | ||
| 2117 | lemma field_differentiable_within_open: | |
| 68239 | 2118 | "\<lbrakk>a \<in> S; open S\<rbrakk> \<Longrightarrow> f field_differentiable at a within S \<longleftrightarrow> | 
| 64394 | 2119 | f field_differentiable at a" | 
| 2120 | unfolding field_differentiable_def | |
| 2121 | by (metis at_within_open) | |
| 2122 | ||
| 62949 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2123 | lemma exp_scaleR_has_vector_derivative_right: | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2124 | "((\<lambda>t. exp (t *\<^sub>R A)) has_vector_derivative exp (t *\<^sub>R A) * A) (at t within T)" | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2125 | unfolding has_vector_derivative_def | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2126 | proof (rule has_derivativeI) | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2127 |   let ?F = "at t within (T \<inter> {t - 1 <..< t + 1})"
 | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2128 | have *: "at t within T = ?F" | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2129 |     by (rule at_within_nhd[where S="{t - 1 <..< t + 1}"]) auto
 | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2130 | let ?e = "\<lambda>i x. (inverse (1 + real i) * inverse (fact i) * (x - t) ^ i) *\<^sub>R (A * A ^ i)" | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2131 | have "\<forall>\<^sub>F n in sequentially. | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2132 |       \<forall>x\<in>T \<inter> {t - 1<..<t + 1}. norm (?e n x) \<le> norm (A ^ (n + 1) /\<^sub>R fact (n + 1))"
 | 
| 70817 
dd675800469d
dedicated fact collections for algebraic simplification rules potentially splitting goals
 haftmann parents: 
70802diff
changeset | 2133 | apply (auto simp: algebra_split_simps intro!: eventuallyI) | 
| 
dd675800469d
dedicated fact collections for algebraic simplification rules potentially splitting goals
 haftmann parents: 
70802diff
changeset | 2134 | apply (rule mult_left_mono) | 
| 
dd675800469d
dedicated fact collections for algebraic simplification rules potentially splitting goals
 haftmann parents: 
70802diff
changeset | 2135 | apply (auto simp add: field_simps power_abs intro!: divide_right_mono power_le_one) | 
| 
dd675800469d
dedicated fact collections for algebraic simplification rules potentially splitting goals
 haftmann parents: 
70802diff
changeset | 2136 | done | 
| 62949 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2137 |   then have "uniform_limit (T \<inter> {t - 1<..<t + 1}) (\<lambda>n x. \<Sum>i<n. ?e i x) (\<lambda>x. \<Sum>i. ?e i x) sequentially"
 | 
| 69529 | 2138 | by (rule Weierstrass_m_test_ev) (intro summable_ignore_initial_segment summable_norm_exp) | 
| 62949 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2139 | moreover | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2140 | have "\<forall>\<^sub>F x in sequentially. x > 0" | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2141 | by (metis eventually_gt_at_top) | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2142 | then have | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2143 | "\<forall>\<^sub>F n in sequentially. ((\<lambda>x. \<Sum>i<n. ?e i x) \<longlongrightarrow> A) ?F" | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2144 | by eventually_elim | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2145 | (auto intro!: tendsto_eq_intros | 
| 69529 | 2146 | simp: power_0_left if_distrib if_distribR | 
| 62949 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2147 | cong: if_cong) | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2148 | ultimately | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2149 | have [tendsto_intros]: "((\<lambda>x. \<Sum>i. ?e i x) \<longlongrightarrow> A) ?F" | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2150 | by (auto intro!: swap_uniform_limit[where f="\<lambda>n x. \<Sum>i < n. ?e i x" and F = sequentially]) | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2151 | have [tendsto_intros]: "((\<lambda>x. if x = t then 0 else 1) \<longlongrightarrow> 1) ?F" | 
| 70365 
4df0628e8545
a few new lemmas and a bit of tidying
 paulson <lp15@cam.ac.uk> parents: 
70346diff
changeset | 2152 | by (rule tendsto_eventually) (simp add: eventually_at_filter) | 
| 62949 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2153 | have "((\<lambda>y. ((y - t) / abs (y - t)) *\<^sub>R ((\<Sum>n. ?e n y) - A)) \<longlongrightarrow> 0) (at t within T)" | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2154 | unfolding * | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2155 | by (rule tendsto_norm_zero_cancel) (auto intro!: tendsto_eq_intros) | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2156 | |
| 68239 | 2157 | moreover have "\<forall>\<^sub>F x in at t within T. x \<noteq> t" | 
| 62949 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2158 | by (simp add: eventually_at_filter) | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2159 | then have "\<forall>\<^sub>F x in at t within T. ((x - t) / \<bar>x - t\<bar>) *\<^sub>R ((\<Sum>n. ?e n x) - A) = | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2160 | (exp ((x - t) *\<^sub>R A) - 1 - (x - t) *\<^sub>R A) /\<^sub>R norm (x - t)" | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2161 | proof eventually_elim | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2162 | case (elim x) | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2163 | have "(exp ((x - t) *\<^sub>R A) - 1 - (x - t) *\<^sub>R A) /\<^sub>R norm (x - t) = | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2164 | ((\<Sum>n. (x - t) *\<^sub>R ?e n x) - (x - t) *\<^sub>R A) /\<^sub>R norm (x - t)" | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2165 | unfolding exp_first_term | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2166 | by (simp add: ac_simps) | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2167 | also | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2168 | have "summable (\<lambda>n. ?e n x)" | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2169 | proof - | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2170 | from elim have "?e n x = (((x - t) *\<^sub>R A) ^ (n + 1)) /\<^sub>R fact (n + 1) /\<^sub>R (x - t)" for n | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2171 | by simp | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2172 | then show ?thesis | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2173 | by (auto simp only: | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2174 | intro!: summable_scaleR_right summable_ignore_initial_segment summable_exp_generic) | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2175 | qed | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2176 | then have "(\<Sum>n. (x - t) *\<^sub>R ?e n x) = (x - t) *\<^sub>R (\<Sum>n. ?e n x)" | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2177 | by (rule suminf_scaleR_right[symmetric]) | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2178 | also have "(\<dots> - (x - t) *\<^sub>R A) /\<^sub>R norm (x - t) = (x - t) *\<^sub>R ((\<Sum>n. ?e n x) - A) /\<^sub>R norm (x - t)" | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2179 | by (simp add: algebra_simps) | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2180 | finally show ?case | 
| 70817 
dd675800469d
dedicated fact collections for algebraic simplification rules potentially splitting goals
 haftmann parents: 
70802diff
changeset | 2181 | by simp (simp add: field_simps) | 
| 62949 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2182 | qed | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2183 | |
| 68239 | 2184 | ultimately have "((\<lambda>y. (exp ((y - t) *\<^sub>R A) - 1 - (y - t) *\<^sub>R A) /\<^sub>R norm (y - t)) \<longlongrightarrow> 0) (at t within T)" | 
| 70532 
fcf3b891ccb1
new material; rotated premises of Lim_transform_eventually
 paulson <lp15@cam.ac.uk> parents: 
70381diff
changeset | 2185 | by (rule Lim_transform_eventually) | 
| 62949 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2186 | from tendsto_mult_right_zero[OF this, where c="exp (t *\<^sub>R A)"] | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2187 | show "((\<lambda>y. (exp (y *\<^sub>R A) - exp (t *\<^sub>R A) - (y - t) *\<^sub>R (exp (t *\<^sub>R A) * A)) /\<^sub>R norm (y - t)) \<longlongrightarrow> 0) | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2188 | (at t within T)" | 
| 70532 
fcf3b891ccb1
new material; rotated premises of Lim_transform_eventually
 paulson <lp15@cam.ac.uk> parents: 
70381diff
changeset | 2189 | by (rule Lim_transform_eventually) | 
| 71633 | 2190 | (auto simp: field_split_simps exp_add_commuting[symmetric]) | 
| 62949 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2191 | qed (rule bounded_linear_scaleR_left) | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2192 | |
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2193 | lemma exp_times_scaleR_commute: "exp (t *\<^sub>R A) * A = A * exp (t *\<^sub>R A)" | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2194 | using exp_times_arg_commute[symmetric, of "t *\<^sub>R A"] | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2195 | by (auto simp: algebra_simps) | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2196 | |
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2197 | lemma exp_scaleR_has_vector_derivative_left: "((\<lambda>t. exp (t *\<^sub>R A)) has_vector_derivative A * exp (t *\<^sub>R A)) (at t)" | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2198 | using exp_scaleR_has_vector_derivative_right[of A t] | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2199 | by (simp add: exp_times_scaleR_commute) | 
| 
f36a54da47a4
added derivative of scaling in exponential function
 immler parents: 
62533diff
changeset | 2200 | |
| 71167 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 2201 | lemma field_differentiable_series: | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 2202 |   fixes f :: "nat \<Rightarrow> 'a::{real_normed_field,banach} \<Rightarrow> 'a"
 | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 2203 | assumes "convex S" "open S" | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 2204 | assumes "\<And>n x. x \<in> S \<Longrightarrow> (f n has_field_derivative f' n x) (at x)" | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 2205 | assumes "uniformly_convergent_on S (\<lambda>n x. \<Sum>i<n. f' i x)" | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 2206 | assumes "x0 \<in> S" "summable (\<lambda>n. f n x0)" and x: "x \<in> S" | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 2207 | shows "(\<lambda>x. \<Sum>n. f n x) field_differentiable (at x)" | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 2208 | proof - | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 2209 | from assms(4) obtain g' where A: "uniform_limit S (\<lambda>n x. \<Sum>i<n. f' i x) g' sequentially" | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 2210 | unfolding uniformly_convergent_on_def by blast | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 2211 | from x and \<open>open S\<close> have S: "at x within S = at x" by (rule at_within_open) | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 2212 | have "\<exists>g. \<forall>x\<in>S. (\<lambda>n. f n x) sums g x \<and> (g has_field_derivative g' x) (at x within S)" | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 2213 | by (intro has_field_derivative_series[of S f f' g' x0] assms A has_field_derivative_at_within) | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 2214 | then obtain g where g: "\<And>x. x \<in> S \<Longrightarrow> (\<lambda>n. f n x) sums g x" | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 2215 | "\<And>x. x \<in> S \<Longrightarrow> (g has_field_derivative g' x) (at x within S)" by blast | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 2216 | from g(2)[OF x] have g': "(g has_derivative (*) (g' x)) (at x)" | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 2217 | by (simp add: has_field_derivative_def S) | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 2218 | have "((\<lambda>x. \<Sum>n. f n x) has_derivative (*) (g' x)) (at x)" | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 2219 | by (rule has_derivative_transform_within_open[OF g' \<open>open S\<close> x]) | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 2220 | (insert g, auto simp: sums_iff) | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 2221 | thus "(\<lambda>x. \<Sum>n. f n x) field_differentiable (at x)" unfolding differentiable_def | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 2222 | by (auto simp: summable_def field_differentiable_def has_field_derivative_def) | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 2223 | qed | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 2224 | |
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 2225 | subsubsection\<^marker>\<open>tag unimportant\<close>\<open>Caratheodory characterization\<close> | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 2226 | |
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 2227 | lemma field_differentiable_caratheodory_at: | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 2228 | "f field_differentiable (at z) \<longleftrightarrow> | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 2229 | (\<exists>g. (\<forall>w. f(w) - f(z) = g(w) * (w - z)) \<and> continuous (at z) g)" | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 2230 | using CARAT_DERIV [of f] | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 2231 | by (simp add: field_differentiable_def has_field_derivative_def) | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 2232 | |
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 2233 | lemma field_differentiable_caratheodory_within: | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 2234 | "f field_differentiable (at z within s) \<longleftrightarrow> | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 2235 | (\<exists>g. (\<forall>w. f(w) - f(z) = g(w) * (w - z)) \<and> continuous (at z within s) g)" | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 2236 | using DERIV_caratheodory_within [of f] | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 2237 | by (simp add: field_differentiable_def has_field_derivative_def) | 
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 2238 | |
| 
b4d409c65a76
Rearrangement of material in Complex_Analysis_Basics, which contained much that had nothing to do with complex analysis.
 paulson <lp15@cam.ac.uk> parents: 
71028diff
changeset | 2239 | |
| 68838 | 2240 | subsection \<open>Field derivative\<close> | 
| 2241 | ||
| 70136 | 2242 | definition\<^marker>\<open>tag important\<close> deriv :: "('a \<Rightarrow> 'a::real_normed_field) \<Rightarrow> 'a \<Rightarrow> 'a" where
 | 
| 68838 | 2243 | "deriv f x \<equiv> SOME D. DERIV f x :> D" | 
| 2244 | ||
| 2245 | lemma DERIV_imp_deriv: "DERIV f x :> f' \<Longrightarrow> deriv f x = f'" | |
| 2246 | unfolding deriv_def by (metis some_equality DERIV_unique) | |
| 2247 | ||
| 2248 | lemma DERIV_deriv_iff_has_field_derivative: | |
| 2249 | "DERIV f x :> deriv f x \<longleftrightarrow> (\<exists>f'. (f has_field_derivative f') (at x))" | |
| 2250 | by (auto simp: has_field_derivative_def DERIV_imp_deriv) | |
| 2251 | ||
| 2252 | lemma DERIV_deriv_iff_real_differentiable: | |
| 2253 | fixes x :: real | |
| 2254 | shows "DERIV f x :> deriv f x \<longleftrightarrow> f differentiable at x" | |
| 2255 | unfolding differentiable_def by (metis DERIV_imp_deriv has_real_derivative_iff) | |
| 2256 | ||
| 2257 | lemma deriv_cong_ev: | |
| 2258 | assumes "eventually (\<lambda>x. f x = g x) (nhds x)" "x = y" | |
| 2259 | shows "deriv f x = deriv g y" | |
| 2260 | proof - | |
| 2261 | have "(\<lambda>D. (f has_field_derivative D) (at x)) = (\<lambda>D. (g has_field_derivative D) (at y))" | |
| 2262 | by (intro ext DERIV_cong_ev refl assms) | |
| 2263 | thus ?thesis by (simp add: deriv_def assms) | |
| 2264 | qed | |
| 2265 | ||
| 2266 | lemma higher_deriv_cong_ev: | |
| 2267 | assumes "eventually (\<lambda>x. f x = g x) (nhds x)" "x = y" | |
| 2268 | shows "(deriv ^^ n) f x = (deriv ^^ n) g y" | |
| 2269 | proof - | |
| 2270 | from assms(1) have "eventually (\<lambda>x. (deriv ^^ n) f x = (deriv ^^ n) g x) (nhds x)" | |
| 2271 | proof (induction n arbitrary: f g) | |
| 2272 | case (Suc n) | |
| 2273 | from Suc.prems have "eventually (\<lambda>y. eventually (\<lambda>z. f z = g z) (nhds y)) (nhds x)" | |
| 2274 | by (simp add: eventually_eventually) | |
| 2275 | hence "eventually (\<lambda>x. deriv f x = deriv g x) (nhds x)" | |
| 2276 | by eventually_elim (rule deriv_cong_ev, simp_all) | |
| 2277 | thus ?case by (auto intro!: deriv_cong_ev Suc simp: funpow_Suc_right simp del: funpow.simps) | |
| 2278 | qed auto | |
| 2279 | from eventually_nhds_x_imp_x[OF this] assms(2) show ?thesis by simp | |
| 2280 | qed | |
| 2281 | ||
| 2282 | lemma real_derivative_chain: | |
| 2283 | fixes x :: real | |
| 2284 | shows "f differentiable at x \<Longrightarrow> g differentiable at (f x) | |
| 2285 | \<Longrightarrow> deriv (g o f) x = deriv g (f x) * deriv f x" | |
| 2286 | by (metis DERIV_deriv_iff_real_differentiable DERIV_chain DERIV_imp_deriv) | |
| 2287 | lemma field_derivative_eq_vector_derivative: | |
| 2288 | "(deriv f x) = vector_derivative f (at x)" | |
| 2289 | by (simp add: mult.commute deriv_def vector_derivative_def has_vector_derivative_def has_field_derivative_def) | |
| 2290 | ||
| 2291 | proposition field_differentiable_derivI: | |
| 2292 | "f field_differentiable (at x) \<Longrightarrow> (f has_field_derivative deriv f x) (at x)" | |
| 2293 | by (simp add: field_differentiable_def DERIV_deriv_iff_has_field_derivative) | |
| 2294 | ||
| 2295 | lemma vector_derivative_chain_at_general: | |
| 2296 | assumes "f differentiable at x" "g field_differentiable at (f x)" | |
| 2297 | shows "vector_derivative (g \<circ> f) (at x) = vector_derivative f (at x) * deriv g (f x)" | |
| 2298 | apply (rule vector_derivative_at [OF field_vector_diff_chain_at]) | |
| 2299 | using assms vector_derivative_works by (auto simp: field_differentiable_derivI) | |
| 2300 | ||
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2301 | lemma DERIV_deriv_iff_field_differentiable: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2302 | "DERIV f x :> deriv f x \<longleftrightarrow> f field_differentiable at x" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2303 | unfolding field_differentiable_def by (metis DERIV_imp_deriv) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2304 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2305 | lemma deriv_chain: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2306 | "f field_differentiable at x \<Longrightarrow> g field_differentiable at (f x) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2307 | \<Longrightarrow> deriv (g o f) x = deriv g (f x) * deriv f x" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2308 | by (metis DERIV_deriv_iff_field_differentiable DERIV_chain DERIV_imp_deriv) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2309 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2310 | lemma deriv_linear [simp]: "deriv (\<lambda>w. c * w) = (\<lambda>z. c)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2311 | by (metis DERIV_imp_deriv DERIV_cmult_Id) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2312 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2313 | lemma deriv_uminus [simp]: "deriv (\<lambda>w. -w) = (\<lambda>z. -1)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2314 | using deriv_linear[of "-1"] by (simp del: deriv_linear) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2315 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2316 | lemma deriv_ident [simp]: "deriv (\<lambda>w. w) = (\<lambda>z. 1)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2317 | by (metis DERIV_imp_deriv DERIV_ident) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2318 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2319 | lemma deriv_id [simp]: "deriv id = (\<lambda>z. 1)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2320 | by (simp add: id_def) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2321 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2322 | lemma deriv_const [simp]: "deriv (\<lambda>w. c) = (\<lambda>z. 0)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2323 | by (metis DERIV_imp_deriv DERIV_const) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2324 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2325 | lemma deriv_add [simp]: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2326 | "\<lbrakk>f field_differentiable at z; g field_differentiable at z\<rbrakk> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2327 | \<Longrightarrow> deriv (\<lambda>w. f w + g w) z = deriv f z + deriv g z" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2328 | unfolding DERIV_deriv_iff_field_differentiable[symmetric] | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2329 | by (auto intro!: DERIV_imp_deriv derivative_intros) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2330 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2331 | lemma deriv_diff [simp]: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2332 | "\<lbrakk>f field_differentiable at z; g field_differentiable at z\<rbrakk> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2333 | \<Longrightarrow> deriv (\<lambda>w. f w - g w) z = deriv f z - deriv g z" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2334 | unfolding DERIV_deriv_iff_field_differentiable[symmetric] | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2335 | by (auto intro!: DERIV_imp_deriv derivative_intros) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2336 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2337 | lemma deriv_mult [simp]: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2338 | "\<lbrakk>f field_differentiable at z; g field_differentiable at z\<rbrakk> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2339 | \<Longrightarrow> deriv (\<lambda>w. f w * g w) z = f z * deriv g z + deriv f z * g z" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2340 | unfolding DERIV_deriv_iff_field_differentiable[symmetric] | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2341 | by (auto intro!: DERIV_imp_deriv derivative_eq_intros) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2342 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2343 | lemma deriv_cmult: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2344 | "f field_differentiable at z \<Longrightarrow> deriv (\<lambda>w. c * f w) z = c * deriv f z" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2345 | by simp | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2346 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2347 | lemma deriv_cmult_right: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2348 | "f field_differentiable at z \<Longrightarrow> deriv (\<lambda>w. f w * c) z = deriv f z * c" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2349 | by simp | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2350 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2351 | lemma deriv_inverse [simp]: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2352 | "\<lbrakk>f field_differentiable at z; f z \<noteq> 0\<rbrakk> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2353 | \<Longrightarrow> deriv (\<lambda>w. inverse (f w)) z = - deriv f z / f z ^ 2" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2354 | unfolding DERIV_deriv_iff_field_differentiable[symmetric] | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2355 | by (safe intro!: DERIV_imp_deriv derivative_eq_intros) (auto simp: field_split_simps power2_eq_square) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2356 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2357 | lemma deriv_divide [simp]: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2358 | "\<lbrakk>f field_differentiable at z; g field_differentiable at z; g z \<noteq> 0\<rbrakk> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2359 | \<Longrightarrow> deriv (\<lambda>w. f w / g w) z = (deriv f z * g z - f z * deriv g z) / g z ^ 2" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2360 | by (simp add: field_class.field_divide_inverse field_differentiable_inverse) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2361 | (simp add: field_split_simps power2_eq_square) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2362 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2363 | lemma deriv_cdivide_right: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2364 | "f field_differentiable at z \<Longrightarrow> deriv (\<lambda>w. f w / c) z = deriv f z / c" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2365 | by (simp add: field_class.field_divide_inverse) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2366 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2367 | lemma deriv_compose_linear: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2368 | "f field_differentiable at (c * z) \<Longrightarrow> deriv (\<lambda>w. f (c * w)) z = c * deriv f (c * z)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2369 | apply (rule DERIV_imp_deriv) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2370 | unfolding DERIV_deriv_iff_field_differentiable [symmetric] | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2371 | by (metis (full_types) DERIV_chain2 DERIV_cmult_Id mult.commute) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2372 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2373 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2374 | lemma nonzero_deriv_nonconstant: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2375 | assumes df: "DERIV f \<xi> :> df" and S: "open S" "\<xi> \<in> S" and "df \<noteq> 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2376 | shows "\<not> f constant_on S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2377 | unfolding constant_on_def | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2378 | by (metis \<open>df \<noteq> 0\<close> has_field_derivative_transform_within_open [OF df S] DERIV_const DERIV_unique) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2379 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 2380 | |
| 61531 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2381 | subsection \<open>Relation between convexity and derivative\<close> | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2382 | |
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2383 | (* TODO: Generalise to real vector spaces? *) | 
| 68838 | 2384 | proposition convex_on_imp_above_tangent: | 
| 61531 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2385 | assumes convex: "convex_on A f" and connected: "connected A" | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2386 | assumes c: "c \<in> interior A" and x : "x \<in> A" | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2387 | assumes deriv: "(f has_field_derivative f') (at c within A)" | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2388 | shows "f x - f c \<ge> f' * (x - c)" | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2389 | proof (cases x c rule: linorder_cases) | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2390 | assume xc: "x > c" | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2391 |   let ?A' = "interior A \<inter> {c<..}"
 | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2392 |   from c have "c \<in> interior A \<inter> closure {c<..}" by auto
 | 
| 63128 | 2393 |   also have "\<dots> \<subseteq> closure (interior A \<inter> {c<..})" by (intro open_Int_closure_subset) auto
 | 
| 61531 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2394 | finally have "at c within ?A' \<noteq> bot" by (subst at_within_eq_bot_iff) auto | 
| 61973 | 2395 | moreover from deriv have "((\<lambda>y. (f y - f c) / (y - c)) \<longlongrightarrow> f') (at c within ?A')" | 
| 68239 | 2396 | unfolding has_field_derivative_iff using interior_subset[of A] by (blast intro: tendsto_mono at_le) | 
| 61531 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2397 | moreover from eventually_at_right_real[OF xc] | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2398 | have "eventually (\<lambda>y. (f y - f c) / (y - c) \<le> (f x - f c) / (x - c)) (at_right c)" | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2399 | proof eventually_elim | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2400 |     fix y assume y: "y \<in> {c<..<x}"
 | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2401 | with convex connected x c have "f y \<le> (f x - f c) / (x - c) * (y - c) + f c" | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2402 | using interior_subset[of A] | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2403 | by (intro convex_onD_Icc' convex_on_subset[OF convex] connected_contains_Icc) auto | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2404 | hence "f y - f c \<le> (f x - f c) / (x - c) * (y - c)" by simp | 
| 70817 
dd675800469d
dedicated fact collections for algebraic simplification rules potentially splitting goals
 haftmann parents: 
70802diff
changeset | 2405 | thus "(f y - f c) / (y - c) \<le> (f x - f c) / (x - c)" using y xc by (simp add: field_split_simps) | 
| 61531 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2406 | qed | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2407 | hence "eventually (\<lambda>y. (f y - f c) / (y - c) \<le> (f x - f c) / (x - c)) (at c within ?A')" | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2408 | by (blast intro: filter_leD at_le) | 
| 63952 
354808e9f44b
new material connected with HOL Light measure theory, plus more rationalisation
 paulson <lp15@cam.ac.uk> parents: 
63938diff
changeset | 2409 | ultimately have "f' \<le> (f x - f c) / (x - c)" by (simp add: tendsto_upperbound) | 
| 61531 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2410 | thus ?thesis using xc by (simp add: field_simps) | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2411 | next | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2412 | assume xc: "x < c" | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2413 |   let ?A' = "interior A \<inter> {..<c}"
 | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2414 |   from c have "c \<in> interior A \<inter> closure {..<c}" by auto
 | 
| 63128 | 2415 |   also have "\<dots> \<subseteq> closure (interior A \<inter> {..<c})" by (intro open_Int_closure_subset) auto
 | 
| 61531 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2416 | finally have "at c within ?A' \<noteq> bot" by (subst at_within_eq_bot_iff) auto | 
| 61973 | 2417 | moreover from deriv have "((\<lambda>y. (f y - f c) / (y - c)) \<longlongrightarrow> f') (at c within ?A')" | 
| 68239 | 2418 | unfolding has_field_derivative_iff using interior_subset[of A] by (blast intro: tendsto_mono at_le) | 
| 61531 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2419 | moreover from eventually_at_left_real[OF xc] | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2420 | have "eventually (\<lambda>y. (f y - f c) / (y - c) \<ge> (f x - f c) / (x - c)) (at_left c)" | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2421 | proof eventually_elim | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2422 |     fix y assume y: "y \<in> {x<..<c}"
 | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2423 | with convex connected x c have "f y \<le> (f x - f c) / (c - x) * (c - y) + f c" | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2424 | using interior_subset[of A] | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2425 | by (intro convex_onD_Icc'' convex_on_subset[OF convex] connected_contains_Icc) auto | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2426 | hence "f y - f c \<le> (f x - f c) * ((c - y) / (c - x))" by simp | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2427 | also have "(c - y) / (c - x) = (y - c) / (x - c)" using y xc by (simp add: field_simps) | 
| 61649 
268d88ec9087
Tweaks for "real": Removal of [iff] status for some lemmas, adding [simp] for others. Plus fixes.
 paulson <lp15@cam.ac.uk> parents: 
61560diff
changeset | 2428 | finally show "(f y - f c) / (y - c) \<ge> (f x - f c) / (x - c)" using y xc | 
| 70817 
dd675800469d
dedicated fact collections for algebraic simplification rules potentially splitting goals
 haftmann parents: 
70802diff
changeset | 2429 | by (simp add: field_split_simps) | 
| 61531 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2430 | qed | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2431 | hence "eventually (\<lambda>y. (f y - f c) / (y - c) \<ge> (f x - f c) / (x - c)) (at c within ?A')" | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2432 | by (blast intro: filter_leD at_le) | 
| 63952 
354808e9f44b
new material connected with HOL Light measure theory, plus more rationalisation
 paulson <lp15@cam.ac.uk> parents: 
63938diff
changeset | 2433 | ultimately have "f' \<ge> (f x - f c) / (x - c)" by (simp add: tendsto_lowerbound) | 
| 61531 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2434 | thus ?thesis using xc by (simp add: field_simps) | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2435 | qed simp_all | 
| 
ab2e862263e7
Rounding function, uniform limits, cotangent, binomial identities
 eberlm parents: 
61524diff
changeset | 2436 | |
| 62207 | 2437 | |
| 2438 | subsection \<open>Partial derivatives\<close> | |
| 2439 | ||
| 2440 | lemma eventually_at_Pair_within_TimesI1: | |
| 2441 | fixes x::"'a::metric_space" | |
| 2442 | assumes "\<forall>\<^sub>F x' in at x within X. P x'" | |
| 2443 | assumes "P x" | |
| 2444 | shows "\<forall>\<^sub>F (x', y') in at (x, y) within X \<times> Y. P x'" | |
| 2445 | proof - | |
| 2446 | from assms[unfolded eventually_at_topological] | |
| 2447 | obtain S where S: "open S" "x \<in> S" "\<And>x'. x' \<in> X \<Longrightarrow> x' \<in> S \<Longrightarrow> P x'" | |
| 2448 | by metis | |
| 2449 | show "\<forall>\<^sub>F (x', y') in at (x, y) within X \<times> Y. P x'" | |
| 2450 | unfolding eventually_at_topological | |
| 2451 | by (auto intro!: exI[where x="S \<times> UNIV"] S open_Times) | |
| 2452 | qed | |
| 2453 | ||
| 2454 | lemma eventually_at_Pair_within_TimesI2: | |
| 2455 | fixes x::"'a::metric_space" | |
| 68239 | 2456 | assumes "\<forall>\<^sub>F y' in at y within Y. P y'" "P y" | 
| 62207 | 2457 | shows "\<forall>\<^sub>F (x', y') in at (x, y) within X \<times> Y. P y'" | 
| 2458 | proof - | |
| 2459 | from assms[unfolded eventually_at_topological] | |
| 2460 | obtain S where S: "open S" "y \<in> S" "\<And>y'. y' \<in> Y \<Longrightarrow> y' \<in> S \<Longrightarrow> P y'" | |
| 2461 | by metis | |
| 2462 | show "\<forall>\<^sub>F (x', y') in at (x, y) within X \<times> Y. P y'" | |
| 2463 | unfolding eventually_at_topological | |
| 2464 | by (auto intro!: exI[where x="UNIV \<times> S"] S open_Times) | |
| 2465 | qed | |
| 2466 | ||
| 68838 | 2467 | proposition has_derivative_partialsI: | 
| 67685 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2468 | fixes f::"'a::real_normed_vector \<Rightarrow> 'b::real_normed_vector \<Rightarrow> 'c::real_normed_vector" | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2469 | assumes fx: "((\<lambda>x. f x y) has_derivative fx) (at x within X)" | 
| 62207 | 2470 | assumes fy: "\<And>x y. x \<in> X \<Longrightarrow> y \<in> Y \<Longrightarrow> ((\<lambda>y. f x y) has_derivative blinfun_apply (fy x y)) (at y within Y)" | 
| 67685 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2471 | assumes fy_cont[unfolded continuous_within]: "continuous (at (x, y) within X \<times> Y) (\<lambda>(x, y). fy x y)" | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2472 | assumes "y \<in> Y" "convex Y" | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2473 | shows "((\<lambda>(x, y). f x y) has_derivative (\<lambda>(tx, ty). fx tx + fy x y ty)) (at (x, y) within X \<times> Y)" | 
| 62207 | 2474 | proof (safe intro!: has_derivativeI tendstoI, goal_cases) | 
| 2475 | case (2 e') | |
| 67685 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2476 | interpret fx: bounded_linear "fx" using fx by (rule has_derivative_bounded_linear) | 
| 63040 | 2477 | define e where "e = e' / 9" | 
| 62207 | 2478 | have "e > 0" using \<open>e' > 0\<close> by (simp add: e_def) | 
| 2479 | ||
| 67685 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2480 | from fy_cont[THEN tendstoD, OF \<open>e > 0\<close>] | 
| 62207 | 2481 | have "\<forall>\<^sub>F (x', y') in at (x, y) within X \<times> Y. dist (fy x' y') (fy x y) < e" | 
| 2482 | by (auto simp: split_beta') | |
| 2483 | from this[unfolded eventually_at] obtain d' where | |
| 2484 | "d' > 0" | |
| 2485 | "\<And>x' y'. x' \<in> X \<Longrightarrow> y' \<in> Y \<Longrightarrow> (x', y') \<noteq> (x, y) \<Longrightarrow> dist (x', y') (x, y) < d' \<Longrightarrow> | |
| 2486 | dist (fy x' y') (fy x y) < e" | |
| 2487 | by auto | |
| 2488 | then | |
| 2489 | have d': "x' \<in> X \<Longrightarrow> y' \<in> Y \<Longrightarrow> dist (x', y') (x, y) < d' \<Longrightarrow> dist (fy x' y') (fy x y) < e" | |
| 2490 | for x' y' | |
| 2491 | using \<open>0 < e\<close> | |
| 2492 | by (cases "(x', y') = (x, y)") auto | |
| 63040 | 2493 | define d where "d = d' / sqrt 2" | 
| 62207 | 2494 | have "d > 0" using \<open>0 < d'\<close> by (simp add: d_def) | 
| 2495 | have d: "x' \<in> X \<Longrightarrow> y' \<in> Y \<Longrightarrow> dist x' x < d \<Longrightarrow> dist y' y < d \<Longrightarrow> dist (fy x' y') (fy x y) < e" | |
| 2496 | for x' y' | |
| 2497 | by (auto simp: dist_prod_def d_def intro!: d' real_sqrt_sum_squares_less) | |
| 2498 | ||
| 2499 | let ?S = "ball y d \<inter> Y" | |
| 2500 | have "convex ?S" | |
| 2501 | by (auto intro!: convex_Int \<open>convex Y\<close>) | |
| 2502 |   {
 | |
| 2503 | fix x'::'a and y'::'b | |
| 2504 | assume x': "x' \<in> X" and y': "y' \<in> Y" | |
| 2505 | assume dx': "dist x' x < d" and dy': "dist y' y < d" | |
| 2506 | have "norm (fy x' y' - fy x' y) \<le> dist (fy x' y') (fy x y) + dist (fy x' y) (fy x y)" | |
| 2507 | by norm | |
| 2508 | also have "dist (fy x' y') (fy x y) < e" | |
| 2509 | by (rule d; fact) | |
| 2510 | also have "dist (fy x' y) (fy x y) < e" | |
| 2511 | by (auto intro!: d simp: dist_prod_def x' \<open>d > 0\<close> \<open>y \<in> Y\<close> dx') | |
| 2512 | finally | |
| 2513 | have "norm (fy x' y' - fy x' y) < e + e" | |
| 2514 | by arith | |
| 2515 | then have "onorm (blinfun_apply (fy x' y') - blinfun_apply (fy x' y)) < e + e" | |
| 2516 | by (auto simp: norm_blinfun.rep_eq blinfun.diff_left[abs_def] fun_diff_def) | |
| 2517 | } note onorm = this | |
| 2518 | ||
| 2519 | have ev_mem: "\<forall>\<^sub>F (x', y') in at (x, y) within X \<times> Y. (x', y') \<in> X \<times> Y" | |
| 67685 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2520 | using \<open>y \<in> Y\<close> | 
| 62207 | 2521 | by (auto simp: eventually_at intro!: zero_less_one) | 
| 2522 | moreover | |
| 2523 | have ev_dist: "\<forall>\<^sub>F xy in at (x, y) within X \<times> Y. dist xy (x, y) < d" if "d > 0" for d | |
| 2524 | using eventually_at_ball[OF that] | |
| 71174 | 2525 | by (rule eventually_elim2) (auto simp: dist_commute intro!: eventually_True) | 
| 62207 | 2526 | note ev_dist[OF \<open>0 < d\<close>] | 
| 2527 | ultimately | |
| 2528 | have "\<forall>\<^sub>F (x', y') in at (x, y) within X \<times> Y. | |
| 2529 | norm (f x' y' - f x' y - (fy x' y) (y' - y)) \<le> norm (y' - y) * (e + e)" | |
| 2530 | proof (eventually_elim, safe) | |
| 2531 | fix x' y' | |
| 2532 | assume "x' \<in> X" and y': "y' \<in> Y" | |
| 2533 | assume dist: "dist (x', y') (x, y) < d" | |
| 2534 | then have dx: "dist x' x < d" and dy: "dist y' y < d" | |
| 2535 | unfolding dist_prod_def fst_conv snd_conv atomize_conj | |
| 2536 | by (metis le_less_trans real_sqrt_sum_squares_ge1 real_sqrt_sum_squares_ge2) | |
| 2537 |     {
 | |
| 2538 | fix t::real | |
| 2539 |       assume "t \<in> {0 .. 1}"
 | |
| 2540 | then have "y + t *\<^sub>R (y' - y) \<in> closed_segment y y'" | |
| 2541 | by (auto simp: closed_segment_def algebra_simps intro!: exI[where x=t]) | |
| 2542 | also | |
| 2543 | have "\<dots> \<subseteq> ball y d \<inter> Y" | |
| 2544 | using \<open>y \<in> Y\<close> \<open>0 < d\<close> dy y' | |
| 2545 | by (intro \<open>convex ?S\<close>[unfolded convex_contains_segment, rule_format, of y y']) | |
| 68239 | 2546 | (auto simp: dist_commute) | 
| 62207 | 2547 | finally have "y + t *\<^sub>R (y' - y) \<in> ?S" . | 
| 2548 | } note seg = this | |
| 2549 | ||
| 68239 | 2550 | have "\<And>x. x \<in> ball y d \<inter> Y \<Longrightarrow> onorm (blinfun_apply (fy x' x) - blinfun_apply (fy x' y)) \<le> e + e" | 
| 2551 | by (safe intro!: onorm less_imp_le \<open>x' \<in> X\<close> dx) (auto simp: dist_commute \<open>0 < d\<close> \<open>y \<in> Y\<close>) | |
| 72445 
2c2de074832e
tidying and removal of legacy name
 paulson <lp15@cam.ac.uk> parents: 
71633diff
changeset | 2552 | with seg has_derivative_subset[OF assms(2)[OF \<open>x' \<in> X\<close>]] | 
| 62207 | 2553 | show "norm (f x' y' - f x' y - (fy x' y) (y' - y)) \<le> norm (y' - y) * (e + e)" | 
| 2554 | by (rule differentiable_bound_linearization[where S="?S"]) | |
| 2555 | (auto intro!: \<open>0 < d\<close> \<open>y \<in> Y\<close>) | |
| 2556 | qed | |
| 2557 | moreover | |
| 67685 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2558 | let ?le = "\<lambda>x'. norm (f x' y - f x y - (fx) (x' - x)) \<le> norm (x' - x) * e" | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2559 | from fx[unfolded has_derivative_within, THEN conjunct2, THEN tendstoD, OF \<open>0 < e\<close>] | 
| 62207 | 2560 | have "\<forall>\<^sub>F x' in at x within X. ?le x'" | 
| 70817 
dd675800469d
dedicated fact collections for algebraic simplification rules potentially splitting goals
 haftmann parents: 
70802diff
changeset | 2561 | by eventually_elim (simp, | 
| 
dd675800469d
dedicated fact collections for algebraic simplification rules potentially splitting goals
 haftmann parents: 
70802diff
changeset | 2562 | simp add: dist_norm field_split_simps split: if_split_asm) | 
| 62207 | 2563 | then have "\<forall>\<^sub>F (x', y') in at (x, y) within X \<times> Y. ?le x'" | 
| 2564 | by (rule eventually_at_Pair_within_TimesI1) | |
| 68239 | 2565 | (simp add: blinfun.bilinear_simps) | 
| 62207 | 2566 | moreover have "\<forall>\<^sub>F (x', y') in at (x, y) within X \<times> Y. norm ((x', y') - (x, y)) \<noteq> 0" | 
| 2567 | unfolding norm_eq_zero right_minus_eq | |
| 2568 | by (auto simp: eventually_at intro!: zero_less_one) | |
| 2569 | moreover | |
| 67685 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2570 | from fy_cont[THEN tendstoD, OF \<open>0 < e\<close>] | 
| 62207 | 2571 | have "\<forall>\<^sub>F x' in at x within X. norm (fy x' y - fy x y) < e" | 
| 2572 | unfolding eventually_at | |
| 2573 | using \<open>y \<in> Y\<close> | |
| 2574 | by (auto simp: dist_prod_def dist_norm) | |
| 2575 | then have "\<forall>\<^sub>F (x', y') in at (x, y) within X \<times> Y. norm (fy x' y - fy x y) < e" | |
| 2576 | by (rule eventually_at_Pair_within_TimesI1) | |
| 2577 | (simp add: blinfun.bilinear_simps \<open>0 < e\<close>) | |
| 2578 | ultimately | |
| 2579 | have "\<forall>\<^sub>F (x', y') in at (x, y) within X \<times> Y. | |
| 67685 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2580 | norm ((f x' y' - f x y - (fx (x' - x) + fy x y (y' - y))) /\<^sub>R | 
| 62207 | 2581 | norm ((x', y') - (x, y))) | 
| 2582 | < e'" | |
| 2583 | apply eventually_elim | |
| 2584 | proof safe | |
| 2585 | fix x' y' | |
| 67685 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2586 | have "norm (f x' y' - f x y - (fx (x' - x) + fy x y (y' - y))) \<le> | 
| 62207 | 2587 | norm (f x' y' - f x' y - fy x' y (y' - y)) + | 
| 2588 | norm (fy x y (y' - y) - fy x' y (y' - y)) + | |
| 67685 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2589 | norm (f x' y - f x y - fx (x' - x))" | 
| 62207 | 2590 | by norm | 
| 2591 | also | |
| 2592 | assume nz: "norm ((x', y') - (x, y)) \<noteq> 0" | |
| 2593 | and nfy: "norm (fy x' y - fy x y) < e" | |
| 2594 | assume "norm (f x' y' - f x' y - blinfun_apply (fy x' y) (y' - y)) \<le> norm (y' - y) * (e + e)" | |
| 67685 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2595 | also assume "norm (f x' y - f x y - (fx) (x' - x)) \<le> norm (x' - x) * e" | 
| 62207 | 2596 | also | 
| 2597 | have "norm ((fy x y) (y' - y) - (fy x' y) (y' - y)) \<le> norm ((fy x y) - (fy x' y)) * norm (y' - y)" | |
| 2598 | by (auto simp: blinfun.bilinear_simps[symmetric] intro!: norm_blinfun) | |
| 2599 | also have "\<dots> \<le> (e + e) * norm (y' - y)" | |
| 2600 | using \<open>e > 0\<close> nfy | |
| 2601 | by (auto simp: norm_minus_commute intro!: mult_right_mono) | |
| 2602 | also have "norm (x' - x) * e \<le> norm (x' - x) * (e + e)" | |
| 2603 | using \<open>0 < e\<close> by simp | |
| 2604 | also have "norm (y' - y) * (e + e) + (e + e) * norm (y' - y) + norm (x' - x) * (e + e) \<le> | |
| 2605 | (norm (y' - y) + norm (x' - x)) * (4 * e)" | |
| 2606 | using \<open>e > 0\<close> | |
| 2607 | by (simp add: algebra_simps) | |
| 2608 | also have "\<dots> \<le> 2 * norm ((x', y') - (x, y)) * (4 * e)" | |
| 2609 | using \<open>0 < e\<close> real_sqrt_sum_squares_ge1[of "norm (x' - x)" "norm (y' - y)"] | |
| 2610 | real_sqrt_sum_squares_ge2[of "norm (y' - y)" "norm (x' - x)"] | |
| 2611 | by (auto intro!: mult_right_mono simp: norm_prod_def | |
| 2612 | simp del: real_sqrt_sum_squares_ge1 real_sqrt_sum_squares_ge2) | |
| 2613 | also have "\<dots> \<le> norm ((x', y') - (x, y)) * (8 * e)" | |
| 2614 | by simp | |
| 2615 | also have "\<dots> < norm ((x', y') - (x, y)) * e'" | |
| 2616 | using \<open>0 < e'\<close> nz | |
| 2617 | by (auto simp: e_def) | |
| 67685 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2618 | finally show "norm ((f x' y' - f x y - (fx (x' - x) + fy x y (y' - y))) /\<^sub>R norm ((x', y') - (x, y))) < e'" | 
| 70817 
dd675800469d
dedicated fact collections for algebraic simplification rules potentially splitting goals
 haftmann parents: 
70802diff
changeset | 2619 | by (simp add: dist_norm) (auto simp add: field_split_simps) | 
| 62207 | 2620 | qed | 
| 2621 | then show ?case | |
| 2622 | by eventually_elim (auto simp: dist_norm field_simps) | |
| 67685 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2623 | next | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2624 | from has_derivative_bounded_linear[OF fx] | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2625 | obtain fxb where "fx = blinfun_apply fxb" | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2626 | by (metis bounded_linear_Blinfun_apply) | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2627 | then show "bounded_linear (\<lambda>(tx, ty). fx tx + blinfun_apply (fy x y) ty)" | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2628 | by (auto intro!: bounded_linear_intros simp: split_beta') | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2629 | qed | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2630 | |
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2631 | |
| 70136 | 2632 | subsection\<^marker>\<open>tag unimportant\<close> \<open>Differentiable case distinction\<close> | 
| 67685 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2633 | |
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2634 | lemma has_derivative_within_If_eq: | 
| 68239 | 2635 | "((\<lambda>x. if P x then f x else g x) has_derivative f') (at x within S) = | 
| 67685 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2636 | (bounded_linear f' \<and> | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2637 | ((\<lambda>y.(if P y then (f y - ((if P x then f x else g x) + f' (y - x)))/\<^sub>R norm (y - x) | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2638 | else (g y - ((if P x then f x else g x) + f' (y - x)))/\<^sub>R norm (y - x))) | 
| 68239 | 2639 | \<longlongrightarrow> 0) (at x within S))" | 
| 67685 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2640 | (is "_ = (_ \<and> (?if \<longlongrightarrow> 0) _)") | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2641 | proof - | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2642 | have "(\<lambda>y. (1 / norm (y - x)) *\<^sub>R | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2643 | ((if P y then f y else g y) - | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2644 | ((if P x then f x else g x) + f' (y - x)))) = ?if" | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2645 | by (auto simp: inverse_eq_divide) | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2646 | thus ?thesis by (auto simp: has_derivative_within) | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2647 | qed | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2648 | |
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2649 | lemma has_derivative_If_within_closures: | 
| 68239 | 2650 | assumes f': "x \<in> S \<union> (closure S \<inter> closure T) \<Longrightarrow> | 
| 2651 | (f has_derivative f' x) (at x within S \<union> (closure S \<inter> closure T))" | |
| 2652 | assumes g': "x \<in> T \<union> (closure S \<inter> closure T) \<Longrightarrow> | |
| 2653 | (g has_derivative g' x) (at x within T \<union> (closure S \<inter> closure T))" | |
| 2654 | assumes connect: "x \<in> closure S \<Longrightarrow> x \<in> closure T \<Longrightarrow> f x = g x" | |
| 2655 | assumes connect': "x \<in> closure S \<Longrightarrow> x \<in> closure T \<Longrightarrow> f' x = g' x" | |
| 2656 | assumes x_in: "x \<in> S \<union> T" | |
| 2657 | shows "((\<lambda>x. if x \<in> S then f x else g x) has_derivative | |
| 2658 | (if x \<in> S then f' x else g' x)) (at x within (S \<union> T))" | |
| 67685 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2659 | proof - | 
| 68239 | 2660 | from f' x_in interpret f': bounded_linear "if x \<in> S then f' x else (\<lambda>x. 0)" | 
| 67685 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2661 | by (auto simp add: has_derivative_within) | 
| 68239 | 2662 | from g' interpret g': bounded_linear "if x \<in> T then g' x else (\<lambda>x. 0)" | 
| 67685 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2663 | by (auto simp add: has_derivative_within) | 
| 68239 | 2664 | have bl: "bounded_linear (if x \<in> S then f' x else g' x)" | 
| 67685 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2665 | using f'.scaleR f'.bounded f'.add g'.scaleR g'.bounded g'.add x_in | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2666 | by (unfold_locales; force) | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2667 | show ?thesis | 
| 68239 | 2668 | using f' g' closure_subset[of T] closure_subset[of S] | 
| 67685 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2669 | unfolding has_derivative_within_If_eq | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2670 | by (intro conjI bl tendsto_If_within_closures x_in) | 
| 69712 | 2671 | (auto simp: has_derivative_within inverse_eq_divide connect connect' subsetD) | 
| 67685 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2672 | qed | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2673 | |
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2674 | lemma has_vector_derivative_If_within_closures: | 
| 68239 | 2675 | assumes x_in: "x \<in> S \<union> T" | 
| 2676 | assumes "u = S \<union> T" | |
| 2677 | assumes f': "x \<in> S \<union> (closure S \<inter> closure T) \<Longrightarrow> | |
| 2678 | (f has_vector_derivative f' x) (at x within S \<union> (closure S \<inter> closure T))" | |
| 2679 | assumes g': "x \<in> T \<union> (closure S \<inter> closure T) \<Longrightarrow> | |
| 2680 | (g has_vector_derivative g' x) (at x within T \<union> (closure S \<inter> closure T))" | |
| 2681 | assumes connect: "x \<in> closure S \<Longrightarrow> x \<in> closure T \<Longrightarrow> f x = g x" | |
| 2682 | assumes connect': "x \<in> closure S \<Longrightarrow> x \<in> closure T \<Longrightarrow> f' x = g' x" | |
| 2683 | shows "((\<lambda>x. if x \<in> S then f x else g x) has_vector_derivative | |
| 2684 | (if x \<in> S then f' x else g' x)) (at x within u)" | |
| 67685 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2685 | unfolding has_vector_derivative_def assms | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2686 | using x_in | 
| 68241 
39a311f50344
correcting the statements of the MVTs
 paulson <lp15@cam.ac.uk> parents: 
68239diff
changeset | 2687 | apply (intro has_derivative_If_within_closures[where ?f' = "\<lambda>x a. a *\<^sub>R f' x" and ?g' = "\<lambda>x a. a *\<^sub>R g' x", | 
| 67685 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2688 | THEN has_derivative_eq_rhs]) | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2689 | subgoal by (rule f'[unfolded has_vector_derivative_def]; assumption) | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2690 | subgoal by (rule g'[unfolded has_vector_derivative_def]; assumption) | 
| 
bdff8bf0a75b
moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
 immler parents: 
67682diff
changeset | 2691 | by (auto simp: assms) | 
| 62207 | 2692 | |
| 70999 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2693 | subsection\<^marker>\<open>tag important\<close>\<open>The Inverse Function Theorem\<close> | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2694 | |
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2695 | lemma linear_injective_contraction: | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2696 | assumes "linear f" "c < 1" and le: "\<And>x. norm (f x - x) \<le> c * norm x" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2697 | shows "inj f" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2698 | unfolding linear_injective_0[OF \<open>linear f\<close>] | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2699 | proof safe | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2700 | fix x | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2701 | assume "f x = 0" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2702 | with le [of x] have "norm x \<le> c * norm x" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2703 | by simp | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2704 | then show "x = 0" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2705 | using \<open>c < 1\<close> by (simp add: mult_le_cancel_right1) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2706 | qed | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2707 | |
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2708 | text\<open>From an online proof by J. Michael Boardman, Department of Mathematics, Johns Hopkins University\<close> | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2709 | lemma inverse_function_theorem_scaled: | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2710 | fixes f::"'a::euclidean_space \<Rightarrow> 'a" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2711 |     and f'::"'a \<Rightarrow> ('a \<Rightarrow>\<^sub>L 'a)"
 | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2712 | assumes "open U" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2713 | and derf: "\<And>x. x \<in> U \<Longrightarrow> (f has_derivative blinfun_apply (f' x)) (at x)" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2714 | and contf: "continuous_on U f'" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2715 | and "0 \<in> U" and [simp]: "f 0 = 0" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2716 | and id: "f' 0 = id_blinfun" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2717 | obtains U' V g g' where "open U'" "U' \<subseteq> U" "0 \<in> U'" "open V" "0 \<in> V" "homeomorphism U' V f g" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2718 | "\<And>y. y \<in> V \<Longrightarrow> (g has_derivative (g' y)) (at y)" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2719 | "\<And>y. y \<in> V \<Longrightarrow> g' y = inv (blinfun_apply (f'(g y)))" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2720 | "\<And>y. y \<in> V \<Longrightarrow> bij (blinfun_apply (f'(g y)))" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2721 | proof - | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2722 | obtain d1 where "cball 0 d1 \<subseteq> U" "d1 > 0" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2723 | using \<open>open U\<close> \<open>0 \<in> U\<close> open_contains_cball by blast | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2724 | obtain d2 where d2: "\<And>x. \<lbrakk>x \<in> U; dist x 0 \<le> d2\<rbrakk> \<Longrightarrow> dist (f' x) (f' 0) < 1/2" "0 < d2" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2725 | using continuous_onE [OF contf, of 0 "1/2"] by (metis \<open>0 \<in> U\<close> half_gt_zero_iff zero_less_one) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2726 | obtain \<delta> where le: "\<And>x. norm x \<le> \<delta> \<Longrightarrow> dist (f' x) id_blinfun \<le> 1/2" and "0 < \<delta>" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2727 | and subU: "cball 0 \<delta> \<subseteq> U" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2728 | proof | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2729 | show "min d1 d2 > 0" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2730 | by (simp add: \<open>0 < d1\<close> \<open>0 < d2\<close>) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2731 | show "cball 0 (min d1 d2) \<subseteq> U" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2732 | using \<open>cball 0 d1 \<subseteq> U\<close> by auto | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2733 | show "dist (f' x) id_blinfun \<le> 1/2" if "norm x \<le> min d1 d2" for x | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2734 | using \<open>cball 0 d1 \<subseteq> U\<close> d2 that id by fastforce | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2735 | qed | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2736 | let ?D = "cball 0 \<delta>" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2737 | define V:: "'a set" where "V \<equiv> ball 0 (\<delta>/2)" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2738 | have 4: "norm (f (x + h) - f x - h) \<le> 1/2 * norm h" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2739 | if "x \<in> ?D" "x+h \<in> ?D" for x h | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2740 | proof - | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2741 | let ?w = "\<lambda>x. f x - x" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2742 | have B: "\<And>x. x \<in> ?D \<Longrightarrow> onorm (blinfun_apply (f' x - id_blinfun)) \<le> 1/2" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2743 | by (metis dist_norm le mem_cball_0 norm_blinfun.rep_eq) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2744 | have "\<And>x. x \<in> ?D \<Longrightarrow> (?w has_derivative (blinfun_apply (f' x - id_blinfun))) (at x)" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2745 | by (rule derivative_eq_intros derf subsetD [OF subU] | force simp: blinfun.diff_left)+ | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2746 | then have Dw: "\<And>x. x \<in> ?D \<Longrightarrow> (?w has_derivative (blinfun_apply (f' x - id_blinfun))) (at x within ?D)" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2747 | using has_derivative_at_withinI by blast | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2748 | have "norm (?w (x+h) - ?w x) \<le> (1/2) * norm h" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2749 | using differentiable_bound [OF convex_cball Dw B] that by fastforce | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2750 | then show ?thesis | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2751 | by (auto simp: algebra_simps) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2752 | qed | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2753 | have for_g: "\<exists>!x. norm x < \<delta> \<and> f x = y" if y: "norm y < \<delta>/2" for y | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2754 | proof - | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2755 | let ?u = "\<lambda>x. x + (y - f x)" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2756 | have *: "norm (?u x) < \<delta>" if "x \<in> ?D" for x | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2757 | proof - | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2758 | have fxx: "norm (f x - x) \<le> \<delta>/2" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2759 | using 4 [of 0 x] \<open>0 < \<delta>\<close> \<open>f 0 = 0\<close> that by auto | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2760 | have "norm (?u x) \<le> norm y + norm (f x - x)" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2761 | by (metis add.commute add_diff_eq norm_minus_commute norm_triangle_ineq) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2762 | also have "\<dots> < \<delta>/2 + \<delta>/2" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2763 | using fxx y by auto | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2764 | finally show ?thesis | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2765 | by simp | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2766 | qed | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2767 | have "\<exists>!x \<in> ?D. ?u x = x" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2768 | proof (rule banach_fix) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2769 |       show "cball 0 \<delta> \<noteq> {}"
 | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2770 | using \<open>0 < \<delta>\<close> by auto | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2771 | show "(\<lambda>x. x + (y - f x)) ` cball 0 \<delta> \<subseteq> cball 0 \<delta>" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2772 | using * by force | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2773 | have "dist (x + (y - f x)) (xh + (y - f xh)) * 2 \<le> dist x xh" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2774 | if "norm x \<le> \<delta>" and "norm xh \<le> \<delta>" for x xh | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2775 | using that 4 [of x "xh-x"] by (auto simp: dist_norm norm_minus_commute algebra_simps) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2776 | then show "\<forall>x\<in>cball 0 \<delta>. \<forall>ya\<in>cball 0 \<delta>. dist (x + (y - f x)) (ya + (y - f ya)) \<le> (1/2) * dist x ya" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2777 | by auto | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2778 | qed (auto simp: complete_eq_closed) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2779 | then show ?thesis | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2780 | by (metis "*" add_cancel_right_right eq_iff_diff_eq_0 le_less mem_cball_0) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2781 | qed | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2782 | define g where "g \<equiv> \<lambda>y. THE x. norm x < \<delta> \<and> f x = y" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2783 | have g: "norm (g y) < \<delta> \<and> f (g y) = y" if "norm y < \<delta>/2" for y | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2784 | unfolding g_def using that theI' [OF for_g] by meson | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2785 | then have fg[simp]: "f (g y) = y" if "y \<in> V" for y | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2786 | using that by (auto simp: V_def) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2787 | have 5: "norm (g y' - g y) \<le> 2 * norm (y' - y)" if "y \<in> V" "y' \<in> V" for y y' | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2788 | proof - | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2789 | have no: "norm (g y) \<le> \<delta>" "norm (g y') \<le> \<delta>" and [simp]: "f (g y) = y" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2790 | using that g unfolding V_def by force+ | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2791 | have "norm (g y' - g y) \<le> norm (g y' - g y - (y' - y)) + norm (y' - y)" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2792 | by (simp add: add.commute norm_triangle_sub) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2793 | also have "\<dots> \<le> (1/2) * norm (g y' - g y) + norm (y' - y)" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2794 | using 4 [of "g y" "g y' - g y"] that no by (simp add: g norm_minus_commute V_def) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2795 | finally show ?thesis | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2796 | by auto | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2797 | qed | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2798 | have contg: "continuous_on V g" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2799 | proof | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2800 | fix y::'a and e::real | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2801 | assume "0 < e" and y: "y \<in> V" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2802 | show "\<exists>d>0. \<forall>x'\<in>V. dist x' y < d \<longrightarrow> dist (g x') (g y) \<le> e" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2803 | proof (intro exI conjI ballI impI) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2804 | show "0 < e/2" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2805 | by (simp add: \<open>0 < e\<close>) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2806 | qed (use 5 y in \<open>force simp: dist_norm\<close>) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2807 | qed | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2808 | show thesis | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2809 | proof | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2810 | define U' where "U' \<equiv> (f -` V) \<inter> ball 0 \<delta>" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2811 | have contf: "continuous_on U f" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2812 | using derf has_derivative_at_withinI by (fast intro: has_derivative_continuous_on) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2813 | then have "continuous_on (ball 0 \<delta>) f" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2814 | by (meson ball_subset_cball continuous_on_subset subU) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2815 | then show "open U'" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2816 | by (simp add: U'_def V_def Int_commute continuous_open_preimage) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2817 | show "0 \<in> U'" "U' \<subseteq> U" "open V" "0 \<in> V" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2818 | using \<open>0 < \<delta>\<close> subU by (auto simp: U'_def V_def) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2819 | show hom: "homeomorphism U' V f g" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2820 | proof | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2821 | show "continuous_on U' f" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2822 | using \<open>U' \<subseteq> U\<close> contf continuous_on_subset by blast | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2823 | show "continuous_on V g" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2824 | using contg by blast | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2825 | show "f ` U' \<subseteq> V" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2826 | using U'_def by blast | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2827 | show "g ` V \<subseteq> U'" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2828 | by (simp add: U'_def V_def g image_subset_iff) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2829 | show "g (f x) = x" if "x \<in> U'" for x | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2830 | by (metis that fg Int_iff U'_def V_def for_g g mem_ball_0 vimage_eq) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2831 | show "f (g y) = y" if "y \<in> V" for y | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2832 | using that by (simp add: g V_def) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2833 | qed | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2834 | show bij: "bij (blinfun_apply (f'(g y)))" if "y \<in> V" for y | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2835 | proof - | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2836 | have inj: "inj (blinfun_apply (f' (g y)))" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2837 | proof (rule linear_injective_contraction) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2838 | show "linear (blinfun_apply (f' (g y)))" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2839 | using blinfun.bounded_linear_right bounded_linear_def by blast | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2840 | next | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2841 | fix x | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2842 | have "norm (blinfun_apply (f' (g y)) x - x) = norm (blinfun_apply (f' (g y) - id_blinfun) x)" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2843 | by (simp add: blinfun.diff_left) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2844 | also have "\<dots> \<le> norm (f' (g y) - id_blinfun) * norm x" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2845 | by (rule norm_blinfun) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2846 | also have "\<dots> \<le> (1/2) * norm x" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2847 | proof (rule mult_right_mono) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2848 | show "norm (f' (g y) - id_blinfun) \<le> 1/2" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2849 | using that g [of y] le by (auto simp: V_def dist_norm) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2850 | qed auto | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2851 | finally show "norm (blinfun_apply (f' (g y)) x - x) \<le> (1/2) * norm x" . | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2852 | qed auto | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2853 | moreover | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2854 | have "surj (blinfun_apply (f' (g y)))" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2855 | using blinfun.bounded_linear_right bounded_linear_def | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2856 | by (blast intro!: linear_inj_imp_surj [OF _ inj]) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2857 | ultimately show ?thesis | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2858 | using bijI by blast | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2859 | qed | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2860 | define g' where "g' \<equiv> \<lambda>y. inv (blinfun_apply (f'(g y)))" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2861 | show "(g has_derivative g' y) (at y)" if "y \<in> V" for y | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2862 | proof - | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2863 | have gy: "g y \<in> U" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2864 | using g subU that unfolding V_def by fastforce | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2865 | obtain e where e: "\<And>h. f (g y + h) = y + blinfun_apply (f' (g y)) h + e h" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2866 | and e0: "(\<lambda>h. norm (e h) / norm h) \<midarrow>0\<rightarrow> 0" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2867 | using iffD1 [OF has_derivative_iff_Ex derf [OF gy]] \<open>y \<in> V\<close> by auto | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2868 | have [simp]: "e 0 = 0" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2869 | using e [of 0] that by simp | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2870 | let ?INV = "inv (blinfun_apply (f' (g y)))" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2871 | have inj: "inj (blinfun_apply (f' (g y)))" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2872 | using bij bij_betw_def that by blast | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2873 | have "(g has_derivative g' y) (at y within V)" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2874 | unfolding has_derivative_at_within_iff_Ex [OF \<open>y \<in> V\<close> \<open>open V\<close>] | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2875 | proof | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2876 | show blinv: "bounded_linear (g' y)" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2877 | unfolding g'_def using derf gy inj inj_linear_imp_inv_bounded_linear by blast | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2878 | define eg where "eg \<equiv> \<lambda>k. - ?INV (e (g (y+k) - g y))" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2879 | have "g (y+k) = g y + g' y k + eg k" if "y + k \<in> V" for k | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2880 | proof - | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2881 | have "?INV k = ?INV (blinfun_apply (f' (g y)) (g (y+k) - g y) + e (g (y+k) - g y))" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2882 | using e [of "g(y+k) - g y"] that by simp | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2883 | then have "g (y+k) = g y + ?INV k - ?INV (e (g (y+k) - g y))" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2884 | using inj blinv by (simp add: linear_simps g'_def) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2885 | then show ?thesis | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2886 | by (auto simp: eg_def g'_def) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2887 | qed | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2888 | moreover have "(\<lambda>k. norm (eg k) / norm k) \<midarrow>0\<rightarrow> 0" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2889 | proof (rule Lim_null_comparison) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2890 | let ?g = "\<lambda>k. 2 * onorm ?INV * norm (e (g (y+k) - g y)) / norm (g (y+k) - g y)" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2891 | show "\<forall>\<^sub>F k in at 0. norm (norm (eg k) / norm k) \<le> ?g k" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2892 | unfolding eventually_at_topological | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2893 | proof (intro exI conjI ballI impI) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2894 | show "open ((+)(-y) ` V)" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2895 | using \<open>open V\<close> open_translation by blast | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2896 | show "0 \<in> (+)(-y) ` V" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2897 | by (simp add: that) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2898 | show "norm (norm (eg k) / norm k) \<le> 2 * onorm (inv (blinfun_apply (f' (g y)))) * norm (e (g (y+k) - g y)) / norm (g (y+k) - g y)" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2899 | if "k \<in> (+)(-y) ` V" "k \<noteq> 0" for k | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2900 | proof - | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2901 | have "y+k \<in> V" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2902 | using that by auto | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2903 | have "norm (norm (eg k) / norm k) \<le> onorm ?INV * norm (e (g (y+k) - g y)) / norm k" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2904 | using blinv g'_def onorm by (force simp: eg_def divide_simps) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2905 | also have "\<dots> = (norm (g (y+k) - g y) / norm k) * (onorm ?INV * (norm (e (g (y+k) - g y)) / norm (g (y+k) - g y)))" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2906 | by (simp add: divide_simps) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2907 | also have "\<dots> \<le> 2 * (onorm ?INV * (norm (e (g (y+k) - g y)) / norm (g (y+k) - g y)))" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2908 | apply (rule mult_right_mono) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2909 | using 5 [of y "y+k"] \<open>y \<in> V\<close> \<open>y + k \<in> V\<close> onorm_pos_le [OF blinv] | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2910 | apply (auto simp: divide_simps zero_le_mult_iff zero_le_divide_iff g'_def) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2911 | done | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2912 | finally show "norm (norm (eg k) / norm k) \<le> 2 * onorm ?INV * norm (e (g (y+k) - g y)) / norm (g (y+k) - g y)" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2913 | by simp | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2914 | qed | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2915 | qed | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2916 | have 1: "(\<lambda>h. norm (e h) / norm h) \<midarrow>0\<rightarrow> (norm (e 0) / norm 0)" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2917 | using e0 by auto | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2918 | have 2: "(\<lambda>k. g (y+k) - g y) \<midarrow>0\<rightarrow> 0" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2919 | using contg \<open>open V\<close> \<open>y \<in> V\<close> LIM_offset_zero_iff LIM_zero_iff at_within_open continuous_on_def by fastforce | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2920 | from tendsto_compose [OF 1 2, simplified] | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2921 | have "(\<lambda>k. norm (e (g (y+k) - g y)) / norm (g (y+k) - g y)) \<midarrow>0\<rightarrow> 0" . | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2922 | from tendsto_mult_left [OF this] show "?g \<midarrow>0\<rightarrow> 0" by auto | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2923 | qed | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2924 | ultimately show "\<exists>e. (\<forall>k. y + k \<in> V \<longrightarrow> g (y+k) = g y + g' y k + e k) \<and> (\<lambda>k. norm (e k) / norm k) \<midarrow>0\<rightarrow> 0" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2925 | by blast | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2926 | qed | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2927 | then show ?thesis | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2928 | by (metis \<open>open V\<close> at_within_open that) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2929 | qed | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2930 | show "g' y = inv (blinfun_apply (f' (g y)))" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2931 | if "y \<in> V" for y | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2932 | by (simp add: g'_def) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2933 | qed | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2934 | qed | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2935 | |
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2936 | |
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2937 | text\<open>We need all this to justify the scaling and translations.\<close> | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2938 | theorem inverse_function_theorem: | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2939 | fixes f::"'a::euclidean_space \<Rightarrow> 'a" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2940 |     and f'::"'a \<Rightarrow> ('a \<Rightarrow>\<^sub>L 'a)"
 | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2941 | assumes "open U" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2942 | and derf: "\<And>x. x \<in> U \<Longrightarrow> (f has_derivative (blinfun_apply (f' x))) (at x)" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2943 | and contf: "continuous_on U f'" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2944 | and "x0 \<in> U" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2945 | and invf: "invf o\<^sub>L f' x0 = id_blinfun" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2946 | obtains U' V g g' where "open U'" "U' \<subseteq> U" "x0 \<in> U'" "open V" "f x0 \<in> V" "homeomorphism U' V f g" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2947 | "\<And>y. y \<in> V \<Longrightarrow> (g has_derivative (g' y)) (at y)" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2948 | "\<And>y. y \<in> V \<Longrightarrow> g' y = inv (blinfun_apply (f'(g y)))" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2949 | "\<And>y. y \<in> V \<Longrightarrow> bij (blinfun_apply (f'(g y)))" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2950 | proof - | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2951 | have apply1 [simp]: "\<And>i. blinfun_apply invf (blinfun_apply (f' x0) i) = i" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2952 | by (metis blinfun_apply_blinfun_compose blinfun_apply_id_blinfun invf) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2953 | have apply2 [simp]: "\<And>i. blinfun_apply (f' x0) (blinfun_apply invf i) = i" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2954 | by (metis apply1 bij_inv_eq_iff blinfun_bij1 invf) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2955 | have [simp]: "(range (blinfun_apply invf)) = UNIV" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2956 | using apply1 surjI by blast | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2957 | let ?f = "invf \<circ> (\<lambda>x. (f \<circ> (+)x0)x - f x0)" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2958 | let ?f' = "\<lambda>x. invf o\<^sub>L (f' (x + x0))" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2959 | obtain U' V g g' where "open U'" and U': "U' \<subseteq> (+)(-x0) ` U" "0 \<in> U'" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2960 | and "open V" "0 \<in> V" and hom: "homeomorphism U' V ?f g" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2961 | and derg: "\<And>y. y \<in> V \<Longrightarrow> (g has_derivative (g' y)) (at y)" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2962 | and g': "\<And>y. y \<in> V \<Longrightarrow> g' y = inv (?f'(g y))" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2963 | and bij: "\<And>y. y \<in> V \<Longrightarrow> bij (?f'(g y))" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2964 | proof (rule inverse_function_theorem_scaled [of "(+)(-x0) ` U" ?f "?f'"]) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2965 | show ope: "open ((+) (- x0) ` U)" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2966 | using \<open>open U\<close> open_translation by blast | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2967 | show "(?f has_derivative blinfun_apply (?f' x)) (at x)" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2968 | if "x \<in> (+) (- x0) ` U" for x | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2969 | using that | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2970 | apply clarify | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2971 | apply (rule derf derivative_eq_intros | simp add: blinfun_compose.rep_eq)+ | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2972 | done | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2973 | have YY: "(\<lambda>x. f' (x + x0)) \<midarrow>u-x0\<rightarrow> f' u" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2974 | if "f' \<midarrow>u\<rightarrow> f' u" "u \<in> U" for u | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2975 | using that LIM_offset [where k = x0] by (auto simp: algebra_simps) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2976 | then have "continuous_on ((+) (- x0) ` U) (\<lambda>x. f' (x + x0))" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2977 | using contf \<open>open U\<close> Lim_at_imp_Lim_at_within | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2978 | by (fastforce simp: continuous_on_def at_within_open_NO_MATCH ope) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2979 | then show "continuous_on ((+) (- x0) ` U) ?f'" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2980 | by (intro continuous_intros) simp | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2981 | qed (auto simp: invf \<open>x0 \<in> U\<close>) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2982 | show thesis | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2983 | proof | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2984 | let ?U' = "(+)x0 ` U'" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2985 | let ?V = "((+)(f x0) \<circ> f' x0) ` V" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2986 | let ?g = "(+)x0 \<circ> g \<circ> invf \<circ> (+)(- f x0)" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2987 | let ?g' = "\<lambda>y. inv (blinfun_apply (f' (?g y)))" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2988 | show oU': "open ?U'" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2989 | by (simp add: \<open>open U'\<close> open_translation) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2990 | show subU: "?U' \<subseteq> U" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2991 | using ComplI \<open>U' \<subseteq> (+) (- x0) ` U\<close> by auto | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2992 | show "x0 \<in> ?U'" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2993 | by (simp add: \<open>0 \<in> U'\<close>) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2994 | show "open ?V" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2995 | using blinfun_bij2 [OF invf] | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2996 | by (metis \<open>open V\<close> bij_is_surj blinfun.bounded_linear_right bounded_linear_def image_comp open_surjective_linear_image open_translation) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2997 | show "f x0 \<in> ?V" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2998 | using \<open>0 \<in> V\<close> image_iff by fastforce | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 2999 | show "homeomorphism ?U' ?V f ?g" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 3000 | proof | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 3001 | show "continuous_on ?U' f" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 3002 | by (meson subU continuous_on_eq_continuous_at derf has_derivative_continuous oU' subsetD) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 3003 | have "?f ` U' \<subseteq> V" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 3004 | using hom homeomorphism_image1 by blast | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 3005 | then show "f ` ?U' \<subseteq> ?V" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 3006 | unfolding image_subset_iff | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 3007 | by (clarsimp simp: image_def) (metis apply2 add.commute diff_add_cancel) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 3008 | show "?g ` ?V \<subseteq> ?U'" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 3009 | using hom invf by (auto simp: image_def homeomorphism_def) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 3010 | show "?g (f x) = x" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 3011 | if "x \<in> ?U'" for x | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 3012 | using that hom homeomorphism_apply1 by fastforce | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 3013 | have "continuous_on V g" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 3014 | using hom homeomorphism_def by blast | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 3015 | then show "continuous_on ?V ?g" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 3016 | by (intro continuous_intros) (auto elim!: continuous_on_subset) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 3017 | have fg: "?f (g x) = x" if "x \<in> V" for x | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 3018 | using hom homeomorphism_apply2 that by blast | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 3019 | show "f (?g y) = y" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 3020 | if "y \<in> ?V" for y | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 3021 | using that fg by (simp add: image_iff) (metis apply2 add.commute diff_add_cancel) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 3022 | qed | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 3023 | show "(?g has_derivative ?g' y) (at y)" "bij (blinfun_apply (f' (?g y)))" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 3024 | if "y \<in> ?V" for y | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 3025 | proof - | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 3026 | have 1: "bij (blinfun_apply invf)" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 3027 | using blinfun_bij1 invf by blast | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 3028 | then have 2: "bij (blinfun_apply (f' (x0 + g x)))" if "x \<in> V" for x | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 3029 | by (metis add.commute bij bij_betw_comp_iff2 blinfun_compose.rep_eq that top_greatest) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 3030 | then show "bij (blinfun_apply (f' (?g y)))" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 3031 | using that by auto | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 3032 | have "g' x \<circ> blinfun_apply invf = inv (blinfun_apply (f' (x0 + g x)))" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 3033 | if "x \<in> V" for x | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 3034 | using that | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 3035 | by (simp add: g' o_inv_distrib blinfun_compose.rep_eq 1 2 add.commute bij_is_inj flip: o_assoc) | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 3036 | then show "(?g has_derivative ?g' y) (at y)" | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 3037 | using that invf | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 3038 | by clarsimp (rule derg derivative_eq_intros | simp flip: id_def)+ | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 3039 | qed | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 3040 | qed auto | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 3041 | qed | 
| 
5b753486c075
Inverse function theorem + lemmas
 paulson <lp15@cam.ac.uk> parents: 
70817diff
changeset | 3042 | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3043 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3044 | subsection\<^marker>\<open>tag unimportant\<close> \<open>Piecewise differentiable functions\<close> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3045 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3046 | definition piecewise_differentiable_on | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3047 | (infixr "piecewise'_differentiable'_on" 50) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3048 | where "f piecewise_differentiable_on i \<equiv> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3049 | continuous_on i f \<and> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3050 | (\<exists>S. finite S \<and> (\<forall>x \<in> i - S. f differentiable (at x within i)))" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3051 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3052 | lemma piecewise_differentiable_on_imp_continuous_on: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3053 | "f piecewise_differentiable_on S \<Longrightarrow> continuous_on S f" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3054 | by (simp add: piecewise_differentiable_on_def) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3055 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3056 | lemma piecewise_differentiable_on_subset: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3057 | "f piecewise_differentiable_on S \<Longrightarrow> T \<le> S \<Longrightarrow> f piecewise_differentiable_on T" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3058 | using continuous_on_subset | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3059 | unfolding piecewise_differentiable_on_def | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3060 | apply safe | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3061 | apply (blast elim: continuous_on_subset) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3062 | by (meson Diff_iff differentiable_within_subset subsetCE) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3063 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3064 | lemma differentiable_on_imp_piecewise_differentiable: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3065 |   fixes a:: "'a::{linorder_topology,real_normed_vector}"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3066 |   shows "f differentiable_on {a..b} \<Longrightarrow> f piecewise_differentiable_on {a..b}"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3067 | apply (simp add: piecewise_differentiable_on_def differentiable_imp_continuous_on) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3068 |   apply (rule_tac x="{a,b}" in exI, simp add: differentiable_on_def)
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3069 | done | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3070 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3071 | lemma differentiable_imp_piecewise_differentiable: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3072 | "(\<And>x. x \<in> S \<Longrightarrow> f differentiable (at x within S)) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3073 | \<Longrightarrow> f piecewise_differentiable_on S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3074 | by (auto simp: piecewise_differentiable_on_def differentiable_imp_continuous_on differentiable_on_def | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3075 | intro: differentiable_within_subset) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3076 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3077 | lemma piecewise_differentiable_const [iff]: "(\<lambda>x. z) piecewise_differentiable_on S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3078 | by (simp add: differentiable_imp_piecewise_differentiable) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3079 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3080 | lemma piecewise_differentiable_compose: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3081 | "\<lbrakk>f piecewise_differentiable_on S; g piecewise_differentiable_on (f ` S); | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3082 |       \<And>x. finite (S \<inter> f-`{x})\<rbrakk>
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3083 | \<Longrightarrow> (g \<circ> f) piecewise_differentiable_on S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3084 | apply (simp add: piecewise_differentiable_on_def, safe) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3085 | apply (blast intro: continuous_on_compose2) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3086 | apply (rename_tac A B) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3087 |   apply (rule_tac x="A \<union> (\<Union>x\<in>B. S \<inter> f-`{x})" in exI)
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3088 | apply (blast intro!: differentiable_chain_within) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3089 | done | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3090 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3091 | lemma piecewise_differentiable_affine: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3092 | fixes m::real | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3093 | assumes "f piecewise_differentiable_on ((\<lambda>x. m *\<^sub>R x + c) ` S)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3094 | shows "(f \<circ> (\<lambda>x. m *\<^sub>R x + c)) piecewise_differentiable_on S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3095 | proof (cases "m = 0") | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3096 | case True | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3097 | then show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3098 | unfolding o_def | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3099 | by (force intro: differentiable_imp_piecewise_differentiable differentiable_const) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3100 | next | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3101 | case False | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3102 | show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3103 | apply (rule piecewise_differentiable_compose [OF differentiable_imp_piecewise_differentiable]) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3104 | apply (rule assms derivative_intros | simp add: False vimage_def real_vector_affinity_eq)+ | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3105 | done | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3106 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3107 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3108 | lemma piecewise_differentiable_cases: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3109 | fixes c::real | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3110 |   assumes "f piecewise_differentiable_on {a..c}"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3111 |           "g piecewise_differentiable_on {c..b}"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3112 | "a \<le> c" "c \<le> b" "f c = g c" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3113 |   shows "(\<lambda>x. if x \<le> c then f x else g x) piecewise_differentiable_on {a..b}"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3114 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3115 | obtain S T where st: "finite S" "finite T" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3116 |                and fd: "\<And>x. x \<in> {a..c} - S \<Longrightarrow> f differentiable at x within {a..c}"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3117 |                and gd: "\<And>x. x \<in> {c..b} - T \<Longrightarrow> g differentiable at x within {c..b}"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3118 | using assms | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3119 | by (auto simp: piecewise_differentiable_on_def) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3120 |   have finabc: "finite ({a,b,c} \<union> (S \<union> T))"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3121 | by (metis \<open>finite S\<close> \<open>finite T\<close> finite_Un finite_insert finite.emptyI) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3122 |   have "continuous_on {a..c} f" "continuous_on {c..b} g"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3123 | using assms piecewise_differentiable_on_def by auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3124 |   then have "continuous_on {a..b} (\<lambda>x. if x \<le> c then f x else g x)"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3125 | using continuous_on_cases [OF closed_real_atLeastAtMost [of a c], | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3126 | OF closed_real_atLeastAtMost [of c b], | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3127 | of f g "\<lambda>x. x\<le>c"] assms | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3128 | by (force simp: ivl_disj_un_two_touch) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3129 | moreover | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3130 |   { fix x
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3131 |     assume x: "x \<in> {a..b} - ({a,b,c} \<union> (S \<union> T))"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3132 |     have "(\<lambda>x. if x \<le> c then f x else g x) differentiable at x within {a..b}" (is "?diff_fg")
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3133 | proof (cases x c rule: le_cases) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3134 | case le show ?diff_fg | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3135 | proof (rule differentiable_transform_within [where d = "dist x c"]) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3136 | have "f differentiable at x" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3137 |           using x le fd [of x] at_within_interior [of x "{a..c}"] by simp
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3138 |         then show "f differentiable at x within {a..b}"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3139 | by (simp add: differentiable_at_withinI) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3140 | qed (use x le st dist_real_def in auto) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3141 | next | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3142 | case ge show ?diff_fg | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3143 | proof (rule differentiable_transform_within [where d = "dist x c"]) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3144 | have "g differentiable at x" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3145 |           using x ge gd [of x] at_within_interior [of x "{c..b}"] by simp
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3146 |         then show "g differentiable at x within {a..b}"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3147 | by (simp add: differentiable_at_withinI) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3148 | qed (use x ge st dist_real_def in auto) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3149 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3150 | } | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3151 | then have "\<exists>S. finite S \<and> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3152 |                  (\<forall>x\<in>{a..b} - S. (\<lambda>x. if x \<le> c then f x else g x) differentiable at x within {a..b})"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3153 | by (meson finabc) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3154 | ultimately show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3155 | by (simp add: piecewise_differentiable_on_def) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3156 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3157 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3158 | lemma piecewise_differentiable_neg: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3159 | "f piecewise_differentiable_on S \<Longrightarrow> (\<lambda>x. -(f x)) piecewise_differentiable_on S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3160 | by (auto simp: piecewise_differentiable_on_def continuous_on_minus) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3161 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3162 | lemma piecewise_differentiable_add: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3163 | assumes "f piecewise_differentiable_on i" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3164 | "g piecewise_differentiable_on i" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3165 | shows "(\<lambda>x. f x + g x) piecewise_differentiable_on i" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3166 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3167 | obtain S T where st: "finite S" "finite T" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3168 | "\<forall>x\<in>i - S. f differentiable at x within i" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3169 | "\<forall>x\<in>i - T. g differentiable at x within i" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3170 | using assms by (auto simp: piecewise_differentiable_on_def) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3171 | then have "finite (S \<union> T) \<and> (\<forall>x\<in>i - (S \<union> T). (\<lambda>x. f x + g x) differentiable at x within i)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3172 | by auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3173 | moreover have "continuous_on i f" "continuous_on i g" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3174 | using assms piecewise_differentiable_on_def by auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3175 | ultimately show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3176 | by (auto simp: piecewise_differentiable_on_def continuous_on_add) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3177 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3178 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3179 | lemma piecewise_differentiable_diff: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3180 | "\<lbrakk>f piecewise_differentiable_on S; g piecewise_differentiable_on S\<rbrakk> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3181 | \<Longrightarrow> (\<lambda>x. f x - g x) piecewise_differentiable_on S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3182 | unfolding diff_conv_add_uminus | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3183 | by (metis piecewise_differentiable_add piecewise_differentiable_neg) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3184 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3185 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3186 | subsection\<open>The concept of continuously differentiable\<close> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3187 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3188 | text \<open> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3189 | John Harrison writes as follows: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3190 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3191 | ``The usual assumption in complex analysis texts is that a path \<open>\<gamma>\<close> should be piecewise | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3192 | continuously differentiable, which ensures that the path integral exists at least for any continuous | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3193 | f, since all piecewise continuous functions are integrable. However, our notion of validity is | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3194 | weaker, just piecewise differentiability\ldots{} [namely] continuity plus differentiability except on a
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3195 | finite set\ldots{} [Our] underlying theory of integration is the Kurzweil-Henstock theory. In contrast to
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3196 | the Riemann or Lebesgue theory (but in common with a simple notion based on antiderivatives), this | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3197 | can integrate all derivatives.'' | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3198 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3199 | "Formalizing basic complex analysis." From Insight to Proof: Festschrift in Honour of Andrzej Trybulec. | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3200 | Studies in Logic, Grammar and Rhetoric 10.23 (2007): 151-165. | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3201 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3202 | And indeed he does not assume that his derivatives are continuous, but the penalty is unreasonably | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3203 | difficult proofs concerning winding numbers. We need a self-contained and straightforward theorem | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3204 | asserting that all derivatives can be integrated before we can adopt Harrison's choice.\<close> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3205 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3206 | definition\<^marker>\<open>tag important\<close> C1_differentiable_on :: "(real \<Rightarrow> 'a::real_normed_vector) \<Rightarrow> real set \<Rightarrow> bool" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3207 | (infix "C1'_differentiable'_on" 50) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3208 | where | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3209 | "f C1_differentiable_on S \<longleftrightarrow> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3210 | (\<exists>D. (\<forall>x \<in> S. (f has_vector_derivative (D x)) (at x)) \<and> continuous_on S D)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3211 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3212 | lemma C1_differentiable_on_eq: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3213 | "f C1_differentiable_on S \<longleftrightarrow> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3214 | (\<forall>x \<in> S. f differentiable at x) \<and> continuous_on S (\<lambda>x. vector_derivative f (at x))" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3215 | (is "?lhs = ?rhs") | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3216 | proof | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3217 | assume ?lhs | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3218 | then show ?rhs | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3219 | unfolding C1_differentiable_on_def | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3220 | by (metis (no_types, lifting) continuous_on_eq differentiableI_vector vector_derivative_at) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3221 | next | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3222 | assume ?rhs | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3223 | then show ?lhs | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3224 | using C1_differentiable_on_def vector_derivative_works by fastforce | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3225 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3226 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3227 | lemma C1_differentiable_on_subset: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3228 | "f C1_differentiable_on T \<Longrightarrow> S \<subseteq> T \<Longrightarrow> f C1_differentiable_on S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3229 | unfolding C1_differentiable_on_def continuous_on_eq_continuous_within | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3230 | by (blast intro: continuous_within_subset) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3231 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3232 | lemma C1_differentiable_compose: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3233 |   assumes fg: "f C1_differentiable_on S" "g C1_differentiable_on (f ` S)" and fin: "\<And>x. finite (S \<inter> f-`{x})"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3234 | shows "(g \<circ> f) C1_differentiable_on S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3235 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3236 | have "\<And>x. x \<in> S \<Longrightarrow> g \<circ> f differentiable at x" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3237 | by (meson C1_differentiable_on_eq assms differentiable_chain_at imageI) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3238 | moreover have "continuous_on S (\<lambda>x. vector_derivative (g \<circ> f) (at x))" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3239 | proof (rule continuous_on_eq [of _ "\<lambda>x. vector_derivative f (at x) *\<^sub>R vector_derivative g (at (f x))"]) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3240 | show "continuous_on S (\<lambda>x. vector_derivative f (at x) *\<^sub>R vector_derivative g (at (f x)))" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3241 | using fg | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3242 | apply (clarsimp simp add: C1_differentiable_on_eq) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3243 | apply (rule Limits.continuous_on_scaleR, assumption) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3244 | by (metis (mono_tags, lifting) continuous_at_imp_continuous_on continuous_on_compose continuous_on_cong differentiable_imp_continuous_within o_def) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3245 | show "\<And>x. x \<in> S \<Longrightarrow> vector_derivative f (at x) *\<^sub>R vector_derivative g (at (f x)) = vector_derivative (g \<circ> f) (at x)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3246 | by (metis (mono_tags, hide_lams) C1_differentiable_on_eq fg imageI vector_derivative_chain_at) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3247 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3248 | ultimately show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3249 | by (simp add: C1_differentiable_on_eq) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3250 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3251 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3252 | lemma C1_diff_imp_diff: "f C1_differentiable_on S \<Longrightarrow> f differentiable_on S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3253 | by (simp add: C1_differentiable_on_eq differentiable_at_imp_differentiable_on) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3254 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3255 | lemma C1_differentiable_on_ident [simp, derivative_intros]: "(\<lambda>x. x) C1_differentiable_on S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3256 | by (auto simp: C1_differentiable_on_eq) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3257 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3258 | lemma C1_differentiable_on_const [simp, derivative_intros]: "(\<lambda>z. a) C1_differentiable_on S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3259 | by (auto simp: C1_differentiable_on_eq) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3260 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3261 | lemma C1_differentiable_on_add [simp, derivative_intros]: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3262 | "f C1_differentiable_on S \<Longrightarrow> g C1_differentiable_on S \<Longrightarrow> (\<lambda>x. f x + g x) C1_differentiable_on S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3263 | unfolding C1_differentiable_on_eq by (auto intro: continuous_intros) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3264 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3265 | lemma C1_differentiable_on_minus [simp, derivative_intros]: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3266 | "f C1_differentiable_on S \<Longrightarrow> (\<lambda>x. - f x) C1_differentiable_on S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3267 | unfolding C1_differentiable_on_eq by (auto intro: continuous_intros) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3268 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3269 | lemma C1_differentiable_on_diff [simp, derivative_intros]: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3270 | "f C1_differentiable_on S \<Longrightarrow> g C1_differentiable_on S \<Longrightarrow> (\<lambda>x. f x - g x) C1_differentiable_on S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3271 | unfolding C1_differentiable_on_eq by (auto intro: continuous_intros) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3272 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3273 | lemma C1_differentiable_on_mult [simp, derivative_intros]: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3274 | fixes f g :: "real \<Rightarrow> 'a :: real_normed_algebra" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3275 | shows "f C1_differentiable_on S \<Longrightarrow> g C1_differentiable_on S \<Longrightarrow> (\<lambda>x. f x * g x) C1_differentiable_on S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3276 | unfolding C1_differentiable_on_eq | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3277 | by (auto simp: continuous_on_add continuous_on_mult continuous_at_imp_continuous_on differentiable_imp_continuous_within) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3278 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3279 | lemma C1_differentiable_on_scaleR [simp, derivative_intros]: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3280 | "f C1_differentiable_on S \<Longrightarrow> g C1_differentiable_on S \<Longrightarrow> (\<lambda>x. f x *\<^sub>R g x) C1_differentiable_on S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3281 | unfolding C1_differentiable_on_eq | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3282 | by (rule continuous_intros | simp add: continuous_at_imp_continuous_on differentiable_imp_continuous_within)+ | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3283 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3284 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3285 | definition\<^marker>\<open>tag important\<close> piecewise_C1_differentiable_on | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3286 | (infixr "piecewise'_C1'_differentiable'_on" 50) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3287 | where "f piecewise_C1_differentiable_on i \<equiv> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3288 | continuous_on i f \<and> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3289 | (\<exists>S. finite S \<and> (f C1_differentiable_on (i - S)))" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3290 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3291 | lemma C1_differentiable_imp_piecewise: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3292 | "f C1_differentiable_on S \<Longrightarrow> f piecewise_C1_differentiable_on S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3293 | by (auto simp: piecewise_C1_differentiable_on_def C1_differentiable_on_eq continuous_at_imp_continuous_on differentiable_imp_continuous_within) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3294 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3295 | lemma piecewise_C1_imp_differentiable: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3296 | "f piecewise_C1_differentiable_on i \<Longrightarrow> f piecewise_differentiable_on i" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3297 | by (auto simp: piecewise_C1_differentiable_on_def piecewise_differentiable_on_def | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3298 | C1_differentiable_on_def differentiable_def has_vector_derivative_def | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3299 | intro: has_derivative_at_withinI) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3300 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3301 | lemma piecewise_C1_differentiable_compose: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3302 |   assumes fg: "f piecewise_C1_differentiable_on S" "g piecewise_C1_differentiable_on (f ` S)" and fin: "\<And>x. finite (S \<inter> f-`{x})"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3303 | shows "(g \<circ> f) piecewise_C1_differentiable_on S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3304 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3305 | have "continuous_on S (\<lambda>x. g (f x))" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3306 | by (metis continuous_on_compose2 fg order_refl piecewise_C1_differentiable_on_def) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3307 | moreover have "\<exists>T. finite T \<and> g \<circ> f C1_differentiable_on S - T" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3308 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3309 | obtain F where "finite F" and F: "f C1_differentiable_on S - F" and f: "f piecewise_C1_differentiable_on S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3310 | using fg by (auto simp: piecewise_C1_differentiable_on_def) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3311 | obtain G where "finite G" and G: "g C1_differentiable_on f ` S - G" and g: "g piecewise_C1_differentiable_on f ` S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3312 | using fg by (auto simp: piecewise_C1_differentiable_on_def) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3313 | show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3314 | proof (intro exI conjI) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3315 |       show "finite (F \<union> (\<Union>x\<in>G. S \<inter> f-`{x}))"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3316 | using fin by (auto simp only: Int_Union \<open>finite F\<close> \<open>finite G\<close> finite_UN finite_imageI) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3317 |       show "g \<circ> f C1_differentiable_on S - (F \<union> (\<Union>x\<in>G. S \<inter> f -` {x}))"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3318 | apply (rule C1_differentiable_compose) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3319 | apply (blast intro: C1_differentiable_on_subset [OF F]) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3320 | apply (blast intro: C1_differentiable_on_subset [OF G]) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3321 | by (simp add: C1_differentiable_on_subset G Diff_Int_distrib2 fin) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3322 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3323 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3324 | ultimately show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3325 | by (simp add: piecewise_C1_differentiable_on_def) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3326 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3327 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3328 | lemma piecewise_C1_differentiable_on_subset: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3329 | "f piecewise_C1_differentiable_on S \<Longrightarrow> T \<le> S \<Longrightarrow> f piecewise_C1_differentiable_on T" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3330 | by (auto simp: piecewise_C1_differentiable_on_def elim!: continuous_on_subset C1_differentiable_on_subset) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3331 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3332 | lemma C1_differentiable_imp_continuous_on: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3333 | "f C1_differentiable_on S \<Longrightarrow> continuous_on S f" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3334 | unfolding C1_differentiable_on_eq continuous_on_eq_continuous_within | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3335 | using differentiable_at_withinI differentiable_imp_continuous_within by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3336 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3337 | lemma C1_differentiable_on_empty [iff]: "f C1_differentiable_on {}"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3338 | unfolding C1_differentiable_on_def | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3339 | by auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3340 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3341 | lemma piecewise_C1_differentiable_affine: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3342 | fixes m::real | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3343 | assumes "f piecewise_C1_differentiable_on ((\<lambda>x. m * x + c) ` S)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3344 | shows "(f \<circ> (\<lambda>x. m *\<^sub>R x + c)) piecewise_C1_differentiable_on S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3345 | proof (cases "m = 0") | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3346 | case True | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3347 | then show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3348 | unfolding o_def by (auto simp: piecewise_C1_differentiable_on_def) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3349 | next | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3350 | case False | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3351 |   have *: "\<And>x. finite (S \<inter> {y. m * y + c = x})"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3352 | using False not_finite_existsD by fastforce | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3353 | show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3354 | apply (rule piecewise_C1_differentiable_compose [OF C1_differentiable_imp_piecewise]) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3355 | apply (rule * assms derivative_intros | simp add: False vimage_def)+ | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3356 | done | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3357 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3358 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3359 | lemma piecewise_C1_differentiable_cases: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3360 | fixes c::real | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3361 |   assumes "f piecewise_C1_differentiable_on {a..c}"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3362 |           "g piecewise_C1_differentiable_on {c..b}"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3363 | "a \<le> c" "c \<le> b" "f c = g c" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3364 |   shows "(\<lambda>x. if x \<le> c then f x else g x) piecewise_C1_differentiable_on {a..b}"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3365 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3366 |   obtain S T where st: "f C1_differentiable_on ({a..c} - S)"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3367 |                        "g C1_differentiable_on ({c..b} - T)"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3368 | "finite S" "finite T" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3369 | using assms | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3370 | by (force simp: piecewise_C1_differentiable_on_def) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3371 |   then have f_diff: "f differentiable_on {a..<c} - S"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3372 |         and g_diff: "g differentiable_on {c<..b} - T"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3373 | by (simp_all add: C1_differentiable_on_eq differentiable_at_withinI differentiable_on_def) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3374 |   have "continuous_on {a..c} f" "continuous_on {c..b} g"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3375 | using assms piecewise_C1_differentiable_on_def by auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3376 |   then have cab: "continuous_on {a..b} (\<lambda>x. if x \<le> c then f x else g x)"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3377 | using continuous_on_cases [OF closed_real_atLeastAtMost [of a c], | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3378 | OF closed_real_atLeastAtMost [of c b], | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3379 | of f g "\<lambda>x. x\<le>c"] assms | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3380 | by (force simp: ivl_disj_un_two_touch) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3381 |   { fix x
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3382 |     assume x: "x \<in> {a..b} - insert c (S \<union> T)"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3383 | have "(\<lambda>x. if x \<le> c then f x else g x) differentiable at x" (is "?diff_fg") | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3384 | proof (cases x c rule: le_cases) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3385 | case le show ?diff_fg | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3386 | apply (rule differentiable_transform_within [where f=f and d = "dist x c"]) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3387 | using x dist_real_def le st by (auto simp: C1_differentiable_on_eq) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3388 | next | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3389 | case ge show ?diff_fg | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3390 | apply (rule differentiable_transform_within [where f=g and d = "dist x c"]) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3391 | using dist_nz x dist_real_def ge st x by (auto simp: C1_differentiable_on_eq) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3392 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3393 | } | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3394 |   then have "(\<forall>x \<in> {a..b} - insert c (S \<union> T). (\<lambda>x. if x \<le> c then f x else g x) differentiable at x)"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3395 | by auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3396 | moreover | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3397 |   { assume fcon: "continuous_on ({a<..<c} - S) (\<lambda>x. vector_derivative f (at x))"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3398 |        and gcon: "continuous_on ({c<..<b} - T) (\<lambda>x. vector_derivative g (at x))"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3399 |     have "open ({a<..<c} - S)"  "open ({c<..<b} - T)"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3400 | using st by (simp_all add: open_Diff finite_imp_closed) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3401 |     moreover have "continuous_on ({a<..<c} - S) (\<lambda>x. vector_derivative (\<lambda>x. if x \<le> c then f x else g x) (at x))"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3402 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3403 | have "((\<lambda>x. if x \<le> c then f x else g x) has_vector_derivative vector_derivative f (at x)) (at x)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3404 | if "a < x" "x < c" "x \<notin> S" for x | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3405 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3406 | have f: "f differentiable at x" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3407 | by (meson C1_differentiable_on_eq Diff_iff atLeastAtMost_iff less_eq_real_def st(1) that) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3408 | show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3409 | using that | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3410 | apply (rule_tac f=f and d="dist x c" in has_vector_derivative_transform_within) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3411 | apply (auto simp: dist_norm vector_derivative_works [symmetric] f) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3412 | done | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3413 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3414 | then show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3415 | by (metis (no_types, lifting) continuous_on_eq [OF fcon] DiffE greaterThanLessThan_iff vector_derivative_at) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3416 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3417 |     moreover have "continuous_on ({c<..<b} - T) (\<lambda>x. vector_derivative (\<lambda>x. if x \<le> c then f x else g x) (at x))"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3418 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3419 | have "((\<lambda>x. if x \<le> c then f x else g x) has_vector_derivative vector_derivative g (at x)) (at x)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3420 | if "c < x" "x < b" "x \<notin> T" for x | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3421 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3422 | have g: "g differentiable at x" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3423 | by (metis C1_differentiable_on_eq DiffD1 DiffI atLeastAtMost_diff_ends greaterThanLessThan_iff st(2) that) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3424 | show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3425 | using that | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3426 | apply (rule_tac f=g and d="dist x c" in has_vector_derivative_transform_within) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3427 | apply (auto simp: dist_norm vector_derivative_works [symmetric] g) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3428 | done | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3429 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3430 | then show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3431 | by (metis (no_types, lifting) continuous_on_eq [OF gcon] DiffE greaterThanLessThan_iff vector_derivative_at) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3432 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3433 |     ultimately have "continuous_on ({a<..<b} - insert c (S \<union> T))
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3434 | (\<lambda>x. vector_derivative (\<lambda>x. if x \<le> c then f x else g x) (at x))" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3435 | by (rule continuous_on_subset [OF continuous_on_open_Un], auto) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3436 | } note * = this | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3437 |   have "continuous_on ({a<..<b} - insert c (S \<union> T)) (\<lambda>x. vector_derivative (\<lambda>x. if x \<le> c then f x else g x) (at x))"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3438 | using st | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3439 | by (auto simp: C1_differentiable_on_eq elim!: continuous_on_subset intro: *) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3440 |   ultimately have "\<exists>S. finite S \<and> ((\<lambda>x. if x \<le> c then f x else g x) C1_differentiable_on {a..b} - S)"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3441 |     apply (rule_tac x="{a,b,c} \<union> S \<union> T" in exI)
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3442 | using st by (auto simp: C1_differentiable_on_eq elim!: continuous_on_subset) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3443 | with cab show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3444 | by (simp add: piecewise_C1_differentiable_on_def) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3445 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3446 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3447 | lemma piecewise_C1_differentiable_neg: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3448 | "f piecewise_C1_differentiable_on S \<Longrightarrow> (\<lambda>x. -(f x)) piecewise_C1_differentiable_on S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3449 | unfolding piecewise_C1_differentiable_on_def | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3450 | by (auto intro!: continuous_on_minus C1_differentiable_on_minus) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3451 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3452 | lemma piecewise_C1_differentiable_add: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3453 | assumes "f piecewise_C1_differentiable_on i" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3454 | "g piecewise_C1_differentiable_on i" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3455 | shows "(\<lambda>x. f x + g x) piecewise_C1_differentiable_on i" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3456 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3457 | obtain S t where st: "finite S" "finite t" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3458 | "f C1_differentiable_on (i-S)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3459 | "g C1_differentiable_on (i-t)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3460 | using assms by (auto simp: piecewise_C1_differentiable_on_def) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3461 | then have "finite (S \<union> t) \<and> (\<lambda>x. f x + g x) C1_differentiable_on i - (S \<union> t)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3462 | by (auto intro: C1_differentiable_on_add elim!: C1_differentiable_on_subset) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3463 | moreover have "continuous_on i f" "continuous_on i g" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3464 | using assms piecewise_C1_differentiable_on_def by auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3465 | ultimately show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3466 | by (auto simp: piecewise_C1_differentiable_on_def continuous_on_add) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3467 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3468 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3469 | lemma piecewise_C1_differentiable_diff: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3470 | "\<lbrakk>f piecewise_C1_differentiable_on S; g piecewise_C1_differentiable_on S\<rbrakk> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3471 | \<Longrightarrow> (\<lambda>x. f x - g x) piecewise_C1_differentiable_on S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3472 | unfolding diff_conv_add_uminus | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3473 | by (metis piecewise_C1_differentiable_add piecewise_C1_differentiable_neg) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71174diff
changeset | 3474 | |
| 33741 
4c414d0835ab
Added derivation and Brouwer's fixpoint theorem in Multivariate Analysis (translated by Robert Himmelmann from HOL-light)
 hoelzl parents: diff
changeset | 3475 | end |