(* Title: HOL/Analysis/Lipschitz.thy Author: Sébastien Gouëzel sebastien.gouezel@univ-rennes1.fr Author: Fabian Immler, TU München
*)
section \<open>Lipschitz Continuity\<close>
theory Lipschitz imports
Derivative Abstract_Metric_Spaces begin
definition\<^marker>\<open>tag important\<close> lipschitz_on where"lipschitz_on C U f \ (0 \ C \ (\x \ U. \y\U. dist (f x) (f y) \ C * dist x y))"
open_bundle lipschitz_syntax begin notation\<^marker>\<open>tag important\<close>
lipschitz_on (\<open>(\<open>open_block notation=\<open>postfix lipschitz_on\<close>\<close>_-lipschitz'_on)\<close> [1000]) end
lemma lipschitz_onI: "L-lipschitz_on X f" if"\x y. x \ X \ y \ X \ dist (f x) (f y) \ L * dist x y" "0 \ L" using that by (auto simp: lipschitz_on_def)
lemma lipschitz_onD: "dist (f x) (f y) \ L * dist x y" if"L-lipschitz_on X f""x \ X" "y \ X" using that by (auto simp: lipschitz_on_def)
lemma lipschitz_on_nonneg: "0 \ L" if "L-lipschitz_on X f" using that by (auto simp: lipschitz_on_def)
lemma lipschitz_on_normD: "norm (f x - f y) \ L * norm (x - y)" if"lipschitz_on L X f""x \ X" "y \ X" using lipschitz_onD[OF that] by (simp add: dist_norm)
lemma lipschitz_on_mono: "L-lipschitz_on D f"if"M-lipschitz_on E f""D \ E" "M \ L" using that by (force simp: lipschitz_on_def intro: order_trans[OF _ mult_right_mono])
lemma lipschitz_on_leI: "L-lipschitz_on X f" if"\x y. x \ X \ y \ X \ x \ y \ dist (f x) (f y) \ L * dist x y" "0 \ L" for f::"'a::{linorder_topology, ordered_real_vector, metric_space} \ 'b::metric_space" proof (rule lipschitz_onI) fix x y assume xy: "x \ X" "y \ X"
consider "y \ x" | "x \ y" by (rule le_cases) thenshow"dist (f x) (f y) \ L * dist x y" proof cases case 1 thenhave"dist (f y) (f x) \ L * dist y x" by (auto intro!: that xy) thenshow ?thesis by (simp add: dist_commute) qed (auto intro!: that xy) qed fact
lemma lipschitz_on_concat: fixes a b c::real assumes f: "L-lipschitz_on {a .. b} f" assumes g: "L-lipschitz_on {b .. c} g" assumes fg: "f b = g b" shows"lipschitz_on L {a .. c} (\x. if x \ b then f x else g x)"
(is"lipschitz_on _ _ ?f") proof (rule lipschitz_on_leI) fix x y assume x: "x \ {a..c}" and y: "y \ {a..c}" and xy: "x \ y"
consider "x \ b \ b < y" | "x \ b \ y \ b" by arith thenshow"dist (?f x) (?f y) \ L * dist x y" proof cases case 1 have"dist (f x) (g y) \ dist (f x) (f b) + dist (g b) (g y)" unfolding fg by (rule dist_triangle) alsohave"dist (f x) (f b) \ L * dist x b" using 1 x by (auto intro!: lipschitz_onD[OF f]) alsohave"dist (g b) (g y) \ L * dist b y" using 1 x y by (auto intro!: lipschitz_onD[OF g] lipschitz_onD[OF f]) finallyhave"dist (f x) (g y) \ L * dist x b + L * dist b y" by simp alsohave"\ = L * (dist x b + dist b y)" by (simp add: algebra_simps) alsohave"dist x b + dist b y = dist x y" using 1 x y by (auto simp: dist_real_def abs_real_def) finallyshow ?thesis using 1 by simp next case 2 with lipschitz_onD[OF f, of x y] lipschitz_onD[OF g, of x y] x y xy show ?thesis by (auto simp: fg) qed qed (rule lipschitz_on_nonneg[OF f])
lemma lipschitz_on_concat_max: fixes a b c::real assumes f: "L-lipschitz_on {a .. b} f" assumes g: "M-lipschitz_on {b .. c} g" assumes fg: "f b = g b" shows"(max L M)-lipschitz_on {a .. c} (\x. if x \ b then f x else g x)" proof - have"lipschitz_on (max L M) {a .. b} f""lipschitz_on (max L M) {b .. c} g" by (auto intro!: lipschitz_on_mono[OF f order_refl] lipschitz_on_mono[OF g order_refl]) from lipschitz_on_concat[OF this fg] show ?thesis . qed
text\<open>Equivalence between "abstract" and "type class" Lipschitz notions, for all typesin the metric space class\<close> lemma Lipschitz_map_euclidean [simp]: "Lipschitz_continuous_map euclidean_metric euclidean_metric f \<longleftrightarrow> (\<exists>B. lipschitz_on B UNIV f)" (is "?lhs \<longleftrightarrow> ?rhs") proof show"?lhs \ ?rhs" by (force simp add: Lipschitz_continuous_map_pos lipschitz_on_def less_le_not_le) show"?rhs \ ?lhs" by (auto simp: Lipschitz_continuous_map_def lipschitz_on_def) qed
subsubsection \<open>Continuity\<close>
proposition lipschitz_on_uniformly_continuous: assumes"L-lipschitz_on X f" shows"uniformly_continuous_on X f" unfolding uniformly_continuous_on_def proof safe fix e::real assume"0 < e" from assms have l: "(L+1)-lipschitz_on X f" by (rule lipschitz_on_mono) auto show"\d>0. \x\X. \x'\X. dist x' x < d \ dist (f x') (f x) < e" using lipschitz_onD[OF l] lipschitz_on_nonneg[OF assms] \<open>0 < e\<close> by (force intro!: exI[where x="e/(L + 1)"] simp: field_simps) qed
proposition lipschitz_on_continuous_on: "continuous_on X f"if"L-lipschitz_on X f" by (rule uniformly_continuous_imp_continuous[OF lipschitz_on_uniformly_continuous[OF that]])
lemma lipschitz_on_continuous_within: "continuous (at x within X) f"if"L-lipschitz_on X f""x \ X" using lipschitz_on_continuous_on[OF that(1)] that(2) by (auto simp: continuous_on_eq_continuous_within)
proposition bounded_derivative_imp_lipschitz: assumes"\x. x \ X \ (f has_derivative f' x) (at x within X)" assumes convex: "convex X" assumes"\x. x \ X \ onorm (f' x) \ C" "0 \ C" shows"C-lipschitz_on X f" proof (rule lipschitz_onI) show"\x y. x \ X \ y \ X \ dist (f x) (f y) \ C * dist x y" by (auto intro!: assms differentiable_bound[unfolded dist_norm[symmetric], OF convex]) qed fact
named_theorems lipschitz_intros "structural introduction rules for Lipschitz controls"
lemma lipschitz_on_compose [lipschitz_intros]: "(D * C)-lipschitz_on U (g o f)" if f: "C-lipschitz_on U f"and g: "D-lipschitz_on (f`U) g" proof (rule lipschitz_onI) show"D* C \ 0" using lipschitz_on_nonneg[OF f] lipschitz_on_nonneg[OF g] by auto fix x y assume H: "x \ U" "y \ U" have"dist (g (f x)) (g (f y)) \ D * dist (f x) (f y)" apply (rule lipschitz_onD[OF g]) using H by auto alsohave"... \ D * C * dist x y" using mult_left_mono[OF lipschitz_onD(1)[OF f H] lipschitz_on_nonneg[OF g]] by auto finallyshow"dist ((g \ f) x) ((g \ f) y) \ D * C* dist x y" unfolding comp_def by (auto simp add: mult.commute) qed
lemma lipschitz_on_compose2: "(D * C)-lipschitz_on U (\x. g (f x))" if"C-lipschitz_on U f""D-lipschitz_on (f`U) g" using lipschitz_on_compose[OF that] by (simp add: o_def)
lemma lipschitz_on_cong[cong]: "C-lipschitz_on U g \ D-lipschitz_on V f" if"C = D""U = V""\x. x \ V \ g x = f x" using that by (auto simp: lipschitz_on_def)
lemma lipschitz_on_transform: "C-lipschitz_on U g" if"C-lipschitz_on U f" "\x. x \ U \ g x = f x" using that by simp
lemma lipschitz_on_empty_iff[simp]: "C-lipschitz_on {} f \ C \ 0" by (auto simp: lipschitz_on_def)
lemma lipschitz_on_insert_iff[simp]: "C-lipschitz_on (insert y X) f \
C-lipschitz_on X f \<and> (\<forall>x \<in> X. dist (f x) (f y) \<le> C * dist x y)" by (auto simp: lipschitz_on_def dist_commute)
lemma lipschitz_on_id [lipschitz_intros]: "1-lipschitz_on U (\x. x)" by (auto simp: lipschitz_on_def)
lemma lipschitz_on_constant [lipschitz_intros]: "0-lipschitz_on U (\x. c)" by (auto simp: lipschitz_on_def)
lemma lipschitz_on_add [lipschitz_intros]: fixes f::"'a::metric_space \'b::real_normed_vector" assumes"C-lipschitz_on U f" "D-lipschitz_on U g" shows"(C+D)-lipschitz_on U (\x. f x + g x)" proof (rule lipschitz_onI) show"C + D \ 0" using lipschitz_on_nonneg[OF assms(1)] lipschitz_on_nonneg[OF assms(2)] by auto fix x y assume H: "x \ U" "y \ U" have"dist (f x + g x) (f y + g y) \ dist (f x) (f y) + dist (g x) (g y)" by (simp add: dist_triangle_add) alsohave"... \ C * dist x y + D * dist x y" using lipschitz_onD(1)[OF assms(1) H] lipschitz_onD(1)[OF assms(2) H] by auto finallyshow"dist (f x + g x) (f y + g y) \ (C+D) * dist x y" by (auto simp add: algebra_simps) qed
lemma lipschitz_on_cmult [lipschitz_intros]: fixes f::"'a::metric_space \ 'b::real_normed_vector" assumes"C-lipschitz_on U f" shows"(abs(a) * C)-lipschitz_on U (\x. a *\<^sub>R f x)" proof (rule lipschitz_onI) show"abs(a) * C \ 0" using lipschitz_on_nonneg[OF assms(1)] by auto fix x y assume H: "x \ U" "y \ U" have"dist (a *\<^sub>R f x) (a *\<^sub>R f y) = abs(a) * dist (f x) (f y)" by (metis dist_norm norm_scaleR real_vector.scale_right_diff_distrib) alsohave"... \ abs(a) * C * dist x y" using lipschitz_onD(1)[OF assms(1) H] by (simp add: Groups.mult_ac(1) mult_left_mono) finallyshow"dist (a *\<^sub>R f x) (a *\<^sub>R f y) \ \a\ * C * dist x y" by auto qed
lemma lipschitz_on_cmult_real [lipschitz_intros]: fixes f::"'a::metric_space \ real" assumes"C-lipschitz_on U f" shows"(abs(a) * C)-lipschitz_on U (\x. a * f x)" using lipschitz_on_cmult[OF assms] by auto
lemma lipschitz_on_cmult_nonneg [lipschitz_intros]: fixes f::"'a::metric_space \ 'b::real_normed_vector" assumes"C-lipschitz_on U f" "a \ 0" shows"(a * C)-lipschitz_on U (\x. a *\<^sub>R f x)" using lipschitz_on_cmult[OF assms(1), of a] assms(2) by auto
lemma lipschitz_on_cmult_real_nonneg [lipschitz_intros]: fixes f::"'a::metric_space \ real" assumes"C-lipschitz_on U f" "a \ 0" shows"(a * C)-lipschitz_on U (\x. a * f x)" using lipschitz_on_cmult_nonneg[OF assms] by auto
lemma lipschitz_on_cmult_upper [lipschitz_intros]: fixes f::"'a::metric_space \ 'b::real_normed_vector" assumes"C-lipschitz_on U f" "abs(a) \ D" shows"(D * C)-lipschitz_on U (\x. a *\<^sub>R f x)" apply (rule lipschitz_on_mono[OF lipschitz_on_cmult[OF assms(1), of a], of _ "D * C"]) using assms(2) lipschitz_on_nonneg[OF assms(1)] mult_right_mono by auto
lemma lipschitz_on_cmult_real_upper [lipschitz_intros]: fixes f::"'a::metric_space \ real" assumes"C-lipschitz_on U f" "abs(a) \ D" shows"(D * C)-lipschitz_on U (\x. a * f x)" using lipschitz_on_cmult_upper[OF assms] by auto
lemma lipschitz_on_minus[lipschitz_intros]: fixes f::"'a::metric_space \'b::real_normed_vector" assumes"C-lipschitz_on U f" shows"C-lipschitz_on U (\x. - f x)" by (metis (mono_tags, lifting) assms dist_minus lipschitz_on_def)
lemma lipschitz_on_minus_iff[simp]: "L-lipschitz_on X (\x. - f x) \ L-lipschitz_on X f" "L-lipschitz_on X (- f) \ L-lipschitz_on X f" for f::"'a::metric_space \'b::real_normed_vector" using lipschitz_on_minus[of L X f] lipschitz_on_minus[of L X "-f"] by auto
lemma lipschitz_on_diff[lipschitz_intros]: fixes f::"'a::metric_space \'b::real_normed_vector" assumes"C-lipschitz_on U f""D-lipschitz_on U g" shows"(C + D)-lipschitz_on U (\x. f x - g x)" using lipschitz_on_add[OF assms(1) lipschitz_on_minus[OF assms(2)]] by auto
lemma lipschitz_on_closure [lipschitz_intros]: assumes"C-lipschitz_on U f""continuous_on (closure U) f" shows"C-lipschitz_on (closure U) f" proof (rule lipschitz_onI) show"C \ 0" using lipschitz_on_nonneg[OF assms(1)] by simp fix x y assume"x \ closure U" "y \ closure U" obtain u v::"nat \ 'a" where *: "\n. u n \ U" "u \ x" "\n. v n \ U" "v \ y" using\<open>x \<in> closure U\<close> \<open>y \<in> closure U\<close> unfolding closure_sequential by blast have a: "(\n. f (u n)) \ f x" using *(1) *(2) \<open>x \<in> closure U\<close> \<open>continuous_on (closure U) f\<close> unfolding comp_def continuous_on_closure_sequentially[of U f] by auto have b: "(\n. f (v n)) \ f y" using *(3) *(4) \<open>y \<in> closure U\<close> \<open>continuous_on (closure U) f\<close> unfolding comp_def continuous_on_closure_sequentially[of U f] by auto have l: "(\n. C * dist (u n) (v n) - dist (f (u n)) (f (v n))) \ C * dist x y - dist (f x) (f y)" by (intro tendsto_intros * a b) have"C * dist (u n) (v n) - dist (f (u n)) (f (v n)) \ 0" for n using lipschitz_onD(1)[OF assms(1) \<open>u n \<in> U\<close> \<open>v n \<in> U\<close>] by simp thenhave"C * dist x y - dist (f x) (f y) \ 0" using LIMSEQ_le_const[OF l, of 0] by auto thenshow"dist (f x) (f y) \ C * dist x y" by auto qed
lemma lipschitz_on_Pair[lipschitz_intros]: assumes f: "L-lipschitz_on A f" assumes g: "M-lipschitz_on A g" shows"(sqrt (L\<^sup>2 + M\<^sup>2))-lipschitz_on A (\a. (f a, g a))" proof (rule lipschitz_onI, goal_cases) case (1 x y) have"dist (f x, g x) (f y, g y) = sqrt ((dist (f x) (f y))\<^sup>2 + (dist (g x) (g y))\<^sup>2)" by (auto simp add: dist_Pair_Pair real_le_lsqrt) alsohave"\ \ sqrt ((L * dist x y)\<^sup>2 + (M * dist x y)\<^sup>2)" by (auto intro!: real_sqrt_le_mono add_mono power_mono 1 lipschitz_onD f g) alsohave"\ \ sqrt (L\<^sup>2 + M\<^sup>2) * dist x y" by (auto simp: power_mult_distrib ring_distribs[symmetric] real_sqrt_mult) finallyshow ?case . qed simp
lemma lipschitz_extend_closure: fixes f::"('a::metric_space) \ ('b::complete_space)" assumes"C-lipschitz_on U f" shows"\g. C-lipschitz_on (closure U) g \ (\x\U. g x = f x)" proof - obtain g where g: "\x. x \ U \ g x = f x" "uniformly_continuous_on (closure U) g" using uniformly_continuous_on_extension_on_closure[OF lipschitz_on_uniformly_continuous[OF assms]] by metis have"C-lipschitz_on (closure U) g" apply (rule lipschitz_on_closure, rule lipschitz_on_transform[OF assms]) using g uniformly_continuous_imp_continuous[OF g(2)] by auto thenshow ?thesis using g(1) by auto qed
lemma (in bounded_linear) lipschitz_boundE: obtains B where"B-lipschitz_on A f" proof - from nonneg_bounded obtain B where B: "B \ 0" "\x. norm (f x) \ B * norm x" by (auto simp: ac_simps) have"B-lipschitz_on A f" by (auto intro!: lipschitz_onI B simp: dist_norm diff[symmetric]) thus ?thesis .. qed
text\<open>Given a function defined on a real interval, it is Lipschitz-continuous if and only if
it is locally so, as proved in the following lemmas. It is useful especially for
piecewise-defined functions: if each piece is Lipschitz, then so is the whole function.
The same goes for functions defined on geodesic spaces, or more generally on geodesic subsets in a metric space (forinstance convex subsets in a real vector space), and this follows readily from the real case, but we will not prove it explicitly.
We give several variations around this statement. This is essentially a connectedness argument.\<close>
lemma locally_lipschitz_imp_lipschitz_aux: fixes f::"real \ ('a::metric_space)" assumes"a \ b" "continuous_on {a..b} f" "\x. x \ {a.. \y \ {x<..b}. dist (f y) (f x) \ M * (y-x)" shows"dist (f b) (f a) \ M * (b-a)" proof -
define A where"A = {x \ {a..b}. dist (f x) (f a) \ M * (x-a)}" have *: "A = (\x. M * (x-a) - dist (f x) (f a))-`{0..} \ {a..b}" unfolding A_def by auto have"a \ A" unfolding A_def using \a \ b\ by auto thenhave"A \ {}" by auto moreoverhave"bdd_above A"unfolding A_def by auto moreoverhave"closed A"unfolding * by (rule closed_vimage_Int, auto intro!: continuous_intros assms) ultimatelyhave"Sup A \ A" by (rule closed_contains_Sup) have"Sup A = b" proof (rule ccontr) assume"Sup A \ b"
define x where"x = Sup A" have I: "dist (f x) (f a) \ M * (x-a)" using \Sup A \ A\ x_def A_def by auto have"x \ {a..Sup A \ A\ \Sup A \ b\ A_def by auto thenobtain y where J: "y \ {x<..b}" "dist (f y) (f x) \ M * (y-x)" using assms(3) by blast have"dist (f y) (f a) \ dist (f y) (f x) + dist (f x) (f a)" by (rule dist_triangle) alsohave"... \ M * (y-x) + M * (x-a)" using I J(2) by auto finallyhave"dist (f y) (f a) \ M * (y-a)" by (auto simp add: algebra_simps) thenhave"y \ A" unfolding A_def using \y \ {x<..b}\ \x \ {a.. by auto thenhave"y \ Sup A" by (rule cSup_upper, auto simp: A_def) thenshow False using\<open>y \<in> {x<..b}\<close> x_def by auto qed thenshow ?thesis using\<open>Sup A \<in> A\<close> A_def by auto qed
lemma locally_lipschitz_imp_lipschitz: fixes f::"real \ ('a::metric_space)" assumes"continuous_on {a..b} f" "\x y. x \ {a.. y > x \ \z \ {x<..y}. dist (f z) (f x) \ M * (z-x)" "M \ 0" shows"lipschitz_on M {a..b} f" proof (rule lipschitz_onI[OF _ \<open>M \<ge> 0\<close>]) have *: "dist (f t) (f s) \ M * (t-s)" if "s \ t" "s \ {a..b}" "t \ {a..b}" for s t proof (rule locally_lipschitz_imp_lipschitz_aux, simp add: \<open>s \<le> t\<close>) show"continuous_on {s..t} f"using continuous_on_subset[OF assms(1)] that by auto fix x assume"x \ {s.. thenhave"x \ {a.. show"\z\{x<..t}. dist (f z) (f x) \ M * (z - x)" using assms(2)[OF \<open>x \<in> {a..<b}\<close>, of t] \<open>x \<in> {s..<t}\<close> by auto qed fix x y assume"x \ {a..b}" "y \ {a..b}"
consider "x \ y" | "y \ x" by linarith thenshow"dist (f x) (f y) \ M * dist x y" apply (cases) using *[OF _ \<open>x \<in> {a..b}\<close> \<open>y \<in> {a..b}\<close>] *[OF _ \<open>y \<in> {a..b}\<close> \<open>x \<in> {a..b}\<close>] by (auto simp add: dist_commute dist_real_def) qed
text\<open>We deduce that if a function is Lipschitz on finitely many closed sets on the real line, then
it is Lipschitz on any interval contained in their union. The difficulty in the proofistoshow
that any point \<open>z\<close> in this interval (except the maximum) has a point arbitrarily close to it on its
right which is contained in a common initial closed set. Otherwise, we show that there is a small
interval \<open>(z, T)\<close> which does not intersect any of the initial closed sets, a contradiction.\<close>
proposition lipschitz_on_closed_Union: assumes"\i. i \ I \ lipschitz_on M (U i) f" "\i. i \ I \ closed (U i)" "finite I" "M \ 0" "{u..(v::real)} \ (\i\I. U i)" shows"lipschitz_on M {u..v} f" proof (rule locally_lipschitz_imp_lipschitz[OF _ _ \<open>M \<ge> 0\<close>]) have *: "continuous_on (U i) f"if"i \ I" for i by (rule lipschitz_on_continuous_on[OF assms(1)[OF \<open>i\<in> I\<close>]]) have"continuous_on (\i\I. U i) f" apply (rule continuous_on_closed_Union) using\<open>finite I\<close> * assms(2) by auto thenshow"continuous_on {u..v} f" using\<open>{u..(v::real)} \<subseteq> (\<Union>i\<in>I. U i)\<close> continuous_on_subset by auto
fix z Z assume z: "z \ {u.. thenhave"u \ v" by auto
define T where"T = min Z v" thenhave T: "T > z""T \ v" "T \ u" "T \ Z" using z by auto
define A where"A = (\i\ I \ {i. U i \ {z<..T} \ {}}. U i \ {z..T})" have a: "closed A" unfolding A_def apply (rule closed_UN) using\<open>finite I\<close> \<open>\<And>i. i \<in> I \<Longrightarrow> closed (U i)\<close> by auto have b: "bdd_below A"unfolding A_def using\<open>finite I\<close> by auto have"\i \ I. T \ U i" using \{u..v} \ (\i\I. U i)\ T by auto thenhave c: "T \ A" unfolding A_def using T by (auto, fastforce) have"Inf A \ z" apply (rule cInf_greatest, auto) using c unfolding A_def by auto moreoverhave"Inf A \ z" proof (rule ccontr) assume"\(Inf A \ z)" thenobtain w where w: "w > z""w < Inf A"by (meson dense not_le_imp_less) have"Inf A \ T" using a b c by (simp add: cInf_lower) thenhave"w \ T" using w by auto thenhave"w \ {u..v}" using w \z \ {u.. T by auto thenobtain j where j: "j \ I" "w \ U j" using \{u..v} \ (\i\I. U i)\ by fastforce thenhave"w \ U j \ {z..T}" "U j \ {z<..T} \ {}" using j T w \w \ T\ by auto thenhave"w \ A" unfolding A_def using \j \ I\ by auto thenhave"Inf A \ w" using a b by (simp add: cInf_lower) thenshow False using w by auto qed ultimatelyhave"Inf A = z"by simp moreoverhave"Inf A \ A" apply (rule closed_contains_Inf) using a b c by auto ultimatelyhave"z \ A" by simp thenobtain i where i: "i \ I" "U i \ {z<..T} \ {}" "z \ U i" unfolding A_def by auto thenobtain t where"t \ U i \ {z<..T}" by blast thenhave"dist (f t) (f z) \ M * (t - z)" using lipschitz_onD(1)[OF assms(1)[of i], of t z] i dist_real_def by auto thenshow"\t\{z<..Z}. dist (f t) (f z) \ M * (t - z)" using \T \ Z\ \t \ U i \ {z<..T}\ by auto qed
subsection \<open>Local Lipschitz continuity (uniform for a family of functions)\<close>
definition\<^marker>\<open>tag important\<close> local_lipschitz:: "'a::metric_space set \ 'b::metric_space set \ ('a \ 'b \ 'c::metric_space) \ bool" where "local_lipschitz T X f \ \x \ X. \t \ T. \<exists>u>0. \<exists>L. \<forall>t \<in> cball t u \<inter> T. L-lipschitz_on (cball x u \<inter> X) (f t)"
lemma local_lipschitzI: assumes"\t x. t \ T \ x \ X \ \u>0. \L. \t \ cball t u \ T. L-lipschitz_on (cball x u \ X) (f t)" shows"local_lipschitz T X f" using assms unfolding local_lipschitz_def by auto
lemma local_lipschitzE: assumes local_lipschitz: "local_lipschitz T X f" assumes"t \ T" "x \ X" obtains u L where"u > 0""\s. s \ cball t u \ T \ L-lipschitz_on (cball x u \ X) (f s)" using assms local_lipschitz_def by metis
lemma local_lipschitz_continuous_on: assumes local_lipschitz: "local_lipschitz T X f" assumes"t \ T" shows"continuous_on X (f t)" unfolding continuous_on_def proof safe fix x assume"x \ X" from local_lipschitzE[OF local_lipschitz \<open>t \<in> T\<close> \<open>x \<in> X\<close>] obtain u L where"0 < u" and L: "\s. s \ cball t u \ T \ L-lipschitz_on (cball x u \ X) (f s)" by metis have"x \ ball x u" using \0 < u\ by simp from lipschitz_on_continuous_on[OF L] have tendsto: "(f t \ f t x) (at x within cball x u \ X)" using\<open>0 < u\<close> \<open>x \<in> X\<close> \<open>t \<in> T\<close> by (auto simp: continuous_on_def) moreoverhave"\\<^sub>F xa in at x. (xa \ cball x u \ X) = (xa \ X)" using eventually_at_ball[OF \<open>0 < u\<close>, of x UNIV] by eventually_elim auto ultimatelyshow"(f t \ f t x) (at x within X)" by (rule Lim_transform_within_set) qed
lemma
local_lipschitz_compose1: assumes ll: "local_lipschitz (g ` T) X (\t. f t)" assumes g: "continuous_on T g" shows"local_lipschitz T X (\t. f (g t))" proof (rule local_lipschitzI) fix t x assume"t \ T" "x \ X" thenhave"g t \ g ` T" by simp from local_lipschitzE[OF assms(1) this \<open>x \<in> X\<close>] obtain u L where"0 < u"and l: "(\s. s \ cball (g t) u \ g ` T \ L-lipschitz_on (cball x u \ X) (f s))" by auto from g[unfolded continuous_on_eq_continuous_within, rule_format, OF \<open>t \<in> T\<close>,
unfolded continuous_within_eps_delta, rule_format, OF \<open>0 < u\<close>] obtain d where d: "d>0""\x'. x'\T \ dist x' t < d \ dist (g x') (g t) < u" by (auto) show"\u>0. \L. \t\cball t u \ T. L-lipschitz_on (cball x u \ X) (f (g t))" using d \<open>0 < u\<close> by (fastforce intro: exI[where x="(min d u)/2"] exI[where x=L]
intro!: less_imp_le[OF d(2)] lipschitz_on_subset[OF l] simp: dist_commute) qed
context fixes T::"'a::metric_space set"and X f assumes local_lipschitz: "local_lipschitz T X f" begin
lemma continuous_on_TimesI: assumes y: "\x. x \ X \ continuous_on T (\t. f t x)" shows"continuous_on (T \ X) (\(t, x). f t x)" unfolding continuous_on_iff proof (safe, simp) fix a b and e::real assume H: "a \ T" "b \ X" "0 < e" hence"0 < e/2"by simp from y[unfolded continuous_on_iff, OF \<open>b \<in> X\<close>, rule_format, OF \<open>a \<in> T\<close> \<open>0 < e/2\<close>] obtain d where d: "d > 0""\t. t \ T \ dist t a < d \ dist (f t b) (f a b) < e/2" by auto
from\<open>a : T\<close> \<open>b \<in> X\<close> obtain u L where u: "0 < u" and L: "\t. t \ cball a u \ T \ L-lipschitz_on (cball b u \ X) (f t)" by (erule local_lipschitzE[OF local_lipschitz])
have"a \ cball a u \ T" by (auto simp: \0 < u\ \a \ T\ less_imp_le) from lipschitz_on_nonneg[OF L[OF \<open>a \<in> cball _ _ \<inter> _\<close>]] have "0 \<le> L" .
let ?d = "Min {d, u, (e/2/(L + 1))}" show"\d>0. \x\T. \y\X. dist (x, y) (a, b) < d \ dist (f x y) (f a b) < e" proof (rule exI[where x = ?d], safe) show"0 < ?d" using\<open>0 \<le> L\<close> \<open>0 < u\<close> \<open>0 < e\<close> \<open>0 < d\<close> by (auto intro!: divide_pos_pos ) fix x y assume"x \ T" "y \ X" assume dist_less: "dist (x, y) (a, b) < ?d" have"dist y b \ dist (x, y) (a, b)" using dist_snd_le[of "(x, y)""(a, b)"] by auto also note dist_less also
{ note calculation alsohave"?d \ u" by simp finallyhave"dist y b < u" .
} have"?d \ e/2/(L + 1)" by simp alsohave"(L + 1) * \ \ e / 2" using\<open>0 < e\<close> \<open>L \<ge> 0\<close> by (auto simp: field_split_simps) finallyhave le1: "(L + 1) * dist y b < e / 2"using\<open>L \<ge> 0\<close> by simp
have"dist x a \ dist (x, y) (a, b)" using dist_fst_le[of "(x, y)""(a, b)"] by auto alsonote dist_less finallyhave"dist x a < ?d" . alsohave"?d \ d" by simp finallyhave"dist x a < d" . note\<open>dist x a < ?d\<close> alsohave"?d \ u" by simp finallyhave"dist x a < u" . thenhave"x \ cball a u \ T" using\<open>x \<in> T\<close> by (auto simp: dist_commute) have"dist (f x y) (f a b) \ dist (f x y) (f x b) + dist (f x b) (f a b)" by (rule dist_triangle) alsohave"(L + 1)-lipschitz_on (cball b u \ X) (f x)" using L[OF \<open>x \<in> cball a u \<inter> T\<close>] by (rule lipschitz_on_le) simp thenhave"dist (f x y) (f x b) \ (L + 1) * dist y b" apply (rule lipschitz_onD)
subgoal using\<open>y \<in> X\<close> \<open>dist y b < u\<close> by (simp add: dist_commute)
subgoal using\<open>0 < u\<close> \<open>b \<in> X\<close> by simp done alsohave"(L + 1) * dist y b \ e / 2" using le1 \<open>0 \<le> L\<close> by simp alsohave"dist (f x b) (f a b) < e / 2" by (rule d; fact) alsohave"e / 2 + e / 2 = e"by simp finallyshow"dist (f x y) (f a b) < e"by simp qed qed
lemma local_lipschitz_compact_implies_lipschitz: assumes"compact X""compact T" assumes cont: "\x. x \ X \ continuous_on T (\t. f t x)" obtains L where"\t. t \ T \ L-lipschitz_on X (f t)" proof -
{ assume *: "\n::nat. \(\t\T. n-lipschitz_on X (f t))"
{ fix n::nat from *[of n] have"\x y t. t \ T \ x \ X \ y \ X \ dist (f t y) (f t x) > n * dist y x" by (force simp: lipschitz_on_def)
} thenobtain t and x y::"nat \ 'b" where xy: "\n. x n \ X" "\n. y n \ X" and t: "\n. t n \ T" and d: "\n. dist (f (t n) (y n)) (f (t n) (x n)) > n * dist (y n) (x n)" by metis from xy assms obtain lx rx where lx': "lx \ X" "strict_mono (rx :: nat \ nat)" "(x o rx) \ lx" by (metis compact_def) with xy have"\n. (y o rx) n \ X" by auto with assms obtain ly ry where ly': "ly \ X" "strict_mono (ry :: nat \ nat)" "((y o rx) o ry) \ ly" by (metis compact_def) with t have"\n. ((t o rx) o ry) n \ T" by simp with assms obtain lt rt where lt': "lt \ T" "strict_mono (rt :: nat \ nat)" "(((t o rx) o ry) o rt) \ lt" by (metis compact_def) from lx' ly' have lx: "(x o (rx o ry o rt)) \ lx" (is "?x \ _") and ly: "(y o (rx o ry o rt)) \ ly" (is "?y \ _") and lt: "(t o (rx o ry o rt)) \ lt" (is "?t \ _")
subgoal by (simp add: LIMSEQ_subseq_LIMSEQ o_assoc lt'(2))
subgoal by (simp add: LIMSEQ_subseq_LIMSEQ ly'(3) o_assoc lt'(2))
subgoal by (simp add: o_assoc lt'(3)) done hence"(\n. dist (?y n) (?x n)) \ dist ly lx" by (metis tendsto_dist) moreover let ?S = "(\(t, x). f t x) ` (T \ X)" have"eventually (\n::nat. n > 0) sequentially" by (metis eventually_at_top_dense) hence"eventually (\n. norm (dist (?y n) (?x n)) \ norm (\diameter ?S\ / n) * 1) sequentially" proof eventually_elim case (elim n) have"0 < rx (ry (rt n))"using\<open>0 < n\<close> by (metis dual_order.strict_trans1 lt'(2) lx'(2) ly'(2) seq_suble) have compact: "compact ?S" by (auto intro!: compact_continuous_image continuous_on_subset[OF continuous_on_TimesI]
compact_Times \<open>compact X\<close> \<open>compact T\<close> cont) have"norm (dist (?y n) (?x n)) = dist (?y n) (?x n)"by simp also from this elim d[of "rx (ry (rt n))"] have"\ < dist (f (?t n) (?y n)) (f (?t n) (?x n)) / rx (ry (rt (n)))" using lx'(2) ly'(2) lt'(2) \0 < rx _\ by (auto simp add: field_split_simps strict_mono_def) alsohave"\ \ diameter ?S / n" proof (rule frac_le) show"diameter ?S \ 0" using compact compact_imp_bounded diameter_ge_0 by blast show"dist (f (?t n) (?y n)) (f (?t n) (?x n)) \ diameter ((\(t,x). f t x) ` (T \ X))" by (metis (no_types) compact compact_imp_bounded diameter_bounded_bound image_eqI mem_Sigma_iff o_apply split_conv t xy(1) xy(2)) show"real n \ real (rx (ry (rt n)))" by (meson le_trans lt'(2) lx'(2) ly'(2) of_nat_mono strict_mono_imp_increasing) qed (use\<open>n > 0\<close> in auto) alsohave"\ \ abs (diameter ?S) / n" by (auto intro!: divide_right_mono) finallyshow ?caseby simp qed with _ have"(\n. dist (?y n) (?x n)) \ 0" by (rule tendsto_0_le)
(metis tendsto_divide_0[OF tendsto_const] filterlim_at_top_imp_at_infinity
filterlim_real_sequentially) ultimatelyhave"lx = ly" using LIMSEQ_unique by fastforce with assms lx' have "lx \ X" by auto from\<open>lt \<in> T\<close> this obtain u L where L: "u > 0" "\<And>t. t \<in> cball lt u \<inter> T \<Longrightarrow> L-lipschitz_on (cball lx u \<inter> X) (f t)" by (erule local_lipschitzE[OF local_lipschitz]) hence"L \ 0" by (force intro!: lipschitz_on_nonneg \lt \ T\)
from L lt ly lx \<open>lx = ly\<close> have "eventually (\n. ?t n \ ball lt u) sequentially" "eventually (\n. ?y n \ ball lx u) sequentially" "eventually (\n. ?x n \ ball lx u) sequentially" by (auto simp: dist_commute Lim) moreoverhave"eventually (\n. n > L) sequentially" by (metis filterlim_at_top_dense filterlim_real_sequentially) ultimately have"eventually (\_. False) sequentially" proof eventually_elim case (elim n) hence"dist (f (?t n) (?y n)) (f (?t n) (?x n)) \ L * dist (?y n) (?x n)" using assms xy t unfolding dist_norm[symmetric] by (intro lipschitz_onD[OF L(2)]) (auto) alsohave"\ \ n * dist (?y n) (?x n)" using elim by (intro mult_right_mono) auto alsohave"\ \ rx (ry (rt n)) * dist (?y n) (?x n)" by (intro mult_right_mono[OF _ zero_le_dist])
(meson lt'(2) lx'(2) ly'(2) of_nat_le_iff order_trans seq_suble) alsohave"\ < dist (f (?t n) (?y n)) (f (?t n) (?x n))" by (auto intro!: d) finallyshow ?caseby simp qed hence False by simp
} thenobtain L where"\t. t \ T \ L-lipschitz_on X (f t)" by metis thus ?thesis .. qed
lemma local_lipschitz_subset: assumes"S \ T" "Y \ X" shows"local_lipschitz S Y f" proof (rule local_lipschitzI) fix t x assume"t \ S" "x \ Y" thenhave"t \ T" "x \ X" using assms by auto from local_lipschitzE[OF local_lipschitz, OF this] obtain u L where u: "0 < u"and L: "\s. s \ cball t u \ T \ L-lipschitz_on (cball x u \ X) (f s)" by blast show"\u>0. \L. \t\cball t u \ S. L-lipschitz_on (cball x u \ Y) (f t)" using assms by (auto intro: exI[where x=u] exI[where x=L]
intro!: u lipschitz_on_subset[OF _ Int_mono[OF order_refl \<open>Y \<subseteq> X\<close>]] L) qed
end
lemma local_lipschitz_minus: fixes f::"'a::metric_space \ 'b::metric_space \ 'c::real_normed_vector" shows"local_lipschitz T X (\t x. - f t x) = local_lipschitz T X f" by (auto simp: local_lipschitz_def lipschitz_on_minus)
lemma local_lipschitz_PairI: assumes f: "local_lipschitz A B (\a b. f a b)" assumes g: "local_lipschitz A B (\a b. g a b)" shows"local_lipschitz A B (\a b. (f a b, g a b))" proof (rule local_lipschitzI) fix t x assume"t \ A" "x \ B" from local_lipschitzE[OF f this] local_lipschitzE[OF g this] obtain u L v M where"0 < u""(\s. s \ cball t u \ A \ L-lipschitz_on (cball x u \ B) (f s))" "0 < v""(\s. s \ cball t v \ A \ M-lipschitz_on (cball x v \ B) (g s))" by metis thenshow"\u>0. \L. \t\cball t u \ A. L-lipschitz_on (cball x u \ B) (\b. (f t b, g t b))" by (intro exI[where x="min u v"])
(force intro: lipschitz_on_subset intro!: lipschitz_on_Pair) qed
lemma local_lipschitz_constI: "local_lipschitz S T (\t x. f t)" by (auto simp: intro!: local_lipschitzI lipschitz_on_constant intro: exI[where x=1])
lemma (in bounded_linear) local_lipschitzI: shows"local_lipschitz A B (\_. f)" proof (rule local_lipschitzI, goal_cases) case (1 t x) from lipschitz_boundE[of "(cball x 1 \ B)"] obtain C where "C-lipschitz_on (cball x 1 \ B) f" by auto thenshow ?case by (auto intro: exI[where x=1]) qed
proposition c1_implies_local_lipschitz: fixes T::"real set"and X::"'a::{banach,heine_borel} set" and f::"real \ 'a \ 'a" assumes f': "\t x. t \ T \ x \ X \ (f t has_derivative blinfun_apply (f' (t, x))) (at x)" assumes cont_f': "continuous_on (T \ X) f'" assumes"open T" assumes"open X" shows"local_lipschitz T X f" proof (rule local_lipschitzI) fix t x assume"t \ T" "x \ X" from open_contains_cball[THEN iffD1, OF \<open>open X\<close>, rule_format, OF \<open>x \<in> X\<close>] obtain u where u: "u > 0""cball x u \ X" by auto moreover from open_contains_cball[THEN iffD1, OF \<open>open T\<close>, rule_format, OF \<open>t \<in> T\<close>] obtain v where v: "v > 0""cball t v \ T" by auto ultimately have"compact (cball t v \ cball x u)" "cball t v \ cball x u \ T \ X" by (auto intro!: compact_Times) thenhave"compact (f' ` (cball t v \ cball x u))" by (auto intro!: compact_continuous_image continuous_on_subset[OF cont_f']) thenobtain B where B: "B > 0""\s y. s \ cball t v \ y \ cball x u \ norm (f' (s, y)) \ B" by (auto dest!: compact_imp_bounded simp: bounded_pos)
have lipschitz: "B-lipschitz_on (cball x (min u v) \ X) (f s)" if s: "s \ cball t v" for s proof - note s alsonote\<open>cball t v \<subseteq> T\<close> finally have deriv: "\y. y \ cball x u \ (f s has_derivative blinfun_apply (f' (s, y))) (at y within cball x u)" using\<open>_ \<subseteq> X\<close> by (auto intro!: has_derivative_at_withinI[OF f']) have"norm (f s y - f s z) \ B * norm (y - z)" if"y \ cball x u" "z \ cball x u" for y z using s that by (intro differentiable_bound[OF convex_cball deriv])
(auto intro!: B simp: norm_blinfun.rep_eq[symmetric]) thenshow ?thesis using\<open>0 < B\<close> by (auto intro!: lipschitz_onI simp: dist_norm) qed show"\u>0. \L. \t\cball t u \ T. L-lipschitz_on (cball x u \ X) (f t)" by (force intro: exI[where x="min u v"] exI[where x=B] intro!: lipschitz simp: u v) qed
end
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.18Bemerkung:
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.