analysis.calculus.bump_function_inner
⟷
Mathlib.Analysis.SpecialFunctions.SmoothTransition
The following section lists changes to this file in mathlib3 and mathlib4 that occured after the initial port. Most recent changes are shown first. Hovering over a commit will show all commits associated with the same mathlib3 commit.
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(last sync)
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -4,8 +4,8 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Sébastien Gouëzel, Floris van Doorn
-/
import Analysis.Calculus.Deriv.Inv
-import Analysis.Calculus.ExtendDeriv
-import Analysis.Calculus.IteratedDeriv
+import Analysis.Calculus.FDeriv.Extend
+import Analysis.Calculus.IteratedDeriv.Defs
import Analysis.InnerProductSpace.Calculus
import Analysis.SpecialFunctions.ExpDeriv
import MeasureTheory.Integral.SetIntegral
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -142,7 +142,7 @@ theorem fAux_deriv_zero (n : ℕ) : HasDerivAt (fAux n) 0 0 :=
by
apply (hasDerivAt_const (0 : ℝ) (0 : ℝ)).HasDerivWithinAt.congr
· intro y hy
- simp at hy
+ simp at hy
simp [f_aux, hy]
· simp [f_aux, le_refl]
have B : HasDerivWithinAt (f_aux n) (0 : ℝ) (Ici 0) 0 :=
@@ -444,13 +444,13 @@ instance (priority := 100) hasContDiffBump_of_innerProductSpace (E : Type _) [No
support := fun R hR => by
apply subset.antisymm
· intro x hx
- simp only [mem_support] at hx
+ simp only [mem_support] at hx
contrapose! hx
- simp only [mem_ball_zero_iff, not_lt] at hx
+ simp only [mem_ball_zero_iff, not_lt] at hx
apply Real.smoothTransition.zero_of_nonpos
apply div_nonpos_of_nonpos_of_nonneg <;> linarith
· intro x hx
- simp only [mem_ball_zero_iff] at hx
+ simp only [mem_ball_zero_iff] at hx
apply (Real.smoothTransition.pos_of_pos _).ne'
apply div_pos <;> linarith }
⟨⟨e⟩⟩
@@ -544,7 +544,7 @@ theorem pos_of_mem_ball (hx : x ∈ ball c f.rOut) : 0 < f x :=
refine' lt_iff_le_and_ne.2 ⟨f.nonneg, Ne.symm _⟩
change f.r⁻¹ • (x - c) ∈ support ((someContDiffBumpBase E).toFun (f.R / f.r))
rw [ContDiffBumpBase.support _ _ f.one_lt_R_div_r]
- simp only [dist_eq_norm, mem_ball] at hx
+ simp only [dist_eq_norm, mem_ball] at hx
simpa only [norm_smul, mem_ball_zero_iff, norm_eq_abs, abs_inv, abs_of_nonneg f.r_pos.le, ←
div_eq_inv_mul] using (div_lt_div_right f.r_pos).2 hx
#align cont_diff_bump.pos_of_mem_ball ContDiffBump.pos_of_mem_ball
@@ -553,7 +553,7 @@ theorem pos_of_mem_ball (hx : x ∈ ball c f.rOut) : 0 < f x :=
#print ContDiffBump.zero_of_le_dist /-
theorem zero_of_le_dist (hx : f.rOut ≤ dist x c) : f x = 0 :=
by
- rw [dist_eq_norm] at hx
+ rw [dist_eq_norm] at hx
suffices H : f.r⁻¹ • (x - c) ∉ support ((someContDiffBumpBase E).toFun (f.R / f.r))
· simpa only [mem_support, Classical.not_not] using H
rw [ContDiffBumpBase.support _ _ f.one_lt_R_div_r]
@@ -766,7 +766,7 @@ theorem tendsto_support_normed_smallSets {ι} {φ : ι → ContDiffBump c} {l :
Tendsto (fun i => support fun x => (φ i).normed μ x) l (𝓝 c).smallSets :=
by
simp_rw [NormedAddCommGroup.tendsto_nhds_zero, Real.norm_eq_abs,
- abs_eq_self.mpr (φ _).rOut_pos.le] at hφ
+ abs_eq_self.mpr (φ _).rOut_pos.le] at hφ
rw [tendsto_small_sets_iff]
intro t ht
rcases metric.mem_nhds_iff.mp ht with ⟨ε, hε, ht⟩
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -124,7 +124,7 @@ theorem f_aux_limit (n : ℕ) :
by
have A : tendsto (fun x => (P_aux n).eval x) (𝓝[>] 0) (𝓝 ((P_aux n).eval 0)) :=
(P_aux n).ContinuousWithinAt
- have B : tendsto (fun x => exp (-x⁻¹) / x ^ (2 * n)) (𝓝[>] 0) (𝓝 0) :=
+ have B : tendsto (fun x => NormedSpace.exp (-x⁻¹) / x ^ (2 * n)) (𝓝[>] 0) (𝓝 0) :=
by
convert (tendsto_pow_mul_exp_neg_at_top_nhds_0 (2 * n)).comp tendsto_inv_zero_atTop
ext x
@@ -180,8 +180,8 @@ theorem fAux_hasDerivAt (n : ℕ) (x : ℝ) : HasDerivAt (fAux n) (fAux (n + 1)
· have : f_aux (n + 1) 0 = 0 := by simp [f_aux, le_refl]
rw [hx, this]
exact f_aux_deriv_zero n
- · have : f_aux (n + 1) x = (P_aux (n + 1)).eval x * exp (-x⁻¹) / x ^ (2 * (n + 1)) := by
- simp [f_aux, not_le_of_gt hx]
+ · have : f_aux (n + 1) x = (P_aux (n + 1)).eval x * NormedSpace.exp (-x⁻¹) / x ^ (2 * (n + 1)) :=
+ by simp [f_aux, not_le_of_gt hx]
rw [this]
exact f_aux_deriv_pos n x hx
#align exp_neg_inv_glue.f_aux_has_deriv_at expNegInvGlue.fAux_hasDerivAt
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -3,12 +3,12 @@ Copyright (c) 2020 Sébastien Gouëzel. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Sébastien Gouëzel, Floris van Doorn
-/
-import Mathbin.Analysis.Calculus.Deriv.Inv
-import Mathbin.Analysis.Calculus.ExtendDeriv
-import Mathbin.Analysis.Calculus.IteratedDeriv
-import Mathbin.Analysis.InnerProductSpace.Calculus
-import Mathbin.Analysis.SpecialFunctions.ExpDeriv
-import Mathbin.MeasureTheory.Integral.SetIntegral
+import Analysis.Calculus.Deriv.Inv
+import Analysis.Calculus.ExtendDeriv
+import Analysis.Calculus.IteratedDeriv
+import Analysis.InnerProductSpace.Calculus
+import Analysis.SpecialFunctions.ExpDeriv
+import MeasureTheory.Integral.SetIntegral
#align_import analysis.calculus.bump_function_inner from "leanprover-community/mathlib"@"7e5137f579de09a059a5ce98f364a04e221aabf0"
mathlib commit https://github.com/leanprover-community/mathlib/commit/8ea5598db6caeddde6cb734aa179cc2408dbd345
@@ -2,11 +2,6 @@
Copyright (c) 2020 Sébastien Gouëzel. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Sébastien Gouëzel, Floris van Doorn
-
-! This file was ported from Lean 3 source module analysis.calculus.bump_function_inner
-! leanprover-community/mathlib commit 7e5137f579de09a059a5ce98f364a04e221aabf0
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathbin.Analysis.Calculus.Deriv.Inv
import Mathbin.Analysis.Calculus.ExtendDeriv
@@ -15,6 +10,8 @@ import Mathbin.Analysis.InnerProductSpace.Calculus
import Mathbin.Analysis.SpecialFunctions.ExpDeriv
import Mathbin.MeasureTheory.Integral.SetIntegral
+#align_import analysis.calculus.bump_function_inner from "leanprover-community/mathlib"@"7e5137f579de09a059a5ce98f364a04e221aabf0"
+
/-!
# Infinitely smooth bump function
mathlib commit https://github.com/leanprover-community/mathlib/commit/9fb8964792b4237dac6200193a0d533f1b3f7423
@@ -211,15 +211,20 @@ protected theorem contDiff {n} : ContDiff ℝ n expNegInvGlue :=
#align exp_neg_inv_glue.cont_diff expNegInvGlue.contDiff
-/
+#print expNegInvGlue.zero_of_nonpos /-
/-- The function `exp_neg_inv_glue` vanishes on `(-∞, 0]`. -/
theorem zero_of_nonpos {x : ℝ} (hx : x ≤ 0) : expNegInvGlue x = 0 := by simp [expNegInvGlue, hx]
#align exp_neg_inv_glue.zero_of_nonpos expNegInvGlue.zero_of_nonpos
+-/
+#print expNegInvGlue.pos_of_pos /-
/-- The function `exp_neg_inv_glue` is positive on `(0, +∞)`. -/
theorem pos_of_pos {x : ℝ} (hx : 0 < x) : 0 < expNegInvGlue x := by
simp [expNegInvGlue, not_le.2 hx, exp_pos]
#align exp_neg_inv_glue.pos_of_pos expNegInvGlue.pos_of_pos
+-/
+#print expNegInvGlue.nonneg /-
/-- The function exp_neg_inv_glue` is nonnegative. -/
theorem nonneg (x : ℝ) : 0 ≤ expNegInvGlue x :=
by
@@ -227,6 +232,7 @@ theorem nonneg (x : ℝ) : 0 ≤ expNegInvGlue x :=
· exact ge_of_eq (zero_of_nonpos h)
· exact le_of_lt (pos_of_pos h)
#align exp_neg_inv_glue.nonneg expNegInvGlue.nonneg
+-/
end expNegInvGlue
@@ -246,18 +252,24 @@ variable {x : ℝ}
open expNegInvGlue
+#print Real.smoothTransition.pos_denom /-
theorem pos_denom (x) : 0 < expNegInvGlue x + expNegInvGlue (1 - x) :=
(zero_lt_one.lt_or_lt x).elim (fun hx => add_pos_of_pos_of_nonneg (pos_of_pos hx) (nonneg _))
fun hx => add_pos_of_nonneg_of_pos (nonneg _) (pos_of_pos <| sub_pos.2 hx)
#align real.smooth_transition.pos_denom Real.smoothTransition.pos_denom
+-/
+#print Real.smoothTransition.one_of_one_le /-
theorem one_of_one_le (h : 1 ≤ x) : smoothTransition x = 1 :=
(div_eq_one_iff_eq <| (pos_denom x).ne').2 <| by rw [zero_of_nonpos (sub_nonpos.2 h), add_zero]
#align real.smooth_transition.one_of_one_le Real.smoothTransition.one_of_one_le
+-/
+#print Real.smoothTransition.zero_of_nonpos /-
theorem zero_of_nonpos (h : x ≤ 0) : smoothTransition x = 0 := by
rw [smooth_transition, zero_of_nonpos h, zero_div]
#align real.smooth_transition.zero_of_nonpos Real.smoothTransition.zero_of_nonpos
+-/
#print Real.smoothTransition.zero /-
@[simp]
@@ -287,21 +299,29 @@ protected theorem projIcc :
#align real.smooth_transition.proj_Icc Real.smoothTransition.projIcc
-/
+#print Real.smoothTransition.le_one /-
theorem le_one (x : ℝ) : smoothTransition x ≤ 1 :=
(div_le_one (pos_denom x)).2 <| le_add_of_nonneg_right (nonneg _)
#align real.smooth_transition.le_one Real.smoothTransition.le_one
+-/
+#print Real.smoothTransition.nonneg /-
theorem nonneg (x : ℝ) : 0 ≤ smoothTransition x :=
div_nonneg (expNegInvGlue.nonneg _) (pos_denom x).le
#align real.smooth_transition.nonneg Real.smoothTransition.nonneg
+-/
+#print Real.smoothTransition.lt_one_of_lt_one /-
theorem lt_one_of_lt_one (h : x < 1) : smoothTransition x < 1 :=
(div_lt_one <| pos_denom x).2 <| lt_add_of_pos_right _ <| pos_of_pos <| sub_pos.2 h
#align real.smooth_transition.lt_one_of_lt_one Real.smoothTransition.lt_one_of_lt_one
+-/
+#print Real.smoothTransition.pos_of_pos /-
theorem pos_of_pos (h : 0 < x) : 0 < smoothTransition x :=
div_pos (expNegInvGlue.pos_of_pos h) (pos_denom x)
#align real.smooth_transition.pos_of_pos Real.smoothTransition.pos_of_pos
+-/
#print Real.smoothTransition.contDiff /-
protected theorem contDiff {n} : ContDiff ℝ n smoothTransition :=
@@ -442,15 +462,19 @@ instance (priority := 100) hasContDiffBump_of_innerProductSpace (E : Type _) [No
namespace ContDiffBump
+#print ContDiffBump.rOut_pos /-
theorem rOut_pos {c : E} (f : ContDiffBump c) : 0 < f.rOut :=
f.rIn_pos.trans f.rIn_lt_rOut
#align cont_diff_bump.R_pos ContDiffBump.rOut_pos
+-/
+#print ContDiffBump.one_lt_rOut_div_rIn /-
theorem one_lt_rOut_div_rIn {c : E} (f : ContDiffBump c) : 1 < f.rOut / f.R :=
by
rw [one_lt_div f.r_pos]
exact f.r_lt_R
#align cont_diff_bump.one_lt_R_div_r ContDiffBump.one_lt_rOut_div_rIn
+-/
instance (c : E) : Inhabited (ContDiffBump c) :=
⟨⟨1, 2, zero_lt_one, one_lt_two⟩⟩
@@ -469,40 +493,55 @@ def toFun {c : E} (f : ContDiffBump c) : E → ℝ := fun x =>
instance : CoeFun (ContDiffBump c) fun _ => E → ℝ :=
⟨toFun⟩
+#print ContDiffBump.apply /-
protected theorem apply (x : E) :
f x = (someContDiffBumpBase E).toFun (f.rOut / f.R) (f.R⁻¹ • (x - c)) :=
rfl
#align cont_diff_bump.def ContDiffBump.apply
+-/
+#print ContDiffBump.sub /-
protected theorem sub (x : E) : f (c - x) = f (c + x) := by simp [f.def, ContDiffBumpBase.symmetric]
#align cont_diff_bump.sub ContDiffBump.sub
+-/
+#print ContDiffBump.neg /-
protected theorem neg (f : ContDiffBump (0 : E)) (x : E) : f (-x) = f x := by
simp_rw [← zero_sub, f.sub, zero_add]
#align cont_diff_bump.neg ContDiffBump.neg
+-/
open Metric
+#print ContDiffBump.one_of_mem_closedBall /-
theorem one_of_mem_closedBall (hx : x ∈ closedBall c f.R) : f x = 1 :=
by
apply ContDiffBumpBase.eq_one _ _ f.one_lt_R_div_r
simpa only [norm_smul, norm_eq_abs, abs_inv, abs_of_nonneg f.r_pos.le, ← div_eq_inv_mul,
div_le_one f.r_pos] using mem_closedBall_iff_norm.1 hx
#align cont_diff_bump.one_of_mem_closed_ball ContDiffBump.one_of_mem_closedBall
+-/
+#print ContDiffBump.nonneg /-
theorem nonneg : 0 ≤ f x :=
(ContDiffBumpBase.mem_Icc (someContDiffBumpBase E) _ _).1
#align cont_diff_bump.nonneg ContDiffBump.nonneg
+-/
+#print ContDiffBump.nonneg' /-
/-- A version of `cont_diff_bump.nonneg` with `x` explicit -/
theorem nonneg' (x : E) : 0 ≤ f x :=
f.NonNeg
#align cont_diff_bump.nonneg' ContDiffBump.nonneg'
+-/
+#print ContDiffBump.le_one /-
theorem le_one : f x ≤ 1 :=
(ContDiffBumpBase.mem_Icc (someContDiffBumpBase E) _ _).2
#align cont_diff_bump.le_one ContDiffBump.le_one
+-/
+#print ContDiffBump.pos_of_mem_ball /-
theorem pos_of_mem_ball (hx : x ∈ ball c f.rOut) : 0 < f x :=
by
refine' lt_iff_le_and_ne.2 ⟨f.nonneg, Ne.symm _⟩
@@ -512,7 +551,9 @@ theorem pos_of_mem_ball (hx : x ∈ ball c f.rOut) : 0 < f x :=
simpa only [norm_smul, mem_ball_zero_iff, norm_eq_abs, abs_inv, abs_of_nonneg f.r_pos.le, ←
div_eq_inv_mul] using (div_lt_div_right f.r_pos).2 hx
#align cont_diff_bump.pos_of_mem_ball ContDiffBump.pos_of_mem_ball
+-/
+#print ContDiffBump.zero_of_le_dist /-
theorem zero_of_le_dist (hx : f.rOut ≤ dist x c) : f x = 0 :=
by
rw [dist_eq_norm] at hx
@@ -522,7 +563,9 @@ theorem zero_of_le_dist (hx : f.rOut ≤ dist x c) : f x = 0 :=
simp [norm_smul, norm_eq_abs, abs_inv, abs_of_nonneg f.r_pos.le, ← div_eq_inv_mul]
exact div_le_div_of_le f.r_pos.le hx
#align cont_diff_bump.zero_of_le_dist ContDiffBump.zero_of_le_dist
+-/
+#print ContDiffBump.support_eq /-
theorem support_eq : support (f : E → ℝ) = Metric.ball c f.rOut :=
by
ext x
@@ -531,26 +574,36 @@ theorem support_eq : support (f : E → ℝ) = Metric.ball c f.rOut :=
· simp only [hx, (f.pos_of_mem_ball hx).ne', Ne.def, not_false_iff]
· simp only [hx.not_lt, f.zero_of_le_dist hx, Ne.def, eq_self_iff_true, not_true]
#align cont_diff_bump.support_eq ContDiffBump.support_eq
+-/
+#print ContDiffBump.tsupport_eq /-
theorem tsupport_eq : tsupport f = closedBall c f.rOut := by
simp_rw [tsupport, f.support_eq, closure_ball _ f.R_pos.ne']
#align cont_diff_bump.tsupport_eq ContDiffBump.tsupport_eq
+-/
+#print ContDiffBump.hasCompactSupport /-
protected theorem hasCompactSupport [FiniteDimensional ℝ E] : HasCompactSupport f := by
simp_rw [HasCompactSupport, f.tsupport_eq, is_compact_closed_ball]
#align cont_diff_bump.has_compact_support ContDiffBump.hasCompactSupport
+-/
+#print ContDiffBump.eventuallyEq_one_of_mem_ball /-
theorem eventuallyEq_one_of_mem_ball (h : x ∈ ball c f.R) : f =ᶠ[𝓝 x] 1 :=
((isOpen_lt (continuous_id.dist continuous_const) continuous_const).eventually_mem h).mono
fun z hz => f.one_of_mem_closedBall (le_of_lt hz)
#align cont_diff_bump.eventually_eq_one_of_mem_ball ContDiffBump.eventuallyEq_one_of_mem_ball
+-/
+#print ContDiffBump.eventuallyEq_one /-
theorem eventuallyEq_one : f =ᶠ[𝓝 c] 1 :=
f.eventuallyEq_one_of_mem_ball (mem_ball_self f.rIn_pos)
#align cont_diff_bump.eventually_eq_one ContDiffBump.eventuallyEq_one
+-/
/- ./././Mathport/Syntax/Translate/Expr.lean:177:8: unsupported: ambiguous notation -/
/- ./././Mathport/Syntax/Translate/Expr.lean:177:8: unsupported: ambiguous notation -/
+#print ContDiffAt.contDiffBump /-
/-- `cont_diff_bump` is `𝒞ⁿ` in all its arguments. -/
protected theorem ContDiffAt.contDiffBump {c g : X → E} {f : ∀ x, ContDiffBump (c x)} {x : X}
(hc : ContDiffAt ℝ n c x) (hr : ContDiffAt ℝ n (fun x => (f x).R) x)
@@ -578,12 +631,15 @@ protected theorem ContDiffAt.contDiffBump {c g : X → E} {f : ∀ x, ContDiffBu
((((someContDiffBumpBase E).smooth.ContDiffWithinAt A).ContDiffAt B).of_le le_top).comp x _
exact (hR.div hr (f x).rIn_pos.ne').Prod ((hr.inv (f x).rIn_pos.ne').smul (hg.sub hc))
#align cont_diff_at.cont_diff_bump ContDiffAt.contDiffBump
+-/
+#print ContDiff.contDiffBump /-
theorem ContDiff.contDiffBump {c g : X → E} {f : ∀ x, ContDiffBump (c x)} (hc : ContDiff ℝ n c)
(hr : ContDiff ℝ n fun x => (f x).R) (hR : ContDiff ℝ n fun x => (f x).rOut)
(hg : ContDiff ℝ n g) : ContDiff ℝ n fun x => f x (g x) := by rw [contDiff_iff_contDiffAt] at *;
exact fun x => (hc x).ContDiffBump (hr x) (hR x) (hg x)
#align cont_diff.cont_diff_bump ContDiff.contDiffBump
+-/
#print ContDiffBump.contDiff /-
protected theorem contDiff : ContDiff ℝ n f :=
@@ -619,13 +675,17 @@ protected def normed (μ : Measure E) : E → ℝ := fun x => f x / ∫ x, f x
#align cont_diff_bump.normed ContDiffBump.normed
-/
+#print ContDiffBump.normed_def /-
theorem normed_def {μ : Measure E} (x : E) : f.normed μ x = f x / ∫ x, f x ∂μ :=
rfl
#align cont_diff_bump.normed_def ContDiffBump.normed_def
+-/
+#print ContDiffBump.nonneg_normed /-
theorem nonneg_normed (x : E) : 0 ≤ f.normed μ x :=
div_nonneg f.NonNeg <| integral_nonneg f.nonneg'
#align cont_diff_bump.nonneg_normed ContDiffBump.nonneg_normed
+-/
#print ContDiffBump.contDiff_normed /-
theorem contDiff_normed {n : ℕ∞} : ContDiff ℝ n (f.normed μ) :=
@@ -639,13 +699,17 @@ theorem continuous_normed : Continuous (f.normed μ) :=
#align cont_diff_bump.continuous_normed ContDiffBump.continuous_normed
-/
+#print ContDiffBump.normed_sub /-
theorem normed_sub (x : E) : f.normed μ (c - x) = f.normed μ (c + x) := by
simp_rw [f.normed_def, f.sub]
#align cont_diff_bump.normed_sub ContDiffBump.normed_sub
+-/
+#print ContDiffBump.normed_neg /-
theorem normed_neg (f : ContDiffBump (0 : E)) (x : E) : f.normed μ (-x) = f.normed μ x := by
simp_rw [f.normed_def, f.neg]
#align cont_diff_bump.normed_neg ContDiffBump.normed_neg
+-/
variable [BorelSpace E] [FiniteDimensional ℝ E] [IsLocallyFiniteMeasure μ]
@@ -663,32 +727,43 @@ protected theorem integrable_normed : Integrable (f.normed μ) μ :=
variable [μ.IsOpenPosMeasure]
+#print ContDiffBump.integral_pos /-
theorem integral_pos : 0 < ∫ x, f x ∂μ :=
by
refine' (integral_pos_iff_support_of_nonneg f.nonneg' f.integrable).mpr _
rw [f.support_eq]
refine' is_open_ball.measure_pos _ (nonempty_ball.mpr f.R_pos)
#align cont_diff_bump.integral_pos ContDiffBump.integral_pos
+-/
+#print ContDiffBump.integral_normed /-
theorem integral_normed : ∫ x, f.normed μ x ∂μ = 1 :=
by
simp_rw [ContDiffBump.normed, div_eq_mul_inv, mul_comm (f _), ← smul_eq_mul, integral_smul]
exact inv_mul_cancel f.integral_pos.ne'
#align cont_diff_bump.integral_normed ContDiffBump.integral_normed
+-/
+#print ContDiffBump.support_normed_eq /-
theorem support_normed_eq : support (f.normed μ) = Metric.ball c f.rOut := by
simp_rw [ContDiffBump.normed, support_div, f.support_eq, support_const f.integral_pos.ne',
inter_univ]
#align cont_diff_bump.support_normed_eq ContDiffBump.support_normed_eq
+-/
+#print ContDiffBump.tsupport_normed_eq /-
theorem tsupport_normed_eq : tsupport (f.normed μ) = Metric.closedBall c f.rOut := by
simp_rw [tsupport, f.support_normed_eq, closure_ball _ f.R_pos.ne']
#align cont_diff_bump.tsupport_normed_eq ContDiffBump.tsupport_normed_eq
+-/
+#print ContDiffBump.hasCompactSupport_normed /-
theorem hasCompactSupport_normed : HasCompactSupport (f.normed μ) := by
simp_rw [HasCompactSupport, f.tsupport_normed_eq, is_compact_closed_ball]
#align cont_diff_bump.has_compact_support_normed ContDiffBump.hasCompactSupport_normed
+-/
+#print ContDiffBump.tendsto_support_normed_smallSets /-
theorem tendsto_support_normed_smallSets {ι} {φ : ι → ContDiffBump c} {l : Filter ι}
(hφ : Tendsto (fun i => (φ i).rOut) l (𝓝 0)) :
Tendsto (fun i => support fun x => (φ i).normed μ x) l (𝓝 c).smallSets :=
@@ -702,6 +777,7 @@ theorem tendsto_support_normed_smallSets {ι} {φ : ι → ContDiffBump c} {l :
simp_rw [(φ i).support_normed_eq]
exact ball_subset_ball hi.le
#align cont_diff_bump.tendsto_support_normed_small_sets ContDiffBump.tendsto_support_normed_smallSets
+-/
variable (μ)
mathlib commit https://github.com/leanprover-community/mathlib/commit/a3e83f0fa4391c8740f7d773a7a9b74e311ae2a3
@@ -670,7 +670,7 @@ theorem integral_pos : 0 < ∫ x, f x ∂μ :=
refine' is_open_ball.measure_pos _ (nonempty_ball.mpr f.R_pos)
#align cont_diff_bump.integral_pos ContDiffBump.integral_pos
-theorem integral_normed : (∫ x, f.normed μ x ∂μ) = 1 :=
+theorem integral_normed : ∫ x, f.normed μ x ∂μ = 1 :=
by
simp_rw [ContDiffBump.normed, div_eq_mul_inv, mul_comm (f _), ← smul_eq_mul, integral_smul]
exact inv_mul_cancel f.integral_pos.ne'
@@ -706,7 +706,7 @@ theorem tendsto_support_normed_smallSets {ι} {φ : ι → ContDiffBump c} {l :
variable (μ)
#print ContDiffBump.integral_normed_smul /-
-theorem integral_normed_smul [CompleteSpace X] (z : X) : (∫ x, f.normed μ x • z ∂μ) = z := by
+theorem integral_normed_smul [CompleteSpace X] (z : X) : ∫ x, f.normed μ x • z ∂μ = z := by
simp_rw [integral_smul_const, f.integral_normed, one_smul]
#align cont_diff_bump.integral_normed_smul ContDiffBump.integral_normed_smul
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/7e5137f579de09a059a5ce98f364a04e221aabf0
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Sébastien Gouëzel, Floris van Doorn
! This file was ported from Lean 3 source module analysis.calculus.bump_function_inner
-! leanprover-community/mathlib commit 3bce8d800a6f2b8f63fe1e588fd76a9ff4adcebe
+! leanprover-community/mathlib commit 7e5137f579de09a059a5ce98f364a04e221aabf0
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -18,6 +18,9 @@ import Mathbin.MeasureTheory.Integral.SetIntegral
/-!
# Infinitely smooth bump function
+> THIS FILE IS SYNCHRONIZED WITH MATHLIB4.
+> Any changes to this file require a corresponding PR to mathlib4.
+
In this file we construct several infinitely smooth functions with properties that an analytic
function cannot have:
mathlib commit https://github.com/leanprover-community/mathlib/commit/58a272265b5e05f258161260dd2c5d247213cbd3
@@ -51,6 +51,7 @@ open Polynomial Real Filter Set Function
open scoped Polynomial
+#print expNegInvGlue /-
/-- `exp_neg_inv_glue` is the real function given by `x ↦ exp (-1/x)` for `x > 0` and `0`
for `x ≤ 0`. It is a basic building block to construct smooth partitions of unity. Its main property
is that it vanishes for `x ≤ 0`, it is positive for `x > 0`, and the junction between the two
@@ -59,6 +60,7 @@ behaviors is flat enough to retain smoothness. The fact that this function is `C
def expNegInvGlue (x : ℝ) : ℝ :=
if x ≤ 0 then 0 else exp (-x⁻¹)
#align exp_neg_inv_glue expNegInvGlue
+-/
namespace expNegInvGlue
@@ -195,6 +197,7 @@ theorem fAux_iteratedDeriv (n : ℕ) : iteratedDeriv n (fAux 0) = fAux n :=
exact (f_aux_has_deriv_at n x).deriv
#align exp_neg_inv_glue.f_aux_iterated_deriv expNegInvGlue.fAux_iteratedDeriv
+#print expNegInvGlue.contDiff /-
/-- The function `exp_neg_inv_glue` is smooth. -/
protected theorem contDiff {n} : ContDiff ℝ n expNegInvGlue :=
by
@@ -203,6 +206,7 @@ protected theorem contDiff {n} : ContDiff ℝ n expNegInvGlue :=
rw [f_aux_iterated_deriv m]
exact fun x => (f_aux_has_deriv_at m x).DifferentiableAt
#align exp_neg_inv_glue.cont_diff expNegInvGlue.contDiff
+-/
/-- The function `exp_neg_inv_glue` vanishes on `(-∞, 0]`. -/
theorem zero_of_nonpos {x : ℝ} (hx : x ≤ 0) : expNegInvGlue x = 0 := by simp [expNegInvGlue, hx]
@@ -223,11 +227,13 @@ theorem nonneg (x : ℝ) : 0 ≤ expNegInvGlue x :=
end expNegInvGlue
+#print Real.smoothTransition /-
/-- An infinitely smooth function `f : ℝ → ℝ` such that `f x = 0` for `x ≤ 0`,
`f x = 1` for `1 ≤ x`, and `0 < f x < 1` for `0 < x < 1`. -/
def Real.smoothTransition (x : ℝ) : ℝ :=
expNegInvGlue x / (expNegInvGlue x + expNegInvGlue (1 - x))
#align real.smooth_transition Real.smoothTransition
+-/
namespace Real
@@ -250,16 +256,21 @@ theorem zero_of_nonpos (h : x ≤ 0) : smoothTransition x = 0 := by
rw [smooth_transition, zero_of_nonpos h, zero_div]
#align real.smooth_transition.zero_of_nonpos Real.smoothTransition.zero_of_nonpos
+#print Real.smoothTransition.zero /-
@[simp]
protected theorem zero : smoothTransition 0 = 0 :=
zero_of_nonpos le_rfl
#align real.smooth_transition.zero Real.smoothTransition.zero
+-/
+#print Real.smoothTransition.one /-
@[simp]
protected theorem one : smoothTransition 1 = 1 :=
one_of_one_le le_rfl
#align real.smooth_transition.one Real.smoothTransition.one
+-/
+#print Real.smoothTransition.projIcc /-
/-- Since `real.smooth_transition` is constant on $(-∞, 0]$ and $[1, ∞)$, applying it to the
projection of `x : ℝ` to $[0, 1]$ gives the same result as applying it to `x`. -/
@[simp]
@@ -271,6 +282,7 @@ protected theorem projIcc :
· rw [smooth_transition.zero, zero_of_nonpos hx.le]
· rw [smooth_transition.one, one_of_one_le hx.le]
#align real.smooth_transition.proj_Icc Real.smoothTransition.projIcc
+-/
theorem le_one (x : ℝ) : smoothTransition x ≤ 1 :=
(div_le_one (pos_denom x)).2 <| le_add_of_nonneg_right (nonneg _)
@@ -288,23 +300,31 @@ theorem pos_of_pos (h : 0 < x) : 0 < smoothTransition x :=
div_pos (expNegInvGlue.pos_of_pos h) (pos_denom x)
#align real.smooth_transition.pos_of_pos Real.smoothTransition.pos_of_pos
+#print Real.smoothTransition.contDiff /-
protected theorem contDiff {n} : ContDiff ℝ n smoothTransition :=
expNegInvGlue.contDiff.div
(expNegInvGlue.contDiff.add <| expNegInvGlue.contDiff.comp <| contDiff_const.sub contDiff_id)
fun x => (pos_denom x).ne'
#align real.smooth_transition.cont_diff Real.smoothTransition.contDiff
+-/
+#print Real.smoothTransition.contDiffAt /-
protected theorem contDiffAt {x n} : ContDiffAt ℝ n smoothTransition x :=
smoothTransition.contDiff.ContDiffAt
#align real.smooth_transition.cont_diff_at Real.smoothTransition.contDiffAt
+-/
+#print Real.smoothTransition.continuous /-
protected theorem continuous : Continuous smoothTransition :=
(@smoothTransition.contDiff 0).Continuous
#align real.smooth_transition.continuous Real.smoothTransition.continuous
+-/
+#print Real.smoothTransition.continuousAt /-
protected theorem continuousAt : ContinuousAt smoothTransition x :=
smoothTransition.continuous.ContinuousAt
#align real.smooth_transition.continuous_at Real.smoothTransition.continuousAt
+-/
end SmoothTransition
@@ -312,6 +332,7 @@ end Real
variable {E X : Type _}
+#print ContDiffBump /-
/-- `f : cont_diff_bump c`, where `c` is a point in a normed vector space, is a
bundled smooth function such that
@@ -323,11 +344,13 @@ The structure `cont_diff_bump` contains the data required to construct the funct
real numbers `r`, `R`, and proofs of `0 < r < R`. The function itself is available through
`coe_fn` when the space is nice enough, i.e., satisfies the `has_cont_diff_bump` typeclass. -/
structure ContDiffBump (c : E) where
- (R r : ℝ)
- r_pos : 0 < r
- r_lt_r : r < R
+ (R rOut : ℝ)
+ rIn_pos : 0 < r
+ rIn_lt_rOut : r < R
#align cont_diff_bump ContDiffBump
+-/
+#print ContDiffBumpBase /-
/- ./././Mathport/Syntax/Translate/Expr.lean:177:8: unsupported: ambiguous notation -/
/-- The base function from which one will construct a family of bump functions. One could
add more properties if they are useful and satisfied in the examples of inner product spaces
@@ -341,21 +364,27 @@ structure ContDiffBumpBase (E : Type _) [NormedAddCommGroup E] [NormedSpace ℝ
eq_one : ∀ (R : ℝ) (hR : 1 < R) (x : E) (hx : ‖x‖ ≤ 1), to_fun R x = 1
support : ∀ (R : ℝ) (hR : 1 < R), support (to_fun R) = Metric.ball (0 : E) R
#align cont_diff_bump_base ContDiffBumpBase
+-/
+#print HasContDiffBump /-
/-- A class registering that a real vector space admits bump functions. This will be instantiated
first for inner product spaces, and then for finite-dimensional normed spaces.
We use a specific class instead of `nonempty (cont_diff_bump_base E)` for performance reasons. -/
class HasContDiffBump (E : Type _) [NormedAddCommGroup E] [NormedSpace ℝ E] : Prop where
out : Nonempty (ContDiffBumpBase E)
#align has_cont_diff_bump HasContDiffBump
+-/
+#print someContDiffBumpBase /-
/-- In a space with `C^∞` bump functions, register some function that will be used as a basis
to construct bump functions of arbitrary size around any point. -/
def someContDiffBumpBase (E : Type _) [NormedAddCommGroup E] [NormedSpace ℝ E]
[hb : HasContDiffBump E] : ContDiffBumpBase E :=
Nonempty.some hb.out
#align some_cont_diff_bump_base someContDiffBumpBase
+-/
+#print hasContDiffBump_of_innerProductSpace /-
/-- Any inner product space has smooth bump functions. -/
instance (priority := 100) hasContDiffBump_of_innerProductSpace (E : Type _) [NormedAddCommGroup E]
[InnerProductSpace ℝ E] : HasContDiffBump E :=
@@ -406,22 +435,19 @@ instance (priority := 100) hasContDiffBump_of_innerProductSpace (E : Type _) [No
apply div_pos <;> linarith }
⟨⟨e⟩⟩
#align has_cont_diff_bump_of_inner_product_space hasContDiffBump_of_innerProductSpace
+-/
namespace ContDiffBump
-/- warning: cont_diff_bump.R_pos clashes with cont_diff_bump.r_pos -> ContDiffBump.r_pos
-Case conversion may be inaccurate. Consider using '#align cont_diff_bump.R_pos ContDiffBump.r_posₓ'. -/
-#print ContDiffBump.r_pos /-
-theorem r_pos {c : E} (f : ContDiffBump c) : 0 < f.r :=
- f.r_pos.trans f.r_lt_r
-#align cont_diff_bump.R_pos ContDiffBump.r_pos
--/
+theorem rOut_pos {c : E} (f : ContDiffBump c) : 0 < f.rOut :=
+ f.rIn_pos.trans f.rIn_lt_rOut
+#align cont_diff_bump.R_pos ContDiffBump.rOut_pos
-theorem one_lt_r_div_r {c : E} (f : ContDiffBump c) : 1 < f.r / f.R :=
+theorem one_lt_rOut_div_rIn {c : E} (f : ContDiffBump c) : 1 < f.rOut / f.R :=
by
rw [one_lt_div f.r_pos]
exact f.r_lt_R
-#align cont_diff_bump.one_lt_R_div_r ContDiffBump.one_lt_r_div_r
+#align cont_diff_bump.one_lt_R_div_r ContDiffBump.one_lt_rOut_div_rIn
instance (c : E) : Inhabited (ContDiffBump c) :=
⟨⟨1, 2, zero_lt_one, one_lt_two⟩⟩
@@ -429,19 +455,21 @@ instance (c : E) : Inhabited (ContDiffBump c) :=
variable [NormedAddCommGroup E] [NormedSpace ℝ E] [NormedAddCommGroup X] [NormedSpace ℝ X]
[HasContDiffBump E] {c : E} (f : ContDiffBump c) {x : E} {n : ℕ∞}
+#print ContDiffBump.toFun /-
/-- The function defined by `f : cont_diff_bump c`. Use automatic coercion to
function instead. -/
def toFun {c : E} (f : ContDiffBump c) : E → ℝ := fun x =>
- (someContDiffBumpBase E).toFun (f.r / f.R) (f.R⁻¹ • (x - c))
+ (someContDiffBumpBase E).toFun (f.rOut / f.R) (f.R⁻¹ • (x - c))
#align cont_diff_bump.to_fun ContDiffBump.toFun
+-/
instance : CoeFun (ContDiffBump c) fun _ => E → ℝ :=
⟨toFun⟩
-protected theorem def (x : E) :
- f x = (someContDiffBumpBase E).toFun (f.r / f.R) (f.R⁻¹ • (x - c)) :=
+protected theorem apply (x : E) :
+ f x = (someContDiffBumpBase E).toFun (f.rOut / f.R) (f.R⁻¹ • (x - c)) :=
rfl
-#align cont_diff_bump.def ContDiffBump.def
+#align cont_diff_bump.def ContDiffBump.apply
protected theorem sub (x : E) : f (c - x) = f (c + x) := by simp [f.def, ContDiffBumpBase.symmetric]
#align cont_diff_bump.sub ContDiffBump.sub
@@ -472,7 +500,7 @@ theorem le_one : f x ≤ 1 :=
(ContDiffBumpBase.mem_Icc (someContDiffBumpBase E) _ _).2
#align cont_diff_bump.le_one ContDiffBump.le_one
-theorem pos_of_mem_ball (hx : x ∈ ball c f.r) : 0 < f x :=
+theorem pos_of_mem_ball (hx : x ∈ ball c f.rOut) : 0 < f x :=
by
refine' lt_iff_le_and_ne.2 ⟨f.nonneg, Ne.symm _⟩
change f.r⁻¹ • (x - c) ∈ support ((someContDiffBumpBase E).toFun (f.R / f.r))
@@ -482,7 +510,7 @@ theorem pos_of_mem_ball (hx : x ∈ ball c f.r) : 0 < f x :=
div_eq_inv_mul] using (div_lt_div_right f.r_pos).2 hx
#align cont_diff_bump.pos_of_mem_ball ContDiffBump.pos_of_mem_ball
-theorem zero_of_le_dist (hx : f.r ≤ dist x c) : f x = 0 :=
+theorem zero_of_le_dist (hx : f.rOut ≤ dist x c) : f x = 0 :=
by
rw [dist_eq_norm] at hx
suffices H : f.r⁻¹ • (x - c) ∉ support ((someContDiffBumpBase E).toFun (f.R / f.r))
@@ -492,7 +520,7 @@ theorem zero_of_le_dist (hx : f.r ≤ dist x c) : f x = 0 :=
exact div_le_div_of_le f.r_pos.le hx
#align cont_diff_bump.zero_of_le_dist ContDiffBump.zero_of_le_dist
-theorem support_eq : support (f : E → ℝ) = Metric.ball c f.r :=
+theorem support_eq : support (f : E → ℝ) = Metric.ball c f.rOut :=
by
ext x
suffices f x ≠ 0 ↔ dist x c < f.R by simpa [mem_support]
@@ -501,7 +529,7 @@ theorem support_eq : support (f : E → ℝ) = Metric.ball c f.r :=
· simp only [hx.not_lt, f.zero_of_le_dist hx, Ne.def, eq_self_iff_true, not_true]
#align cont_diff_bump.support_eq ContDiffBump.support_eq
-theorem tsupport_eq : tsupport f = closedBall c f.r := by
+theorem tsupport_eq : tsupport f = closedBall c f.rOut := by
simp_rw [tsupport, f.support_eq, closure_ball _ f.R_pos.ne']
#align cont_diff_bump.tsupport_eq ContDiffBump.tsupport_eq
@@ -515,7 +543,7 @@ theorem eventuallyEq_one_of_mem_ball (h : x ∈ ball c f.R) : f =ᶠ[𝓝 x] 1 :
#align cont_diff_bump.eventually_eq_one_of_mem_ball ContDiffBump.eventuallyEq_one_of_mem_ball
theorem eventuallyEq_one : f =ᶠ[𝓝 c] 1 :=
- f.eventuallyEq_one_of_mem_ball (mem_ball_self f.r_pos)
+ f.eventuallyEq_one_of_mem_ball (mem_ball_self f.rIn_pos)
#align cont_diff_bump.eventually_eq_one ContDiffBump.eventuallyEq_one
/- ./././Mathport/Syntax/Translate/Expr.lean:177:8: unsupported: ambiguous notation -/
@@ -523,13 +551,13 @@ theorem eventuallyEq_one : f =ᶠ[𝓝 c] 1 :=
/-- `cont_diff_bump` is `𝒞ⁿ` in all its arguments. -/
protected theorem ContDiffAt.contDiffBump {c g : X → E} {f : ∀ x, ContDiffBump (c x)} {x : X}
(hc : ContDiffAt ℝ n c x) (hr : ContDiffAt ℝ n (fun x => (f x).R) x)
- (hR : ContDiffAt ℝ n (fun x => (f x).r) x) (hg : ContDiffAt ℝ n g x) :
+ (hR : ContDiffAt ℝ n (fun x => (f x).rOut) x) (hg : ContDiffAt ℝ n g x) :
ContDiffAt ℝ n (fun x => f x (g x)) x :=
by
rcases eq_or_ne (g x) (c x) with (hx | hx)
· have : (fun x => f x (g x)) =ᶠ[𝓝 x] fun x => 1 :=
by
- have : dist (g x) (c x) < (f x).R := by simp_rw [hx, dist_self, (f x).r_pos]
+ have : dist (g x) (c x) < (f x).R := by simp_rw [hx, dist_self, (f x).rIn_pos]
have :=
ContinuousAt.eventually_lt (hg.continuous_at.dist hc.continuous_at) hr.continuous_at this
exact eventually_of_mem this fun x hx => (f x).one_of_mem_closedBall (mem_set_of_eq.mp hx).le
@@ -537,46 +565,56 @@ protected theorem ContDiffAt.contDiffBump {c g : X → E} {f : ∀ x, ContDiffBu
· change
ContDiffAt ℝ n
(uncurry (someContDiffBumpBase E).toFun ∘ fun x : X =>
- ((f x).r / (f x).R, (f x).R⁻¹ • (g x - c x)))
+ ((f x).rOut / (f x).R, (f x).R⁻¹ • (g x - c x)))
x
- have A : ((f x).r / (f x).R, (f x).R⁻¹ • (g x - c x)) ∈ Ioi (1 : ℝ) ×ˢ (univ : Set E) := by
- simpa only [prod_mk_mem_set_prod_eq, mem_univ, and_true_iff] using (f x).one_lt_r_div_r
- have B : Ioi (1 : ℝ) ×ˢ (univ : Set E) ∈ 𝓝 ((f x).r / (f x).R, (f x).R⁻¹ • (g x - c x)) :=
+ have A : ((f x).rOut / (f x).R, (f x).R⁻¹ • (g x - c x)) ∈ Ioi (1 : ℝ) ×ˢ (univ : Set E) := by
+ simpa only [prod_mk_mem_set_prod_eq, mem_univ, and_true_iff] using (f x).one_lt_rOut_div_rIn
+ have B : Ioi (1 : ℝ) ×ˢ (univ : Set E) ∈ 𝓝 ((f x).rOut / (f x).R, (f x).R⁻¹ • (g x - c x)) :=
(is_open_Ioi.prod isOpen_univ).mem_nhds A
apply
((((someContDiffBumpBase E).smooth.ContDiffWithinAt A).ContDiffAt B).of_le le_top).comp x _
- exact (hR.div hr (f x).r_pos.ne').Prod ((hr.inv (f x).r_pos.ne').smul (hg.sub hc))
+ exact (hR.div hr (f x).rIn_pos.ne').Prod ((hr.inv (f x).rIn_pos.ne').smul (hg.sub hc))
#align cont_diff_at.cont_diff_bump ContDiffAt.contDiffBump
theorem ContDiff.contDiffBump {c g : X → E} {f : ∀ x, ContDiffBump (c x)} (hc : ContDiff ℝ n c)
- (hr : ContDiff ℝ n fun x => (f x).R) (hR : ContDiff ℝ n fun x => (f x).r)
+ (hr : ContDiff ℝ n fun x => (f x).R) (hR : ContDiff ℝ n fun x => (f x).rOut)
(hg : ContDiff ℝ n g) : ContDiff ℝ n fun x => f x (g x) := by rw [contDiff_iff_contDiffAt] at *;
exact fun x => (hc x).ContDiffBump (hr x) (hR x) (hg x)
#align cont_diff.cont_diff_bump ContDiff.contDiffBump
+#print ContDiffBump.contDiff /-
protected theorem contDiff : ContDiff ℝ n f :=
contDiff_const.ContDiffBump contDiff_const contDiff_const contDiff_id
#align cont_diff_bump.cont_diff ContDiffBump.contDiff
+-/
+#print ContDiffBump.contDiffAt /-
protected theorem contDiffAt : ContDiffAt ℝ n f x :=
f.ContDiff.ContDiffAt
#align cont_diff_bump.cont_diff_at ContDiffBump.contDiffAt
+-/
+#print ContDiffBump.contDiffWithinAt /-
protected theorem contDiffWithinAt {s : Set E} : ContDiffWithinAt ℝ n f s x :=
f.ContDiffAt.ContDiffWithinAt
#align cont_diff_bump.cont_diff_within_at ContDiffBump.contDiffWithinAt
+-/
+#print ContDiffBump.continuous /-
protected theorem continuous : Continuous f :=
contDiff_zero.mp f.ContDiff
#align cont_diff_bump.continuous ContDiffBump.continuous
+-/
open MeasureTheory
variable [MeasurableSpace E] {μ : Measure E}
+#print ContDiffBump.normed /-
/-- A bump function normed so that `∫ x, f.normed μ x ∂μ = 1`. -/
protected def normed (μ : Measure E) : E → ℝ := fun x => f x / ∫ x, f x ∂μ
#align cont_diff_bump.normed ContDiffBump.normed
+-/
theorem normed_def {μ : Measure E} (x : E) : f.normed μ x = f x / ∫ x, f x ∂μ :=
rfl
@@ -586,13 +624,17 @@ theorem nonneg_normed (x : E) : 0 ≤ f.normed μ x :=
div_nonneg f.NonNeg <| integral_nonneg f.nonneg'
#align cont_diff_bump.nonneg_normed ContDiffBump.nonneg_normed
+#print ContDiffBump.contDiff_normed /-
theorem contDiff_normed {n : ℕ∞} : ContDiff ℝ n (f.normed μ) :=
f.ContDiff.div_const _
#align cont_diff_bump.cont_diff_normed ContDiffBump.contDiff_normed
+-/
+#print ContDiffBump.continuous_normed /-
theorem continuous_normed : Continuous (f.normed μ) :=
f.Continuous.div_const _
#align cont_diff_bump.continuous_normed ContDiffBump.continuous_normed
+-/
theorem normed_sub (x : E) : f.normed μ (c - x) = f.normed μ (c + x) := by
simp_rw [f.normed_def, f.sub]
@@ -604,13 +646,17 @@ theorem normed_neg (f : ContDiffBump (0 : E)) (x : E) : f.normed μ (-x) = f.nor
variable [BorelSpace E] [FiniteDimensional ℝ E] [IsLocallyFiniteMeasure μ]
+#print ContDiffBump.integrable /-
protected theorem integrable : Integrable f μ :=
f.Continuous.integrable_of_hasCompactSupport f.HasCompactSupport
#align cont_diff_bump.integrable ContDiffBump.integrable
+-/
+#print ContDiffBump.integrable_normed /-
protected theorem integrable_normed : Integrable (f.normed μ) μ :=
f.Integrable.div_const _
#align cont_diff_bump.integrable_normed ContDiffBump.integrable_normed
+-/
variable [μ.IsOpenPosMeasure]
@@ -627,12 +673,12 @@ theorem integral_normed : (∫ x, f.normed μ x ∂μ) = 1 :=
exact inv_mul_cancel f.integral_pos.ne'
#align cont_diff_bump.integral_normed ContDiffBump.integral_normed
-theorem support_normed_eq : support (f.normed μ) = Metric.ball c f.r := by
+theorem support_normed_eq : support (f.normed μ) = Metric.ball c f.rOut := by
simp_rw [ContDiffBump.normed, support_div, f.support_eq, support_const f.integral_pos.ne',
inter_univ]
#align cont_diff_bump.support_normed_eq ContDiffBump.support_normed_eq
-theorem tsupport_normed_eq : tsupport (f.normed μ) = Metric.closedBall c f.r := by
+theorem tsupport_normed_eq : tsupport (f.normed μ) = Metric.closedBall c f.rOut := by
simp_rw [tsupport, f.support_normed_eq, closure_ball _ f.R_pos.ne']
#align cont_diff_bump.tsupport_normed_eq ContDiffBump.tsupport_normed_eq
@@ -641,11 +687,11 @@ theorem hasCompactSupport_normed : HasCompactSupport (f.normed μ) := by
#align cont_diff_bump.has_compact_support_normed ContDiffBump.hasCompactSupport_normed
theorem tendsto_support_normed_smallSets {ι} {φ : ι → ContDiffBump c} {l : Filter ι}
- (hφ : Tendsto (fun i => (φ i).r) l (𝓝 0)) :
+ (hφ : Tendsto (fun i => (φ i).rOut) l (𝓝 0)) :
Tendsto (fun i => support fun x => (φ i).normed μ x) l (𝓝 c).smallSets :=
by
simp_rw [NormedAddCommGroup.tendsto_nhds_zero, Real.norm_eq_abs,
- abs_eq_self.mpr (φ _).r_pos.le] at hφ
+ abs_eq_self.mpr (φ _).rOut_pos.le] at hφ
rw [tendsto_small_sets_iff]
intro t ht
rcases metric.mem_nhds_iff.mp ht with ⟨ε, hε, ht⟩
@@ -656,9 +702,11 @@ theorem tendsto_support_normed_smallSets {ι} {φ : ι → ContDiffBump c} {l :
variable (μ)
+#print ContDiffBump.integral_normed_smul /-
theorem integral_normed_smul [CompleteSpace X] (z : X) : (∫ x, f.normed μ x • z ∂μ) = z := by
simp_rw [integral_smul_const, f.integral_normed, one_smul]
#align cont_diff_bump.integral_normed_smul ContDiffBump.integral_normed_smul
+-/
end ContDiffBump
mathlib commit https://github.com/leanprover-community/mathlib/commit/a3209ddf94136d36e5e5c624b10b2a347cc9d090
@@ -93,7 +93,7 @@ theorem f_aux_deriv (n : ℕ) (x : ℝ) (hx : x ≠ 0) :
by
simp only [P_aux, eval_add, eval_sub, eval_mul, eval_pow, eval_X, eval_C, eval_one]
convert
- (((P_aux n).HasDerivAt x).mul ((has_deriv_at_exp _).comp x (hasDerivAt_inv hx).neg)).div
+ (((P_aux n).HasDerivAt x).mul ((hasDerivAt_exp _).comp x (hasDerivAt_inv hx).neg)).div
(hasDerivAt_pow (2 * n) x) (pow_ne_zero _ hx) using
1
rw [div_eq_div_iff]
mathlib commit https://github.com/leanprover-community/mathlib/commit/5f25c089cb34db4db112556f23c50d12da81b297
@@ -92,7 +92,8 @@ theorem f_aux_deriv (n : ℕ) (x : ℝ) (hx : x ≠ 0) :
((pAux (n + 1)).eval x * exp (-x⁻¹) / x ^ (2 * (n + 1))) x :=
by
simp only [P_aux, eval_add, eval_sub, eval_mul, eval_pow, eval_X, eval_C, eval_one]
- convert(((P_aux n).HasDerivAt x).mul ((has_deriv_at_exp _).comp x (hasDerivAt_inv hx).neg)).div
+ convert
+ (((P_aux n).HasDerivAt x).mul ((has_deriv_at_exp _).comp x (hasDerivAt_inv hx).neg)).div
(hasDerivAt_pow (2 * n) x) (pow_ne_zero _ hx) using
1
rw [div_eq_div_iff]
@@ -109,7 +110,7 @@ theorem fAux_deriv_pos (n : ℕ) (x : ℝ) (hx : 0 < x) :
HasDerivAt (fAux n) ((pAux (n + 1)).eval x * exp (-x⁻¹) / x ^ (2 * (n + 1))) x :=
by
apply (f_aux_deriv n x (ne_of_gt hx)).congr_of_eventuallyEq
- filter_upwards [lt_mem_nhds hx]with _ hy
+ filter_upwards [lt_mem_nhds hx] with _ hy
simp [f_aux, hy.not_le]
#align exp_neg_inv_glue.f_aux_deriv_pos expNegInvGlue.fAux_deriv_pos
@@ -123,7 +124,7 @@ theorem f_aux_limit (n : ℕ) :
(P_aux n).ContinuousWithinAt
have B : tendsto (fun x => exp (-x⁻¹) / x ^ (2 * n)) (𝓝[>] 0) (𝓝 0) :=
by
- convert(tendsto_pow_mul_exp_neg_at_top_nhds_0 (2 * n)).comp tendsto_inv_zero_atTop
+ convert (tendsto_pow_mul_exp_neg_at_top_nhds_0 (2 * n)).comp tendsto_inv_zero_atTop
ext x
field_simp
convert A.mul B <;> simp [mul_div_assoc]
@@ -172,7 +173,7 @@ theorem fAux_hasDerivAt (n : ℕ) (x : ℝ) : HasDerivAt (fAux n) (fAux (n + 1)
· have : f_aux (n + 1) x = 0 := by simp [f_aux, le_of_lt hx]
rw [this]
apply (hasDerivAt_const x (0 : ℝ)).congr_of_eventuallyEq
- filter_upwards [gt_mem_nhds hx]with _ hy
+ filter_upwards [gt_mem_nhds hx] with _ hy
simp [f_aux, hy.le]
· have : f_aux (n + 1) 0 = 0 := by simp [f_aux, le_refl]
rw [hx, this]
@@ -382,7 +383,7 @@ instance (priority := 100) hasContDiffBump_of_innerProductSpace (E : Type _) [No
apply (tendsto_order.1 A).1
apply (one_lt_div (sub_pos.2 hR)).2
simp only [norm_zero, tsub_zero, sub_lt_self_iff, zero_lt_one]
- filter_upwards [this]with q hq
+ filter_upwards [this] with q hq
exact Real.smoothTransition.one_of_one_le hq.le
exact cont_diff_at_const.congr_of_eventually_eq this
· refine' real.smooth_transition.cont_diff_at.comp _ _
@@ -601,7 +602,7 @@ theorem normed_neg (f : ContDiffBump (0 : E)) (x : E) : f.normed μ (-x) = f.nor
simp_rw [f.normed_def, f.neg]
#align cont_diff_bump.normed_neg ContDiffBump.normed_neg
-variable [BorelSpace E] [FiniteDimensional ℝ E] [LocallyFiniteMeasure μ]
+variable [BorelSpace E] [FiniteDimensional ℝ E] [IsLocallyFiniteMeasure μ]
protected theorem integrable : Integrable f μ :=
f.Continuous.integrable_of_hasCompactSupport f.HasCompactSupport
@@ -611,7 +612,7 @@ protected theorem integrable_normed : Integrable (f.normed μ) μ :=
f.Integrable.div_const _
#align cont_diff_bump.integrable_normed ContDiffBump.integrable_normed
-variable [μ.OpenPosMeasure]
+variable [μ.IsOpenPosMeasure]
theorem integral_pos : 0 < ∫ x, f x ∂μ :=
by
mathlib commit https://github.com/leanprover-community/mathlib/commit/cca40788df1b8755d5baf17ab2f27dacc2e17acb
@@ -139,7 +139,7 @@ theorem fAux_deriv_zero (n : ℕ) : HasDerivAt (fAux n) 0 0 :=
by
apply (hasDerivAt_const (0 : ℝ) (0 : ℝ)).HasDerivWithinAt.congr
· intro y hy
- simp at hy
+ simp at hy
simp [f_aux, hy]
· simp [f_aux, le_refl]
have B : HasDerivWithinAt (f_aux n) (0 : ℝ) (Ici 0) 0 :=
@@ -394,13 +394,13 @@ instance (priority := 100) hasContDiffBump_of_innerProductSpace (E : Type _) [No
support := fun R hR => by
apply subset.antisymm
· intro x hx
- simp only [mem_support] at hx
+ simp only [mem_support] at hx
contrapose! hx
- simp only [mem_ball_zero_iff, not_lt] at hx
+ simp only [mem_ball_zero_iff, not_lt] at hx
apply Real.smoothTransition.zero_of_nonpos
apply div_nonpos_of_nonpos_of_nonneg <;> linarith
· intro x hx
- simp only [mem_ball_zero_iff] at hx
+ simp only [mem_ball_zero_iff] at hx
apply (Real.smoothTransition.pos_of_pos _).ne'
apply div_pos <;> linarith }
⟨⟨e⟩⟩
@@ -476,14 +476,14 @@ theorem pos_of_mem_ball (hx : x ∈ ball c f.r) : 0 < f x :=
refine' lt_iff_le_and_ne.2 ⟨f.nonneg, Ne.symm _⟩
change f.r⁻¹ • (x - c) ∈ support ((someContDiffBumpBase E).toFun (f.R / f.r))
rw [ContDiffBumpBase.support _ _ f.one_lt_R_div_r]
- simp only [dist_eq_norm, mem_ball] at hx
+ simp only [dist_eq_norm, mem_ball] at hx
simpa only [norm_smul, mem_ball_zero_iff, norm_eq_abs, abs_inv, abs_of_nonneg f.r_pos.le, ←
div_eq_inv_mul] using (div_lt_div_right f.r_pos).2 hx
#align cont_diff_bump.pos_of_mem_ball ContDiffBump.pos_of_mem_ball
theorem zero_of_le_dist (hx : f.r ≤ dist x c) : f x = 0 :=
by
- rw [dist_eq_norm] at hx
+ rw [dist_eq_norm] at hx
suffices H : f.r⁻¹ • (x - c) ∉ support ((someContDiffBumpBase E).toFun (f.R / f.r))
· simpa only [mem_support, Classical.not_not] using H
rw [ContDiffBumpBase.support _ _ f.one_lt_R_div_r]
@@ -644,7 +644,7 @@ theorem tendsto_support_normed_smallSets {ι} {φ : ι → ContDiffBump c} {l :
Tendsto (fun i => support fun x => (φ i).normed μ x) l (𝓝 c).smallSets :=
by
simp_rw [NormedAddCommGroup.tendsto_nhds_zero, Real.norm_eq_abs,
- abs_eq_self.mpr (φ _).r_pos.le] at hφ
+ abs_eq_self.mpr (φ _).r_pos.le] at hφ
rw [tendsto_small_sets_iff]
intro t ht
rcases metric.mem_nhds_iff.mp ht with ⟨ε, hε, ht⟩
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -45,11 +45,11 @@ function cannot have:
noncomputable section
-open Classical Topology
+open scoped Classical Topology
open Polynomial Real Filter Set Function
-open Polynomial
+open scoped Polynomial
/-- `exp_neg_inv_glue` is the real function given by `x ↦ exp (-1/x)` for `x > 0` and `0`
for `x ≤ 0`. It is a basic building block to construct smooth partitions of unity. Its main property
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -96,13 +96,10 @@ theorem f_aux_deriv (n : ℕ) (x : ℝ) (hx : x ≠ 0) :
(hasDerivAt_pow (2 * n) x) (pow_ne_zero _ hx) using
1
rw [div_eq_div_iff]
- · have := pow_ne_zero 2 hx
- field_simp only
+ · have := pow_ne_zero 2 hx; field_simp only
cases n
- · simp only [MulZeroClass.mul_zero, Nat.cast_zero, mul_one]
- ring
- · rw [(id rfl : 2 * n.succ - 1 = 2 * n + 1)]
- ring
+ · simp only [MulZeroClass.mul_zero, Nat.cast_zero, mul_one]; ring
+ · rw [(id rfl : 2 * n.succ - 1 = 2 * n + 1)]; ring
all_goals apply_rules [pow_ne_zero]
#align exp_neg_inv_glue.f_aux_deriv expNegInvGlue.f_aux_deriv
@@ -552,9 +549,7 @@ protected theorem ContDiffAt.contDiffBump {c g : X → E} {f : ∀ x, ContDiffBu
theorem ContDiff.contDiffBump {c g : X → E} {f : ∀ x, ContDiffBump (c x)} (hc : ContDiff ℝ n c)
(hr : ContDiff ℝ n fun x => (f x).R) (hR : ContDiff ℝ n fun x => (f x).r)
- (hg : ContDiff ℝ n g) : ContDiff ℝ n fun x => f x (g x) :=
- by
- rw [contDiff_iff_contDiffAt] at *
+ (hg : ContDiff ℝ n g) : ContDiff ℝ n fun x => f x (g x) := by rw [contDiff_iff_contDiffAt] at *;
exact fun x => (hc x).ContDiffBump (hr x) (hR x) (hg x)
#align cont_diff.cont_diff_bump ContDiff.contDiffBump
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -4,10 +4,11 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Sébastien Gouëzel, Floris van Doorn
! This file was ported from Lean 3 source module analysis.calculus.bump_function_inner
-! leanprover-community/mathlib commit 8f9fea08977f7e450770933ee6abb20733b47c92
+! leanprover-community/mathlib commit 3bce8d800a6f2b8f63fe1e588fd76a9ff4adcebe
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
+import Mathbin.Analysis.Calculus.Deriv.Inv
import Mathbin.Analysis.Calculus.ExtendDeriv
import Mathbin.Analysis.Calculus.IteratedDeriv
import Mathbin.Analysis.InnerProductSpace.Calculus
@@ -261,6 +262,18 @@ protected theorem one : smoothTransition 1 = 1 :=
one_of_one_le le_rfl
#align real.smooth_transition.one Real.smoothTransition.one
+/-- Since `real.smooth_transition` is constant on $(-∞, 0]$ and $[1, ∞)$, applying it to the
+projection of `x : ℝ` to $[0, 1]$ gives the same result as applying it to `x`. -/
+@[simp]
+protected theorem projIcc :
+ smoothTransition (projIcc (0 : ℝ) 1 zero_le_one x) = smoothTransition x :=
+ by
+ refine'
+ congr_fun (Icc_extend_eq_self zero_le_one smooth_transition (fun x hx => _) fun x hx => _) x
+ · rw [smooth_transition.zero, zero_of_nonpos hx.le]
+ · rw [smooth_transition.one, one_of_one_le hx.le]
+#align real.smooth_transition.proj_Icc Real.smoothTransition.projIcc
+
theorem le_one (x : ℝ) : smoothTransition x ≤ 1 :=
(div_le_one (pos_denom x)).2 <| le_add_of_nonneg_right (nonneg _)
#align real.smooth_transition.le_one Real.smoothTransition.le_one
@@ -291,6 +304,10 @@ protected theorem continuous : Continuous smoothTransition :=
(@smoothTransition.contDiff 0).Continuous
#align real.smooth_transition.continuous Real.smoothTransition.continuous
+protected theorem continuousAt : ContinuousAt smoothTransition x :=
+ smoothTransition.continuous.ContinuousAt
+#align real.smooth_transition.continuous_at Real.smoothTransition.continuousAt
+
end SmoothTransition
end Real
mathlib commit https://github.com/leanprover-community/mathlib/commit/95a87616d63b3cb49d3fe678d416fbe9c4217bf4
@@ -4,12 +4,14 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Sébastien Gouëzel, Floris van Doorn
! This file was ported from Lean 3 source module analysis.calculus.bump_function_inner
-! leanprover-community/mathlib commit 2c1d8ca2812b64f88992a5294ea3dba144755cd1
+! leanprover-community/mathlib commit 8f9fea08977f7e450770933ee6abb20733b47c92
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
+import Mathbin.Analysis.Calculus.ExtendDeriv
import Mathbin.Analysis.Calculus.IteratedDeriv
import Mathbin.Analysis.InnerProductSpace.Calculus
+import Mathbin.Analysis.SpecialFunctions.ExpDeriv
import Mathbin.MeasureTheory.Integral.SetIntegral
/-!
mathlib commit https://github.com/leanprover-community/mathlib/commit/cc5dd6244981976cc9da7afc4eee5682b037a013
@@ -597,7 +597,7 @@ protected theorem integrable_normed : Integrable (f.normed μ) μ :=
f.Integrable.div_const _
#align cont_diff_bump.integrable_normed ContDiffBump.integrable_normed
-variable [μ.IsOpenPosMeasure]
+variable [μ.OpenPosMeasure]
theorem integral_pos : 0 < ∫ x, f x ∂μ :=
by
mathlib commit https://github.com/leanprover-community/mathlib/commit/d4437c68c8d350fc9d4e95e1e174409db35e30d7
@@ -587,7 +587,7 @@ theorem normed_neg (f : ContDiffBump (0 : E)) (x : E) : f.normed μ (-x) = f.nor
simp_rw [f.normed_def, f.neg]
#align cont_diff_bump.normed_neg ContDiffBump.normed_neg
-variable [BorelSpace E] [FiniteDimensional ℝ E] [IsLocallyFiniteMeasure μ]
+variable [BorelSpace E] [FiniteDimensional ℝ E] [LocallyFiniteMeasure μ]
protected theorem integrable : Integrable f μ :=
f.Continuous.integrable_of_hasCompactSupport f.HasCompactSupport
mathlib commit https://github.com/leanprover-community/mathlib/commit/92c69b77c5a7dc0f7eeddb552508633305157caa
@@ -590,12 +590,12 @@ theorem normed_neg (f : ContDiffBump (0 : E)) (x : E) : f.normed μ (-x) = f.nor
variable [BorelSpace E] [FiniteDimensional ℝ E] [IsLocallyFiniteMeasure μ]
protected theorem integrable : Integrable f μ :=
- f.Continuous.integrableOfHasCompactSupport f.HasCompactSupport
+ f.Continuous.integrable_of_hasCompactSupport f.HasCompactSupport
#align cont_diff_bump.integrable ContDiffBump.integrable
-protected theorem integrableNormed : Integrable (f.normed μ) μ :=
+protected theorem integrable_normed : Integrable (f.normed μ) μ :=
f.Integrable.div_const _
-#align cont_diff_bump.integrable_normed ContDiffBump.integrableNormed
+#align cont_diff_bump.integrable_normed ContDiffBump.integrable_normed
variable [μ.IsOpenPosMeasure]
mathlib commit https://github.com/leanprover-community/mathlib/commit/36b8aa61ea7c05727161f96a0532897bd72aedab
@@ -4,13 +4,12 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Sébastien Gouëzel, Floris van Doorn
! This file was ported from Lean 3 source module analysis.calculus.bump_function_inner
-! leanprover-community/mathlib commit 46b633fd842bef9469441c0209906f6dddd2b4f5
+! leanprover-community/mathlib commit 2c1d8ca2812b64f88992a5294ea3dba144755cd1
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathbin.Analysis.Calculus.IteratedDeriv
-import Mathbin.Analysis.InnerProductSpace.EuclideanDist
-import Mathbin.MeasureTheory.Function.LocallyIntegrable
+import Mathbin.Analysis.InnerProductSpace.Calculus
import Mathbin.MeasureTheory.Integral.SetIntegral
/-!
mathlib commit https://github.com/leanprover-community/mathlib/commit/55d771df074d0dd020139ee1cd4b95521422df9f
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Sébastien Gouëzel, Floris van Doorn
! This file was ported from Lean 3 source module analysis.calculus.bump_function_inner
-! leanprover-community/mathlib commit 8c8c544bf24ced19b1e76c34bb3262bdae620f82
+! leanprover-community/mathlib commit 46b633fd842bef9469441c0209906f6dddd2b4f5
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -341,7 +341,7 @@ def someContDiffBumpBase (E : Type _) [NormedAddCommGroup E] [NormedSpace ℝ E]
#align some_cont_diff_bump_base someContDiffBumpBase
/-- Any inner product space has smooth bump functions. -/
-instance (priority := 100) hasContDiffBump_of_innerProductSpace (E : Type _)
+instance (priority := 100) hasContDiffBump_of_innerProductSpace (E : Type _) [NormedAddCommGroup E]
[InnerProductSpace ℝ E] : HasContDiffBump E :=
let e : ContDiffBumpBase E :=
{ toFun := fun R x => Real.smoothTransition ((R - ‖x‖) / (R - 1))
@@ -372,7 +372,7 @@ instance (priority := 100) hasContDiffBump_of_innerProductSpace (E : Type _)
exact cont_diff_at_const.congr_of_eventually_eq this
· refine' real.smooth_transition.cont_diff_at.comp _ _
refine' ContDiffAt.div _ _ (sub_pos.2 hR).ne'
- · exact cont_diff_at_fst.sub (cont_diff_at_snd.norm hx)
+ · exact cont_diff_at_fst.sub (cont_diff_at_snd.norm ℝ hx)
· exact cont_diff_at_fst.sub contDiffAt_const
eq_one := fun R hR x hx =>
Real.smoothTransition.one_of_one_le <| (one_le_div (sub_pos.2 hR)).2 (sub_le_sub_left hx _)
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce7e9d53d4bbc38065db3b595cd5bd73c323bc1d
@@ -90,8 +90,7 @@ theorem f_aux_deriv (n : ℕ) (x : ℝ) (hx : x ≠ 0) :
((pAux (n + 1)).eval x * exp (-x⁻¹) / x ^ (2 * (n + 1))) x :=
by
simp only [P_aux, eval_add, eval_sub, eval_mul, eval_pow, eval_X, eval_C, eval_one]
- convert
- (((P_aux n).HasDerivAt x).mul ((has_deriv_at_exp _).comp x (hasDerivAt_inv hx).neg)).div
+ convert(((P_aux n).HasDerivAt x).mul ((has_deriv_at_exp _).comp x (hasDerivAt_inv hx).neg)).div
(hasDerivAt_pow (2 * n) x) (pow_ne_zero _ hx) using
1
rw [div_eq_div_iff]
@@ -125,7 +124,7 @@ theorem f_aux_limit (n : ℕ) :
(P_aux n).ContinuousWithinAt
have B : tendsto (fun x => exp (-x⁻¹) / x ^ (2 * n)) (𝓝[>] 0) (𝓝 0) :=
by
- convert (tendsto_pow_mul_exp_neg_at_top_nhds_0 (2 * n)).comp tendsto_inv_zero_atTop
+ convert(tendsto_pow_mul_exp_neg_at_top_nhds_0 (2 * n)).comp tendsto_inv_zero_atTop
ext x
field_simp
convert A.mul B <;> simp [mul_div_assoc]
mathlib commit https://github.com/leanprover-community/mathlib/commit/2af0836443b4cfb5feda0df0051acdb398304931
@@ -342,8 +342,8 @@ def someContDiffBumpBase (E : Type _) [NormedAddCommGroup E] [NormedSpace ℝ E]
#align some_cont_diff_bump_base someContDiffBumpBase
/-- Any inner product space has smooth bump functions. -/
-instance (priority := 100) hasContDiffBumpOfInnerProductSpace (E : Type _) [InnerProductSpace ℝ E] :
- HasContDiffBump E :=
+instance (priority := 100) hasContDiffBump_of_innerProductSpace (E : Type _)
+ [InnerProductSpace ℝ E] : HasContDiffBump E :=
let e : ContDiffBumpBase E :=
{ toFun := fun R x => Real.smoothTransition ((R - ‖x‖) / (R - 1))
mem_Icc := fun R x => ⟨Real.smoothTransition.nonneg _, Real.smoothTransition.le_one _⟩
@@ -390,7 +390,7 @@ instance (priority := 100) hasContDiffBumpOfInnerProductSpace (E : Type _) [Inne
apply (Real.smoothTransition.pos_of_pos _).ne'
apply div_pos <;> linarith }
⟨⟨e⟩⟩
-#align has_cont_diff_bump_of_inner_product_space hasContDiffBumpOfInnerProductSpace
+#align has_cont_diff_bump_of_inner_product_space hasContDiffBump_of_innerProductSpace
namespace ContDiffBump
mathlib commit https://github.com/leanprover-community/mathlib/commit/3180fab693e2cee3bff62675571264cb8778b212
@@ -98,7 +98,7 @@ theorem f_aux_deriv (n : ℕ) (x : ℝ) (hx : x ≠ 0) :
· have := pow_ne_zero 2 hx
field_simp only
cases n
- · simp only [mul_zero, Nat.cast_zero, mul_one]
+ · simp only [MulZeroClass.mul_zero, Nat.cast_zero, mul_one]
ring
· rw [(id rfl : 2 * n.succ - 1 = 2 * n + 1)]
ring
mathlib commit https://github.com/leanprover-community/mathlib/commit/38f16f960f5006c6c0c2bac7b0aba5273188f4e5
@@ -65,7 +65,7 @@ derivatives for `x > 0`. The `n`-th derivative is of the form `P_aux n (x) exp(-
where `P_aux n` is computed inductively. -/
noncomputable def pAux : ℕ → ℝ[X]
| 0 => 1
- | n + 1 => x ^ 2 * (P_aux n).derivative + (1 - c ↑(2 * n) * x) * P_aux n
+ | n + 1 => X ^ 2 * (P_aux n).derivative + (1 - C ↑(2 * n) * X) * P_aux n
#align exp_neg_inv_glue.P_aux expNegInvGlue.pAux
/-- Formula for the `n`-th derivative of `exp_neg_inv_glue`, as an auxiliary function `f_aux`. -/
mathlib commit https://github.com/leanprover-community/mathlib/commit/bd9851ca476957ea4549eb19b40e7b5ade9428cc
set_integral
with setIntegral
(#12215)
Done with a global search and replace, and then (to fix the #align
lines), replace (#align \S*)setIntegral
with $1set_integral
.
@@ -110,9 +110,9 @@ theorem integral_normed_smul {X} [NormedAddCommGroup X] [NormedSpace ℝ X]
theorem measure_closedBall_le_integral : (μ (closedBall c f.rIn)).toReal ≤ ∫ x, f x ∂μ := by calc
(μ (closedBall c f.rIn)).toReal = ∫ x in closedBall c f.rIn, 1 ∂μ := by simp
- _ = ∫ x in closedBall c f.rIn, f x ∂μ := set_integral_congr measurableSet_closedBall
+ _ = ∫ x in closedBall c f.rIn, f x ∂μ := setIntegral_congr measurableSet_closedBall
(fun x hx ↦ (one_of_mem_closedBall f hx).symm)
- _ ≤ ∫ x, f x ∂μ := set_integral_le_integral f.integrable (eventually_of_forall (fun x ↦ f.nonneg))
+ _ ≤ ∫ x, f x ∂μ := setIntegral_le_integral f.integrable (eventually_of_forall (fun x ↦ f.nonneg))
theorem normed_le_div_measure_closedBall_rIn (x : E) :
f.normed μ x ≤ 1 / (μ (closedBall c f.rIn)).toReal := by
@@ -124,11 +124,11 @@ theorem normed_le_div_measure_closedBall_rIn (x : E) :
theorem integral_le_measure_closedBall : ∫ x, f x ∂μ ≤ (μ (closedBall c f.rOut)).toReal := by calc
∫ x, f x ∂μ = ∫ x in closedBall c f.rOut, f x ∂μ := by
- apply (set_integral_eq_integral_of_forall_compl_eq_zero (fun x hx ↦ ?_)).symm
+ apply (setIntegral_eq_integral_of_forall_compl_eq_zero (fun x hx ↦ ?_)).symm
apply f.zero_of_le_dist (le_of_lt _)
simpa using hx
_ ≤ ∫ x in closedBall c f.rOut, 1 ∂μ := by
- apply set_integral_mono f.integrable.integrableOn _ (fun x ↦ f.le_one)
+ apply setIntegral_mono f.integrable.integrableOn _ (fun x ↦ f.le_one)
simp [measure_closedBall_lt_top]
_ = (μ (closedBall c f.rOut)).toReal := by simp
@@ -110,7 +110,7 @@ theorem integral_normed_smul {X} [NormedAddCommGroup X] [NormedSpace ℝ X]
theorem measure_closedBall_le_integral : (μ (closedBall c f.rIn)).toReal ≤ ∫ x, f x ∂μ := by calc
(μ (closedBall c f.rIn)).toReal = ∫ x in closedBall c f.rIn, 1 ∂μ := by simp
- _ = ∫ x in closedBall c f.rIn, f x ∂μ := set_integral_congr (measurableSet_closedBall)
+ _ = ∫ x in closedBall c f.rIn, f x ∂μ := set_integral_congr measurableSet_closedBall
(fun x hx ↦ (one_of_mem_closedBall f hx).symm)
_ ≤ ∫ x, f x ∂μ := set_integral_le_integral f.integrable (eventually_of_forall (fun x ↦ f.nonneg))
@@ -82,7 +82,7 @@ add more properties if they are useful and satisfied in the examples of inner pr
and finite dimensional vector spaces, notably derivative norm control in terms of `R - 1`.
TODO: do we ever need `f x = 1 ↔ ‖x‖ ≤ 1`? -/
--- Porting note: was @[nolint has_nonempty_instance]
+-- Porting note(#5171): linter not yet ported; was @[nolint has_nonempty_instance]
structure ContDiffBumpBase (E : Type*) [NormedAddCommGroup E] [NormedSpace ℝ E] where
toFun : ℝ → E → ℝ
mem_Icc : ∀ (R : ℝ) (x : E), toFun R x ∈ Icc (0 : ℝ) 1
@@ -51,7 +51,7 @@ noncomputable def ContDiffBumpBase.ofInnerProductSpace : ContDiffBumpBase E wher
sub_le_sub_left hx _
support R hR := by
ext x
- rw [mem_support, Ne.def, smoothTransition.zero_iff_nonpos, not_le, mem_ball_zero_iff]
+ rw [mem_support, Ne, smoothTransition.zero_iff_nonpos, not_le, mem_ball_zero_iff]
simp [div_pos_iff, sq_lt_sq, abs_of_pos (one_pos.trans hR), hR, hR.not_lt]
/-- Any inner product space has smooth bump functions. -/
@@ -164,7 +164,7 @@ theorem one_of_one_le (h : 1 ≤ x) : smoothTransition x = 1 :=
(div_eq_one_iff_eq <| (pos_denom x).ne').2 <| by rw [zero_of_nonpos (sub_nonpos.2 h), add_zero]
#align real.smooth_transition.one_of_one_le Real.smoothTransition.one_of_one_le
-@[simp] -- Porting note: new theorem
+@[simp] -- Porting note (#10756): new theorem
nonrec theorem zero_iff_nonpos : smoothTransition x = 0 ↔ x ≤ 0 := by
simp only [smoothTransition, _root_.div_eq_zero_iff, (pos_denom x).ne', zero_iff_nonpos, or_false]
@@ -46,7 +46,7 @@ namespace expNegInvGlue
theorem zero_of_nonpos {x : ℝ} (hx : x ≤ 0) : expNegInvGlue x = 0 := by simp [expNegInvGlue, hx]
#align exp_neg_inv_glue.zero_of_nonpos expNegInvGlue.zero_of_nonpos
-@[simp] -- Porting note: new lemma
+@[simp] -- Porting note (#10756): new lemma
protected theorem zero : expNegInvGlue 0 = 0 := zero_of_nonpos le_rfl
/-- The function `expNegInvGlue` is positive on `(0, +∞)`. -/
@@ -61,7 +61,7 @@ theorem nonneg (x : ℝ) : 0 ≤ expNegInvGlue x := by
| inr h => exact le_of_lt (pos_of_pos h)
#align exp_neg_inv_glue.nonneg expNegInvGlue.nonneg
--- Porting note: new lemma
+-- Porting note (#10756): new lemma
@[simp] theorem zero_iff_nonpos {x : ℝ} : expNegInvGlue x = 0 ↔ x ≤ 0 :=
⟨fun h ↦ not_lt.mp fun h' ↦ (pos_of_pos h').ne' h, zero_of_nonpos⟩
@@ -198,7 +198,7 @@ theorem eventuallyEq_one : f =ᶠ[𝓝 c] 1 :=
f.eventuallyEq_one_of_mem_ball (mem_ball_self f.rIn_pos)
#align cont_diff_bump.eventually_eq_one ContDiffBump.eventuallyEq_one
--- Porting note: new lemma
+-- Porting note (#10756): new lemma
/-- `ContDiffBump` is `𝒞ⁿ` in all its arguments. -/
protected theorem _root_.ContDiffWithinAt.contDiffBump {c g : X → E} {s : Set X}
{f : ∀ x, ContDiffBump (c x)} {x : X} (hc : ContDiffWithinAt ℝ n c s x)
Homogenises porting notes via capitalisation and addition of whitespace.
It makes the following changes:
@@ -46,7 +46,7 @@ namespace expNegInvGlue
theorem zero_of_nonpos {x : ℝ} (hx : x ≤ 0) : expNegInvGlue x = 0 := by simp [expNegInvGlue, hx]
#align exp_neg_inv_glue.zero_of_nonpos expNegInvGlue.zero_of_nonpos
-@[simp] -- porting note: new lemma
+@[simp] -- Porting note: new lemma
protected theorem zero : expNegInvGlue 0 = 0 := zero_of_nonpos le_rfl
/-- The function `expNegInvGlue` is positive on `(0, +∞)`. -/
@@ -61,7 +61,7 @@ theorem nonneg (x : ℝ) : 0 ≤ expNegInvGlue x := by
| inr h => exact le_of_lt (pos_of_pos h)
#align exp_neg_inv_glue.nonneg expNegInvGlue.nonneg
--- porting note: new lemma
+-- Porting note: new lemma
@[simp] theorem zero_iff_nonpos {x : ℝ} : expNegInvGlue x = 0 ↔ x ≤ 0 :=
⟨fun h ↦ not_lt.mp fun h' ↦ (pos_of_pos h').ne' h, zero_of_nonpos⟩
@@ -164,7 +164,7 @@ theorem one_of_one_le (h : 1 ≤ x) : smoothTransition x = 1 :=
(div_eq_one_iff_eq <| (pos_denom x).ne').2 <| by rw [zero_of_nonpos (sub_nonpos.2 h), add_zero]
#align real.smooth_transition.one_of_one_le Real.smoothTransition.one_of_one_le
-@[simp] -- porting note: new theorem
+@[simp] -- Porting note: new theorem
nonrec theorem zero_iff_nonpos : smoothTransition x = 0 ↔ x ≤ 0 := by
simp only [smoothTransition, _root_.div_eq_zero_iff, (pos_denom x).ne', zero_iff_nonpos, or_false]
Homogenises porting notes via capitalisation and addition of whitespace.
It makes the following changes:
@@ -25,7 +25,7 @@ open scoped Topology
variable (E : Type*) [NormedAddCommGroup E] [InnerProductSpace ℝ E]
--- porting note: this definition was hidden inside the next instance.
+-- Porting note: this definition was hidden inside the next instance.
/-- A base bump function in an inner product space. This construction works in any space with a
norm smooth away from zero but we do not have a typeclass for this. -/
noncomputable def ContDiffBumpBase.ofInnerProductSpace : ContDiffBumpBase E where
Homogenises porting notes via capitalisation and addition of whitespace.
It makes the following changes:
@@ -82,7 +82,7 @@ add more properties if they are useful and satisfied in the examples of inner pr
and finite dimensional vector spaces, notably derivative norm control in terms of `R - 1`.
TODO: do we ever need `f x = 1 ↔ ‖x‖ ≤ 1`? -/
--- porting note: was @[nolint has_nonempty_instance]
+-- Porting note: was @[nolint has_nonempty_instance]
structure ContDiffBumpBase (E : Type*) [NormedAddCommGroup E] [NormedSpace ℝ E] where
toFun : ℝ → E → ℝ
mem_Icc : ∀ (R : ℝ) (x : E), toFun R x ∈ Icc (0 : ℝ) 1
@@ -198,7 +198,7 @@ theorem eventuallyEq_one : f =ᶠ[𝓝 c] 1 :=
f.eventuallyEq_one_of_mem_ball (mem_ball_self f.rIn_pos)
#align cont_diff_bump.eventually_eq_one ContDiffBump.eventuallyEq_one
--- porting note: new lemma
+-- Porting note: new lemma
/-- `ContDiffBump` is `𝒞ⁿ` in all its arguments. -/
protected theorem _root_.ContDiffWithinAt.contDiffBump {c g : X → E} {s : Set X}
{f : ∀ x, ContDiffBump (c x)} {x : X} (hc : ContDiffWithinAt ℝ n c s x)
@@ -5,8 +5,6 @@ Authors: Sébastien Gouëzel, Yury Kudryashov
-/
import Mathlib.Analysis.Calculus.Deriv.Inv
import Mathlib.Analysis.Calculus.Deriv.Polynomial
-import Mathlib.Analysis.Calculus.FDeriv.Extend
-import Mathlib.Analysis.Calculus.IteratedDeriv.Defs
import Mathlib.Analysis.SpecialFunctions.ExpDeriv
import Mathlib.Analysis.SpecialFunctions.PolynomialExp
Mostly based on @CBirkbeck's work on modular forms.
@@ -6,7 +6,7 @@ Authors: Sébastien Gouëzel, Yury Kudryashov
import Mathlib.Analysis.Calculus.Deriv.Inv
import Mathlib.Analysis.Calculus.Deriv.Polynomial
import Mathlib.Analysis.Calculus.FDeriv.Extend
-import Mathlib.Analysis.Calculus.IteratedDeriv
+import Mathlib.Analysis.Calculus.IteratedDeriv.Defs
import Mathlib.Analysis.SpecialFunctions.ExpDeriv
import Mathlib.Analysis.SpecialFunctions.PolynomialExp
After this PR, no file in Geometry
uses autoImplicit, and in Analysis
it's scoped to six declarations.
@@ -25,8 +25,6 @@ cannot have:
by `expNegInvGlue x / (expNegInvGlue x + expNegInvGlue (1 - x))`;
-/
-set_option autoImplicit true
-
noncomputable section
open scoped Classical Topology
@@ -66,7 +64,7 @@ theorem nonneg (x : ℝ) : 0 ≤ expNegInvGlue x := by
#align exp_neg_inv_glue.nonneg expNegInvGlue.nonneg
-- porting note: new lemma
-@[simp] theorem zero_iff_nonpos : expNegInvGlue x = 0 ↔ x ≤ 0 :=
+@[simp] theorem zero_iff_nonpos {x : ℝ} : expNegInvGlue x = 0 ↔ x ≤ 0 :=
⟨fun h ↦ not_lt.mp fun h' ↦ (pos_of_pos h').ne' h, zero_of_nonpos⟩
/-!
This is the supremum of
along with some minor fixes from failures on nightly-testing as Mathlib master
is merged into it.
Note that some PRs for changes that are already compatible with the current toolchain and will be necessary have already been split out: #8380.
I am hopeful that in future we will be able to progressively merge adaptation PRs into a bump/v4.X.0
branch, so we never end up with a "big merge" like this. However one of these adaptation PRs (#8056) predates my new scheme for combined CI, and it wasn't possible to keep that PR viable in the meantime.
In particular this includes adjustments for the Lean PRs
We can get rid of all the
local macro_rules | `($x ^ $y) => `(HPow.hPow $x $y) -- Porting note: See issue [lean4#2220](https://github.com/leanprover/lean4/pull/2220)
macros across Mathlib (and in any projects that want to write natural number powers of reals).
Changes the default behaviour of simp
to (config := {decide := false})
. This makes simp
(and consequentially norm_num
) less powerful, but also more consistent, and less likely to blow up in long failures. This requires a variety of changes: changing some previously by simp
or norm_num
to decide
or rfl
, or adding (config := {decide := true})
.
This changed the behaviour of simp
so that simp [f]
will only unfold "fully applied" occurrences of f
. The old behaviour can be recovered with simp (config := { unfoldPartialApp := true })
. We may in future add a syntax for this, e.g. simp [!f]
; please provide feedback! In the meantime, we have made the following changes:
(config := { unfoldPartialApp := true })
in some places, to recover the old behaviour@[eqns]
to manually adjust the equation lemmas for a particular definition, recovering the old behaviour just for that definition. See #8371, where we do this for Function.comp
and Function.flip
.This change in Lean may require further changes down the line (e.g. adding the !f
syntax, and/or upstreaming the special treatment for Function.comp
and Function.flip
, and/or removing this special treatment). Please keep an open and skeptical mind about these changes!
Co-authored-by: leanprover-community-mathlib4-bot <leanprover-community-mathlib4-bot@users.noreply.github.com> Co-authored-by: Scott Morrison <scott.morrison@gmail.com> Co-authored-by: Eric Wieser <wieser.eric@gmail.com> Co-authored-by: Mauricio Collares <mauricio@collares.org>
@@ -27,7 +27,6 @@ cannot have:
set_option autoImplicit true
-local macro_rules | `($x ^ $y) => `(HPow.hPow $x $y) -- Porting note: See issue lean4#2220
noncomputable section
open scoped Classical Topology
This is the supremum of
along with some minor fixes from failures on nightly-testing as Mathlib master
is merged into it.
Note that some PRs for changes that are already compatible with the current toolchain and will be necessary have already been split out: #8380.
I am hopeful that in future we will be able to progressively merge adaptation PRs into a bump/v4.X.0
branch, so we never end up with a "big merge" like this. However one of these adaptation PRs (#8056) predates my new scheme for combined CI, and it wasn't possible to keep that PR viable in the meantime.
In particular this includes adjustments for the Lean PRs
We can get rid of all the
local macro_rules | `($x ^ $y) => `(HPow.hPow $x $y) -- Porting note: See issue [lean4#2220](https://github.com/leanprover/lean4/pull/2220)
macros across Mathlib (and in any projects that want to write natural number powers of reals).
Changes the default behaviour of simp
to (config := {decide := false})
. This makes simp
(and consequentially norm_num
) less powerful, but also more consistent, and less likely to blow up in long failures. This requires a variety of changes: changing some previously by simp
or norm_num
to decide
or rfl
, or adding (config := {decide := true})
.
This changed the behaviour of simp
so that simp [f]
will only unfold "fully applied" occurrences of f
. The old behaviour can be recovered with simp (config := { unfoldPartialApp := true })
. We may in future add a syntax for this, e.g. simp [!f]
; please provide feedback! In the meantime, we have made the following changes:
(config := { unfoldPartialApp := true })
in some places, to recover the old behaviour@[eqns]
to manually adjust the equation lemmas for a particular definition, recovering the old behaviour just for that definition. See #8371, where we do this for Function.comp
and Function.flip
.This change in Lean may require further changes down the line (e.g. adding the !f
syntax, and/or upstreaming the special treatment for Function.comp
and Function.flip
, and/or removing this special treatment). Please keep an open and skeptical mind about these changes!
Co-authored-by: leanprover-community-mathlib4-bot <leanprover-community-mathlib4-bot@users.noreply.github.com> Co-authored-by: Scott Morrison <scott.morrison@gmail.com> Co-authored-by: Eric Wieser <wieser.eric@gmail.com> Co-authored-by: Mauricio Collares <mauricio@collares.org>
@@ -132,8 +132,6 @@ theorem integral_le_measure_closedBall : ∫ x, f x ∂μ ≤ (μ (closedBall c
simp [measure_closedBall_lt_top]
_ = (μ (closedBall c f.rOut)).toReal := by simp
-local macro_rules | `($x ^ $y) => `(HPow.hPow $x $y) -- Porting note: See issue lean4#2220
-
theorem measure_closedBall_div_le_integral [IsAddHaarMeasure μ] (K : ℝ) (h : f.rOut ≤ K * f.rIn) :
(μ (closedBall c f.rOut)).toReal / K ^ finrank ℝ E ≤ ∫ x, f x ∂μ := by
have K_pos : 0 < K := by
@@ -3,7 +3,7 @@ Copyright (c) 2020 Sébastien Gouëzel. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Sébastien Gouëzel, Yury Kudryashov
-/
-import Mathlib.Analysis.Calculus.ContDiff
+import Mathlib.Analysis.Calculus.ContDiff.Basic
import Mathlib.Analysis.NormedSpace.FiniteDimension
#align_import analysis.calculus.bump_function_inner from "leanprover-community/mathlib"@"3bce8d800a6f2b8f63fe1e588fd76a9ff4adcebe"
This will improve spaces in the mathlib4 docs.
@@ -40,7 +40,7 @@ open scoped Polynomial
for `x ≤ 0`. It is a basic building block to construct smooth partitions of unity. Its main property
is that it vanishes for `x ≤ 0`, it is positive for `x > 0`, and the junction between the two
behaviors is flat enough to retain smoothness. The fact that this function is `C^∞` is proved in
-`expNegInvGlue.contDiff `. -/
+`expNegInvGlue.contDiff`. -/
def expNegInvGlue (x : ℝ) : ℝ :=
if x ≤ 0 then 0 else exp (-x⁻¹)
#align exp_neg_inv_glue expNegInvGlue
Autoimplicits are highly controversial and also defeat the performance-improving work in #6474.
The intent of this PR is to make autoImplicit
opt-in on a per-file basis, by disabling it in the lakefile and enabling it again with set_option autoImplicit true
in the few files that rely on it.
That also keeps this PR small, as opposed to attempting to "fix" files to not need it any more.
I claim that many of the uses of autoImplicit
in these files are accidental; situations such as:
variables
are in scope, but pasting the lemma in the wrong sectionHaving set_option autoImplicit false
as the default prevents these types of mistake being made in the 90% of files where autoImplicit
s are not used at all, and causes them to be caught by CI during review.
I think there were various points during the port where we encouraged porters to delete the universes u v
lines; I think having autoparams for universe variables only would cover a lot of the cases we actually use them, while avoiding any real shortcomings.
A Zulip poll (after combining overlapping votes accordingly) was in favor of this change with 5:5:18
as the no:dontcare:yes
vote ratio.
While this PR was being reviewed, a handful of files gained some more likely-accidental autoImplicits. In these places, set_option autoImplicit true
has been placed locally within a section, rather than at the top of the file.
@@ -25,6 +25,8 @@ cannot have:
by `expNegInvGlue x / (expNegInvGlue x + expNegInvGlue (1 - x))`;
-/
+set_option autoImplicit true
+
local macro_rules | `($x ^ $y) => `(HPow.hPow $x $y) -- Porting note: See issue lean4#2220
noncomputable section
@@ -231,4 +233,3 @@ protected theorem continuousAt : ContinuousAt smoothTransition x :=
end smoothTransition
end Real
-
Type _
and Sort _
(#6499)
We remove all possible occurences of Type _
and Sort _
in favor of Type*
and Sort*
.
This has nice performance benefits.
@@ -23,7 +23,7 @@ open scoped Topology
namespace ContDiffBump
-variable {E : Type _} [NormedAddCommGroup E] [NormedSpace ℝ E] [HasContDiffBump E]
+variable {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [HasContDiffBump E]
[MeasurableSpace E] {c : E} (f : ContDiffBump c) {x : E} {n : ℕ∞} {μ : Measure E}
/-- A bump function normed so that `∫ x, f.normed μ x ∂μ = 1`. -/
Type _
and Sort _
(#6499)
We remove all possible occurences of Type _
and Sort _
in favor of Type*
and Sort*
.
This has nice performance benefits.
@@ -23,7 +23,7 @@ smooth function, bump function, inner product space
open Function Real
open scoped Topology
-variable (E : Type _) [NormedAddCommGroup E] [InnerProductSpace ℝ E]
+variable (E : Type*) [NormedAddCommGroup E] [InnerProductSpace ℝ E]
-- porting note: this definition was hidden inside the next instance.
/-- A base bump function in an inner product space. This construction works in any space with a
Type _
and Sort _
(#6499)
We remove all possible occurences of Type _
and Sort _
in favor of Type*
and Sort*
.
This has nice performance benefits.
@@ -37,10 +37,10 @@ such that
- `ContDiffBump (c : E)`: a structure holding data needed to construct
an infinitely smooth bump function.
-- `ContDiffBumpBase (E : Type _)`: a family of infinitely smooth bump functions
+- `ContDiffBumpBase (E : Type*)`: a family of infinitely smooth bump functions
that can be used to construct coercion of a `ContDiffBump (c : E)`
to a function.
-- `HasContDiffBump (E : Type _)`: a typeclass saying that `E` has a `ContDiffBumpBase`.
+- `HasContDiffBump (E : Type*)`: a typeclass saying that `E` has a `ContDiffBumpBase`.
Two instances of this typeclass (for inner product spaces and for finite dimensional spaces)
are provided elsewhere.
@@ -53,7 +53,7 @@ noncomputable section
open Function Set Filter
open scoped Topology Filter
-variable {E X : Type _}
+variable {E X : Type*}
/-- `f : ContDiffBump c`, where `c` is a point in a normed vector space, is a
bundled smooth function such that
@@ -83,7 +83,7 @@ and finite dimensional vector spaces, notably derivative norm control in terms o
TODO: do we ever need `f x = 1 ↔ ‖x‖ ≤ 1`? -/
-- porting note: was @[nolint has_nonempty_instance]
-structure ContDiffBumpBase (E : Type _) [NormedAddCommGroup E] [NormedSpace ℝ E] where
+structure ContDiffBumpBase (E : Type*) [NormedAddCommGroup E] [NormedSpace ℝ E] where
toFun : ℝ → E → ℝ
mem_Icc : ∀ (R : ℝ) (x : E), toFun R x ∈ Icc (0 : ℝ) 1
symmetric : ∀ (R : ℝ) (x : E), toFun R (-x) = toFun R x
@@ -95,13 +95,13 @@ structure ContDiffBumpBase (E : Type _) [NormedAddCommGroup E] [NormedSpace ℝ
/-- A class registering that a real vector space admits bump functions. This will be instantiated
first for inner product spaces, and then for finite-dimensional normed spaces.
We use a specific class instead of `Nonempty (ContDiffBumpBase E)` for performance reasons. -/
-class HasContDiffBump (E : Type _) [NormedAddCommGroup E] [NormedSpace ℝ E] : Prop where
+class HasContDiffBump (E : Type*) [NormedAddCommGroup E] [NormedSpace ℝ E] : Prop where
out : Nonempty (ContDiffBumpBase E)
#align has_cont_diff_bump HasContDiffBump
/-- In a space with `C^∞` bump functions, register some function that will be used as a basis
to construct bump functions of arbitrary size around any point. -/
-def someContDiffBumpBase (E : Type _) [NormedAddCommGroup E] [NormedSpace ℝ E]
+def someContDiffBumpBase (E : Type*) [NormedAddCommGroup E] [NormedSpace ℝ E]
[hb : HasContDiffBump E] : ContDiffBumpBase E :=
Nonempty.some hb.out
#align some_cont_diff_bump_base someContDiffBumpBase
@@ -25,7 +25,7 @@ cannot have:
by `expNegInvGlue x / (expNegInvGlue x + expNegInvGlue (1 - x))`;
-/
-local macro_rules | `($x ^ $y) => `(HPow.hPow $x $y) -- Porting note: See issue #2220
+local macro_rules | `($x ^ $y) => `(HPow.hPow $x $y) -- Porting note: See issue lean4#2220
noncomputable section
open scoped Classical Topology
@@ -132,7 +132,7 @@ theorem integral_le_measure_closedBall : ∫ x, f x ∂μ ≤ (μ (closedBall c
simp [measure_closedBall_lt_top]
_ = (μ (closedBall c f.rOut)).toReal := by simp
-local macro_rules | `($x ^ $y) => `(HPow.hPow $x $y) -- Porting note: See Lean 4 issue #2220
+local macro_rules | `($x ^ $y) => `(HPow.hPow $x $y) -- Porting note: See issue lean4#2220
theorem measure_closedBall_div_le_integral [IsAddHaarMeasure μ] (K : ℝ) (h : f.rOut ≤ K * f.rIn) :
(μ (closedBall c f.rOut)).toReal / K ^ finrank ℝ E ≤ ∫ x, f x ∂μ := by
@@ -5,6 +5,7 @@ Authors: Floris van Doorn
-/
import Mathlib.Analysis.Calculus.BumpFunction.Basic
import Mathlib.MeasureTheory.Integral.SetIntegral
+import Mathlib.MeasureTheory.Measure.Lebesgue.EqHaar
#align_import analysis.calculus.bump_function_inner from "leanprover-community/mathlib"@"3bce8d800a6f2b8f63fe1e588fd76a9ff4adcebe"
@@ -17,7 +18,7 @@ In this file we define `ContDiffBump.normed f μ` to be the bump function `f` no
noncomputable section
-open Function Filter Set Metric MeasureTheory
+open Function Filter Set Metric MeasureTheory FiniteDimensional Measure
open scoped Topology
namespace ContDiffBump
@@ -107,4 +108,58 @@ theorem integral_normed_smul {X} [NormedAddCommGroup X] [NormedSpace ℝ X]
simp_rw [integral_smul_const, f.integral_normed (μ := μ), one_smul]
#align cont_diff_bump.integral_normed_smul ContDiffBump.integral_normed_smul
+theorem measure_closedBall_le_integral : (μ (closedBall c f.rIn)).toReal ≤ ∫ x, f x ∂μ := by calc
+ (μ (closedBall c f.rIn)).toReal = ∫ x in closedBall c f.rIn, 1 ∂μ := by simp
+ _ = ∫ x in closedBall c f.rIn, f x ∂μ := set_integral_congr (measurableSet_closedBall)
+ (fun x hx ↦ (one_of_mem_closedBall f hx).symm)
+ _ ≤ ∫ x, f x ∂μ := set_integral_le_integral f.integrable (eventually_of_forall (fun x ↦ f.nonneg))
+
+theorem normed_le_div_measure_closedBall_rIn (x : E) :
+ f.normed μ x ≤ 1 / (μ (closedBall c f.rIn)).toReal := by
+ rw [normed_def]
+ gcongr
+ · exact ENNReal.toReal_pos (measure_closedBall_pos _ _ f.rIn_pos).ne' measure_closedBall_lt_top.ne
+ · exact f.le_one
+ · exact f.measure_closedBall_le_integral μ
+
+theorem integral_le_measure_closedBall : ∫ x, f x ∂μ ≤ (μ (closedBall c f.rOut)).toReal := by calc
+ ∫ x, f x ∂μ = ∫ x in closedBall c f.rOut, f x ∂μ := by
+ apply (set_integral_eq_integral_of_forall_compl_eq_zero (fun x hx ↦ ?_)).symm
+ apply f.zero_of_le_dist (le_of_lt _)
+ simpa using hx
+ _ ≤ ∫ x in closedBall c f.rOut, 1 ∂μ := by
+ apply set_integral_mono f.integrable.integrableOn _ (fun x ↦ f.le_one)
+ simp [measure_closedBall_lt_top]
+ _ = (μ (closedBall c f.rOut)).toReal := by simp
+
+local macro_rules | `($x ^ $y) => `(HPow.hPow $x $y) -- Porting note: See Lean 4 issue #2220
+
+theorem measure_closedBall_div_le_integral [IsAddHaarMeasure μ] (K : ℝ) (h : f.rOut ≤ K * f.rIn) :
+ (μ (closedBall c f.rOut)).toReal / K ^ finrank ℝ E ≤ ∫ x, f x ∂μ := by
+ have K_pos : 0 < K := by
+ simpa [f.rIn_pos, not_lt.2 f.rIn_pos.le] using mul_pos_iff.1 (f.rOut_pos.trans_le h)
+ apply le_trans _ (f.measure_closedBall_le_integral μ)
+ rw [div_le_iff (pow_pos K_pos _), addHaar_closedBall' _ _ f.rIn_pos.le,
+ addHaar_closedBall' _ _ f.rOut_pos.le, ENNReal.toReal_mul, ENNReal.toReal_mul,
+ ENNReal.toReal_ofReal (pow_nonneg f.rOut_pos.le _),
+ ENNReal.toReal_ofReal (pow_nonneg f.rIn_pos.le _), mul_assoc, mul_comm _ (K ^ _), ← mul_assoc,
+ ← mul_pow, mul_comm _ K]
+ gcongr
+ exact f.rOut_pos.le
+
+theorem normed_le_div_measure_closedBall_rOut [IsAddHaarMeasure μ] (K : ℝ) (h : f.rOut ≤ K * f.rIn)
+ (x : E) :
+ f.normed μ x ≤ K ^ finrank ℝ E / (μ (closedBall c f.rOut)).toReal := by
+ have K_pos : 0 < K := by
+ simpa [f.rIn_pos, not_lt.2 f.rIn_pos.le] using mul_pos_iff.1 (f.rOut_pos.trans_le h)
+ have : f x / ∫ y, f y ∂μ ≤ 1 / ∫ y, f y ∂μ := by
+ gcongr
+ · exact f.integral_pos.le
+ · exact f.le_one
+ apply this.trans
+ rw [div_le_div_iff f.integral_pos, one_mul, ← div_le_iff' (pow_pos K_pos _)]
+ · exact f.measure_closedBall_div_le_integral μ K h
+ · exact ENNReal.toReal_pos (measure_closedBall_pos _ _ f.rOut_pos).ne'
+ measure_closedBall_lt_top.ne
+
end ContDiffBump
@@ -5,7 +5,7 @@ Authors: Sébastien Gouëzel, Yury Kudryashov
-/
import Mathlib.Analysis.Calculus.Deriv.Inv
import Mathlib.Analysis.Calculus.Deriv.Polynomial
-import Mathlib.Analysis.Calculus.ExtendDeriv
+import Mathlib.Analysis.Calculus.FDeriv.Extend
import Mathlib.Analysis.Calculus.IteratedDeriv
import Mathlib.Analysis.SpecialFunctions.ExpDeriv
import Mathlib.Analysis.SpecialFunctions.PolynomialExp
Analysis.Calculus.LocalExtr
(#5944)
Also make f
/f'
arguments implicit in all versions of Rolle's Theorem.
Fixes #4830
exists_Ioo_extr_on_Icc
:
f : ℝ → ℝ
to functions from a conditionally complete linear order
to a linear order.f
implicit;exists_local_extr_Ioo
:
exists_isLocalExtr_Ioo
;f
implicit;exists_isExtrOn_Ioo_of_tendsto
, exists_isLocalExtr_Ioo_of_tendsto
:
new lemmas extracted from the proof of exists_hasDerivAt_eq_zero'
;exists_hasDerivAt_eq_zero
, exists_hasDerivAt_eq_zero'
:
make f
and f'
implicit;exists_deriv_eq_zero
, exists_deriv_eq_zero'
:
make f
implicit.@@ -4,6 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Sébastien Gouëzel, Yury Kudryashov
-/
import Mathlib.Analysis.Calculus.Deriv.Inv
+import Mathlib.Analysis.Calculus.Deriv.Polynomial
import Mathlib.Analysis.Calculus.ExtendDeriv
import Mathlib.Analysis.Calculus.IteratedDeriv
import Mathlib.Analysis.SpecialFunctions.ExpDeriv
@@ -2,11 +2,6 @@
Copyright (c) 2020 Sébastien Gouëzel. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Sébastien Gouëzel, Yury Kudryashov
-
-! This file was ported from Lean 3 source module analysis.calculus.bump_function_inner
-! leanprover-community/mathlib commit 3bce8d800a6f2b8f63fe1e588fd76a9ff4adcebe
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathlib.Analysis.Calculus.Deriv.Inv
import Mathlib.Analysis.Calculus.ExtendDeriv
@@ -14,6 +9,8 @@ import Mathlib.Analysis.Calculus.IteratedDeriv
import Mathlib.Analysis.SpecialFunctions.ExpDeriv
import Mathlib.Analysis.SpecialFunctions.PolynomialExp
+#align_import analysis.calculus.bump_function_inner from "leanprover-community/mathlib"@"3bce8d800a6f2b8f63fe1e588fd76a9ff4adcebe"
+
/-!
# Infinitely smooth transition function
@@ -2,15 +2,12 @@
Copyright (c) 2022 Floris van Doorn. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Floris van Doorn
-
-! This file was ported from Lean 3 source module analysis.calculus.bump_function_inner
-! leanprover-community/mathlib commit 3bce8d800a6f2b8f63fe1e588fd76a9ff4adcebe
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathlib.Analysis.Calculus.BumpFunction.Basic
import Mathlib.MeasureTheory.Integral.SetIntegral
+#align_import analysis.calculus.bump_function_inner from "leanprover-community/mathlib"@"3bce8d800a6f2b8f63fe1e588fd76a9ff4adcebe"
+
/-!
# Normed bump function
@@ -2,15 +2,13 @@
Copyright (c) 2020 Sébastien Gouëzel. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Sébastien Gouëzel, Yury Kudryashov
-
-! This file was ported from Lean 3 source module analysis.calculus.bump_function_inner
-! leanprover-community/mathlib commit 3bce8d800a6f2b8f63fe1e588fd76a9ff4adcebe
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathlib.Analysis.Calculus.BumpFunction.Basic
import Mathlib.Analysis.InnerProductSpace.Calculus
import Mathlib.Analysis.SpecialFunctions.SmoothTransition
+
+#align_import analysis.calculus.bump_function_inner from "leanprover-community/mathlib"@"3bce8d800a6f2b8f63fe1e588fd76a9ff4adcebe"
+
/-!
# Smooth bump functions in inner product spaces
@@ -2,15 +2,12 @@
Copyright (c) 2020 Sébastien Gouëzel. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Sébastien Gouëzel, Yury Kudryashov
-
-! This file was ported from Lean 3 source module analysis.calculus.bump_function_inner
-! leanprover-community/mathlib commit 3bce8d800a6f2b8f63fe1e588fd76a9ff4adcebe
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathlib.Analysis.Calculus.ContDiff
import Mathlib.Analysis.NormedSpace.FiniteDimension
+#align_import analysis.calculus.bump_function_inner from "leanprover-community/mathlib"@"3bce8d800a6f2b8f63fe1e588fd76a9ff4adcebe"
+
/-!
# Infinitely smooth "bump" functions
@@ -527,7 +527,7 @@ theorem integral_pos : 0 < ∫ x, f x ∂μ := by
exact measure_ball_pos μ c f.rOut_pos
#align cont_diff_bump.integral_pos ContDiffBump.integral_pos
-theorem integral_normed : (∫ x, f.normed μ x ∂μ) = 1 := by
+theorem integral_normed : ∫ x, f.normed μ x ∂μ = 1 := by
simp_rw [ContDiffBump.normed, div_eq_mul_inv, mul_comm (f _), ← smul_eq_mul, integral_smul]
exact inv_mul_cancel f.integral_pos.ne'
#align cont_diff_bump.integral_normed ContDiffBump.integral_normed
@@ -558,7 +558,7 @@ theorem tendsto_support_normed_smallSets {ι} {φ : ι → ContDiffBump c} {l :
variable (μ)
-theorem integral_normed_smul [CompleteSpace X] (z : X) : (∫ x, f.normed μ x • z ∂μ) = z := by
+theorem integral_normed_smul [CompleteSpace X] (z : X) : ∫ x, f.normed μ x • z ∂μ = z := by
simp_rw [integral_smul_const, f.integral_normed (μ := μ), one_smul]
#align cont_diff_bump.integral_normed_smul ContDiffBump.integral_normed_smul
The unported dependencies are
algebra.order.module
init.core
linear_algebra.free_module.finite.rank
algebra.order.monoid.cancel.defs
algebra.abs
algebra.group_power.lemmas
init.data.list.basic
linear_algebra.free_module.rank
algebra.order.monoid.cancel.basic
init.data.list.default
topology.subset_properties
init.logic
The following 1 dependencies have changed in mathlib3 since they were ported, which may complicate porting this file