Skip to content

Commit aff5c83

Browse files
committed
feat: continuity of parametric integrals with weaker assumptions (#8247)
The current version of continuity of parametric integrals assume a first countable topology, to apply the dominated convergence theorem. When one deals with continuous compactly supported functions, this is not necessary, and a direct elementary approach makes it possible to remove the first countable assumption.
1 parent 4a70d87 commit aff5c83

File tree

2 files changed

+149
-119
lines changed

2 files changed

+149
-119
lines changed

Mathlib/Analysis/Convolution.lean

Lines changed: 60 additions & 119 deletions
Original file line numberDiff line numberDiff line change
@@ -433,7 +433,7 @@ end CommGroup
433433

434434
end ConvolutionExists
435435

436-
variable [NormedSpace ℝ F] [CompleteSpace F]
436+
variable [NormedSpace ℝ F]
437437

438438
/-- The convolution of two functions `f` and `g` with respect to a continuous bilinear map `L` and
439439
measure `μ`. It is defined to be `(f ⋆[L, μ] g) x = ∫ t, L (f t) (g (x - t)) ∂μ`. -/
@@ -443,13 +443,16 @@ noncomputable def convolution [Sub G] (f : G → E) (g : G → E') (L : E →L[
443443
#align convolution convolution
444444

445445
-- mathport name: convolution
446+
/-- The convolution of two functions with respect to a bilinear operation `L` and a measure `μ`. -/
446447
scoped[Convolution] notation:67 f " ⋆[" L:67 ", " μ:67 "] " g:66 => convolution f g L μ
447448

448449
-- mathport name: convolution.volume
450+
/-- The convolution of two functions with respect to a bilinear operation `L` and the volume. -/
449451
scoped[Convolution]
450452
notation:67 f " ⋆[" L:67 "]" g:66 => convolution f g L MeasureTheory.MeasureSpace.volume
451453

452454
-- mathport name: convolution.lsmul
455+
/-- The convolution of two real-valued functions with respect to volume. -/
453456
scoped[Convolution]
454457
notation:67 f " ⋆ " g:66 =>
455458
convolution f g (ContinuousLinearMap.lsmul ℝ ℝ) MeasureTheory.MeasureSpace.volume
@@ -590,136 +593,73 @@ protected theorem HasCompactSupport.convolution [T2Space G] (hcf : HasCompactSup
590593
(hcg.isCompact.add hcf).isClosed
591594
#align has_compact_support.convolution HasCompactSupport.convolution
592595

593-
variable [BorelSpace G] [FirstCountableTopology G] [TopologicalSpace P] [FirstCountableTopology P]
596+
variable [BorelSpace G] [TopologicalSpace P]
594597

595598
/-- The convolution `f * g` is continuous if `f` is locally integrable and `g` is continuous and
596599
compactly supported. Version where `g` depends on an additional parameter in a subset `s` of
597-
a parameter space `P` (and the compact support `k` is independent of the parameter in `s`),
598-
not assuming `T2Space G`. -/
599-
theorem continuousOn_convolution_right_with_param' {g : P → G → E'} {s : Set P} {k : Set G}
600-
(hk : IsCompact k) (h'k : IsClosed k) (hgs : ∀ p, ∀ x, p ∈ s → x ∉ k → g p x = 0)
600+
a parameter space `P` (and the compact support `k` is independent of the parameter in `s`). -/
601+
theorem continuousOn_convolution_right_with_param {g : P → G → E'} {s : Set P} {k : Set G}
602+
(hk : IsCompact k) (hgs : ∀ p, ∀ x, p ∈ s → x ∉ k → g p x = 0)
601603
(hf : LocallyIntegrable f μ) (hg : ContinuousOn (↿g) (s ×ˢ univ)) :
602604
ContinuousOn (fun q : P × G => (f ⋆[L, μ] g q.1) q.2) (s ×ˢ univ) := by
603-
intro q₀ hq₀
604-
replace hq₀ : q₀.1 ∈ s; · simpa only [mem_prod, mem_univ, and_true] using hq₀
605-
have A : ∀ p ∈ s, Continuous (g p) := fun p hp ↦ by
606-
refine hg.comp_continuous (continuous_const.prod_mk continuous_id') fun x => ?_
607-
simpa only [prod_mk_mem_set_prod_eq, mem_univ, and_true] using hp
608-
have B : ∀ p ∈ s, tsupport (g p) ⊆ k := fun p hp =>
609-
closure_minimal (support_subset_iff'.2 fun z hz => hgs _ _ hp hz) h'k
610-
/- We find a small neighborhood of `{q₀.1} × k` on which the function is uniformly bounded.
611-
This follows from the continuity at all points of the compact set `k`. -/
612-
obtain ⟨w, C, w_open, q₀w, hw⟩ :
613-
∃ w C, IsOpen w ∧ q₀.1 ∈ w ∧ ∀ p x, p ∈ w ∩ s → ‖g p x‖ ≤ C := by
614-
have A : IsCompact ({q₀.1} ×ˢ k) := isCompact_singleton.prod hk
615-
obtain ⟨t, kt, t_open, ht⟩ :
616-
∃ t, {q₀.1} ×ˢ k ⊆ t ∧ IsOpen t ∧ IsBounded (↿g '' (t ∩ s ×ˢ univ)) := by
617-
apply exists_isOpen_isBounded_image_inter_of_isCompact_of_continuousOn A _ hg
618-
simp only [prod_subset_prod_iff, hq₀, singleton_subset_iff, subset_univ, and_self_iff,
619-
true_or_iff]
620-
obtain ⟨C, Cpos, hC⟩ : ∃ C, 0 < C ∧ ↿g '' (t ∩ s ×ˢ univ) ⊆ closedBall (0 : E') C :=
621-
ht.subset_closedBall_lt 0 0
622-
obtain ⟨w, w_open, q₀w, hw⟩ : ∃ w, IsOpen w ∧ q₀.1 ∈ w ∧ w ×ˢ k ⊆ t
623-
· obtain ⟨w, v, w_open, -, hw, hv, hvw⟩ :
624-
∃ (w : Set P) (v : Set G), IsOpen w ∧ IsOpen v ∧ {q₀.fst} ⊆ w ∧ k ⊆ v ∧ w ×ˢ v ⊆ t
625-
exact generalized_tube_lemma isCompact_singleton hk t_open kt
626-
exact ⟨w, w_open, singleton_subset_iff.1 hw, Subset.trans (Set.prod_mono Subset.rfl hv) hvw⟩
627-
refine' ⟨w, C, w_open, q₀w, _⟩
628-
rintro p x ⟨hp, hps⟩
629-
by_cases hx : x ∈ k
630-
· have H : (p, x) ∈ t := by
631-
apply hw
632-
simp only [prod_mk_mem_set_prod_eq, hp, hx, and_true_iff]
633-
have H' : (p, x) ∈ (s ×ˢ univ : Set (P × G)) := by
634-
simpa only [prod_mk_mem_set_prod_eq, mem_univ, and_true_iff] using hps
635-
have : g p x ∈ closedBall (0 : E') C := hC (mem_image_of_mem _ (mem_inter H H'))
636-
rwa [mem_closedBall_zero_iff] at this
637-
· have : g p x = 0 := hgs _ _ hps hx
638-
rw [this]
639-
simpa only [norm_zero] using Cpos.le
640-
have I1 :
641-
∀ᶠ q : P × G in 𝓝[s ×ˢ univ] q₀,
642-
AEStronglyMeasurable (fun a : G => L (f a) (g q.1 (q.2 - a))) μ := by
643-
filter_upwards [self_mem_nhdsWithin]
605+
/- First get rid of the case where the space is not locally compact. Then `g` vanishes everywhere
606+
and the conclusion is trivial. -/
607+
by_cases H : ∀ p ∈ s, ∀ x, g p x = 0
608+
· apply (continuousOn_const (c := 0)).congr
644609
rintro ⟨p, x⟩ ⟨hp, -⟩
645-
refine' (HasCompactSupport.convolutionExists_right L _ hf (A _ hp) _).1
646-
exact hk.of_isClosed_subset (isClosed_tsupport _) (B p hp)
647-
let K' := -k + {q₀.2}
648-
have hK' : IsCompact K' := hk.neg.add isCompact_singleton
649-
obtain ⟨U, U_open, K'U, hU⟩ : ∃ U, IsOpen U ∧ K' ⊆ U ∧ IntegrableOn f U μ :=
650-
hf.integrableOn_nhds_isCompact hK'
651-
let bound : G → ℝ := indicator U fun a => ‖L‖ * ‖f a‖ * C
652-
have I2 : ∀ᶠ q : P × G in 𝓝[s ×ˢ univ] q₀, ∀ᵐ a ∂μ, ‖L (f a) (g q.1 (q.2 - a))‖ ≤ bound a := by
653-
obtain ⟨V, V_mem, hV⟩ : ∃ V ∈ 𝓝 (0 : G), K' + V ⊆ U :=
654-
compact_open_separated_add_right hK' U_open K'U
655-
have : ((w ∩ s) ×ˢ ({q₀.2} + V) : Set (P × G)) ∈ 𝓝[s ×ˢ univ] q₀ := by
656-
conv_rhs => rw [nhdsWithin_prod_eq, nhdsWithin_univ]
657-
refine' Filter.prod_mem_prod _ (singleton_add_mem_nhds_of_nhds_zero q₀.2 V_mem)
658-
exact mem_nhdsWithin_iff_exists_mem_nhds_inter.2 ⟨w, w_open.mem_nhds q₀w, Subset.rfl⟩
659-
filter_upwards [this]
660-
rintro ⟨p, x⟩ hpx
661-
simp only [prod_mk_mem_set_prod_eq] at hpx
662-
refine eventually_of_forall fun a => ?_
663-
apply convolution_integrand_bound_right_of_le_of_subset _ _ hpx.2 _
664-
· intro x
665-
exact hw _ _ hpx.1
666-
· rw [← add_assoc]
667-
apply Subset.trans (add_subset_add_right (add_subset_add_right _)) hV
668-
rw [neg_subset_neg]
669-
exact B p hpx.1.2
670-
have I3 : Integrable bound μ := by
671-
rw [integrable_indicator_iff U_open.measurableSet]
672-
exact (hU.norm.const_mul _).mul_const _
673-
have I4 : ∀ᵐ a : G ∂μ,
674-
ContinuousWithinAt (fun q : P × G => L (f a) (g q.1 (q.2 - a))) (s ×ˢ univ) q₀ := by
675-
refine eventually_of_forall fun a => ?_
676-
suffices H : ContinuousWithinAt (fun q : P × G => (f a, g q.1 (q.2 - a))) (s ×ˢ univ) q₀
677-
exact L.continuous₂.continuousAt.comp_continuousWithinAt H
678-
apply continuousWithinAt_const.prod
679-
change ContinuousWithinAt (fun q : P × G => (↿g) (q.1, q.2 - a)) (s ×ˢ univ) q₀
680-
have : ContinuousAt (fun q : P × G => (q.1, q.2 - a)) (q₀.1, q₀.2) :=
681-
(continuous_fst.prod_mk (continuous_snd.sub continuous_const)).continuousAt
682-
have h'q₀ : (q₀.1, q₀.2 - a) ∈ (s ×ˢ univ : Set (P × G)) := ⟨hq₀, mem_univ _⟩
683-
refine' ContinuousWithinAt.comp (hg _ h'q₀) this.continuousWithinAt _
684-
rintro ⟨q, x⟩ ⟨hq, -⟩
685-
exact ⟨hq, mem_univ _⟩
686-
exact continuousWithinAt_of_dominated I1 I2 I3 I4
687-
#align continuous_on_convolution_right_with_param' continuousOn_convolution_right_with_param'
688-
689-
/-- The convolution `f * g` is continuous if `f` is locally integrable and `g` is continuous and
690-
compactly supported. Version where `g` depends on an additional parameter in a subset `s` of
691-
a parameter space `P` (and the compact support `k` is independent of the parameter in `s`). -/
692-
theorem continuousOn_convolution_right_with_param [T2Space G] {g : P → G → E'} {s : Set P}
693-
{k : Set G} (hk : IsCompact k) (hgs : ∀ p, ∀ x, p ∈ s → x ∉ k → g p x = 0)
694-
(hf : LocallyIntegrable f μ) (hg : ContinuousOn (↿g) (s ×ˢ univ)) :
695-
ContinuousOn (fun q : P × G => (f ⋆[L, μ] g q.1) q.2) (s ×ˢ univ) :=
696-
continuousOn_convolution_right_with_param' L hk hk.isClosed hgs hf hg
610+
apply integral_eq_zero_of_ae (eventually_of_forall (fun y ↦ ?_))
611+
simp [H p hp _]
612+
have : LocallyCompactSpace G := by
613+
push_neg at H
614+
rcases H with ⟨p, hp, x, hx⟩
615+
have A : support (g p) ⊆ k := support_subset_iff'.2 (fun y hy ↦ hgs p y hp hy)
616+
have B : Continuous (g p) := by
617+
refine hg.comp_continuous (continuous_const.prod_mk continuous_id') fun x => ?_
618+
simpa only [prod_mk_mem_set_prod_eq, mem_univ, and_true] using hp
619+
rcases eq_zero_or_locallyCompactSpace_of_support_subset_isCompact_of_addGroup hk A B with H|H
620+
· simp [H] at hx
621+
· exact H
622+
/- Since `G` is locally compact, one may thicken `k` a little bit into a larger compact set
623+
`(-k) + t`, outside of which all functions that appear in the convolution vanish. Then we can
624+
apply a continuity statement for integrals depending on a parameter, with respect to
625+
locally integrable functions and compactly supported continuous functions. -/
626+
rintro ⟨q₀, x₀⟩ ⟨hq₀, -⟩
627+
obtain ⟨t, t_comp, ht⟩ : ∃ t, IsCompact t ∧ t ∈ 𝓝 x₀ := exists_compact_mem_nhds x₀
628+
let k' : Set G := (-k) +ᵥ t
629+
have k'_comp : IsCompact k' := IsCompact.vadd_set hk.neg t_comp
630+
let g' : (P × G) → G → E' := fun p x ↦ g p.1 (p.2 - x)
631+
let s' : Set (P × G) := s ×ˢ t
632+
have A : ContinuousOn g'.uncurry (s' ×ˢ univ) := by
633+
have : g'.uncurry = g.uncurry ∘ (fun w ↦ (w.1.1, w.1.2 - w.2)) := by ext y; rfl
634+
rw [this]
635+
refine hg.comp (continuous_fst.fst.prod_mk (continuous_fst.snd.sub
636+
continuous_snd)).continuousOn ?_
637+
simp (config := {contextual := true}) [MapsTo]
638+
have B : ContinuousOn (fun a ↦ ∫ x, L (f x) (g' a x) ∂μ) s' := by
639+
apply continuousOn_integral_bilinear_of_locally_integrable_of_compact_support L k'_comp A _
640+
(hf.integrableOn_isCompact k'_comp)
641+
rintro ⟨p, x⟩ y ⟨hp, hx⟩ hy
642+
apply hgs p _ hp
643+
contrapose! hy
644+
exact ⟨y - x, x, by simpa using hy, hx, by simp⟩
645+
apply ContinuousWithinAt.mono_of_mem (B (q₀, x₀) ⟨hq₀, mem_of_mem_nhds ht⟩)
646+
exact mem_nhdsWithin_prod_iff.2 ⟨s, self_mem_nhdsWithin, t, nhdsWithin_le_nhds ht, Subset.rfl⟩
647+
#align continuous_on_convolution_right_with_param' continuousOn_convolution_right_with_param
697648
#align continuous_on_convolution_right_with_param continuousOn_convolution_right_with_param
698649

699650
/-- The convolution `f * g` is continuous if `f` is locally integrable and `g` is continuous and
700651
compactly supported. Version where `g` depends on an additional parameter in an open subset `s` of
701652
a parameter space `P` (and the compact support `k` is independent of the parameter in `s`),
702-
given in terms of compositions with an additional continuous map.
703-
Version not assuming `T2Space G`. -/
704-
theorem continuousOn_convolution_right_with_param_comp' {s : Set P} {v : P → G}
705-
(hv : ContinuousOn v s) {g : P → G → E'} {k : Set G} (hk : IsCompact k) (h'k : IsClosed k)
653+
given in terms of compositions with an additional continuous map. -/
654+
theorem continuousOn_convolution_right_with_param_comp {s : Set P} {v : P → G}
655+
(hv : ContinuousOn v s) {g : P → G → E'} {k : Set G} (hk : IsCompact k)
706656
(hgs : ∀ p, ∀ x, p ∈ s → x ∉ k → g p x = 0) (hf : LocallyIntegrable f μ)
707657
(hg : ContinuousOn (↿g) (s ×ˢ univ)) : ContinuousOn (fun x => (f ⋆[L, μ] g x) (v x)) s := by
708658
apply
709-
(continuousOn_convolution_right_with_param' L hk h'k hgs hf hg).comp (continuousOn_id.prod hv)
659+
(continuousOn_convolution_right_with_param L hk hgs hf hg).comp (continuousOn_id.prod hv)
710660
intro x hx
711661
simp only [hx, prod_mk_mem_set_prod_eq, mem_univ, and_self_iff, id.def]
712-
#align continuous_on_convolution_right_with_param_comp' continuousOn_convolution_right_with_param_comp'
713-
714-
/-- The convolution `f * g` is continuous if `f` is locally integrable and `g` is continuous and
715-
compactly supported. Version where `g` depends on an additional parameter in an open subset `s` of
716-
a parameter space `P` (and the compact support `k` is independent of the parameter in `s`),
717-
given in terms of compositions with an additional continuous map. -/
718-
theorem continuousOn_convolution_right_with_param_comp [T2Space G] {s : Set P} {v : P → G}
719-
(hv : ContinuousOn v s) {g : P → G → E'} {k : Set G} (hk : IsCompact k)
720-
(hgs : ∀ p, ∀ x, p ∈ s → x ∉ k → g p x = 0) (hf : LocallyIntegrable f μ)
721-
(hg : ContinuousOn (↿g) (s ×ˢ univ)) : ContinuousOn (fun x => (f ⋆[L, μ] g x) (v x)) s :=
722-
continuousOn_convolution_right_with_param_comp' L hv hk hk.isClosed hgs hf hg
662+
#align continuous_on_convolution_right_with_param_comp' continuousOn_convolution_right_with_param_comp
723663
#align continuous_on_convolution_right_with_param_comp continuousOn_convolution_right_with_param_comp
724664

725665
/-- The convolution is continuous if one function is locally integrable and the other has compact
@@ -729,14 +669,15 @@ theorem HasCompactSupport.continuous_convolution_right (hcg : HasCompactSupport
729669
rw [continuous_iff_continuousOn_univ]
730670
let g' : G → G → E' := fun _ q => g q
731671
have : ContinuousOn (↿g') (univ ×ˢ univ) := (hg.comp continuous_snd).continuousOn
732-
exact continuousOn_convolution_right_with_param_comp' L
733-
(continuous_iff_continuousOn_univ.1 continuous_id) hcg (isClosed_tsupport _)
672+
exact continuousOn_convolution_right_with_param_comp L
673+
(continuous_iff_continuousOn_univ.1 continuous_id) hcg
734674
(fun p x _ hx => image_eq_zero_of_nmem_tsupport hx) hf this
735675
#align has_compact_support.continuous_convolution_right HasCompactSupport.continuous_convolution_right
736676

737677
/-- The convolution is continuous if one function is integrable and the other is bounded and
738678
continuous. -/
739-
theorem BddAbove.continuous_convolution_right_of_integrable [SecondCountableTopologyEither G E']
679+
theorem BddAbove.continuous_convolution_right_of_integrable
680+
[FirstCountableTopology G] [SecondCountableTopologyEither G E']
740681
(hbg : BddAbove (range fun x => ‖g x‖)) (hf : Integrable f μ) (hg : Continuous g) :
741682
Continuous (f ⋆[L, μ] g) := by
742683
refine' continuous_iff_continuousAt.mpr fun x₀ => _
@@ -815,7 +756,7 @@ variable [TopologicalAddGroup G]
815756

816757
variable [BorelSpace G]
817758

818-
theorem HasCompactSupport.continuous_convolution_left [FirstCountableTopology G]
759+
theorem HasCompactSupport.continuous_convolution_left
819760
(hcf : HasCompactSupport f) (hf : Continuous f) (hg : LocallyIntegrable g μ) :
820761
Continuous (f ⋆[L, μ] g) := by
821762
rw [← convolution_flip]

Mathlib/MeasureTheory/Integral/SetIntegral.lean

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1431,3 +1431,92 @@ theorem Integrable.simpleFunc_mul' (hm : m ≤ m0) (g : @SimpleFunc β m ℝ) (h
14311431
end MeasureTheory
14321432

14331433
end BilinearMap
1434+
1435+
section ParametricIntegral
1436+
1437+
variable {α β F G 𝕜 : Type*} [TopologicalSpace α] [TopologicalSpace β] [MeasurableSpace β]
1438+
[OpensMeasurableSpace β] {μ : Measure β} [NontriviallyNormedField 𝕜] [NormedSpace ℝ E]
1439+
[NormedAddCommGroup F] [NormedSpace 𝕜 F] [NormedAddCommGroup G] [NormedSpace 𝕜 G]
1440+
1441+
open Metric Function ContinuousLinearMap
1442+
1443+
/-- Consider a parameterized integral `a ↦ ∫ x, L (g x) (f a x)` where `L` is bilinear,
1444+
`g` is locally integrable and `f` is continuous and uniformly compactly supported. Then the
1445+
integral depends continuously on `a`. -/
1446+
lemma continuousOn_integral_bilinear_of_locally_integrable_of_compact_support
1447+
[NormedSpace 𝕜 E] (L : F →L[𝕜] G →L[𝕜] E)
1448+
{f : α → β → G} {s : Set α} {k : Set β} {g : β → F}
1449+
(hk : IsCompact k) (hf : ContinuousOn f.uncurry (s ×ˢ univ))
1450+
(hfs : ∀ p, ∀ x, p ∈ s → x ∉ k → f p x = 0) (hg : IntegrableOn g k μ) :
1451+
ContinuousOn (fun a ↦ ∫ x, L (g x) (f a x) ∂μ) s := by
1452+
have A : ∀ p ∈ s, Continuous (f p) := fun p hp ↦ by
1453+
refine hf.comp_continuous (continuous_const.prod_mk continuous_id') fun x => ?_
1454+
simpa only [prod_mk_mem_set_prod_eq, mem_univ, and_true] using hp
1455+
intro q hq
1456+
apply Metric.continuousWithinAt_iff'.2 (fun ε εpos ↦ ?_)
1457+
obtain ⟨δ, δpos, hδ⟩ : ∃ (δ : ℝ), 0 < δ ∧ ∫ x in k, ‖L‖ * ‖g x‖ * δ ∂μ < ε := by
1458+
simpa [integral_mul_right] using exists_pos_mul_lt εpos _
1459+
obtain ⟨v, v_mem, hv⟩ : ∃ v ∈ 𝓝[s] q, ∀ p ∈ v, ∀ x ∈ k, dist (f p x) (f q x) < δ :=
1460+
hk.mem_uniformity_of_prod
1461+
(hf.mono (Set.prod_mono_right (subset_univ k))) hq (dist_mem_uniformity δpos)
1462+
simp_rw [dist_eq_norm] at hv ⊢
1463+
have I : ∀ p ∈ s, IntegrableOn (fun x ↦ L (g x) (f p x)) k μ := by
1464+
intro p hp
1465+
obtain ⟨C, hC⟩ : ∃ C, ∀ x, ‖f p x‖ ≤ C := by
1466+
have : ContinuousOn (f p) k := by
1467+
have : ContinuousOn (fun x ↦ (p, x)) k := (Continuous.Prod.mk p).continuousOn
1468+
exact hf.comp this (by simp [MapsTo, hp])
1469+
rcases IsCompact.exists_bound_of_continuousOn hk this with ⟨C, hC⟩
1470+
refine ⟨max C 0, fun x ↦ ?_⟩
1471+
by_cases hx : x ∈ k
1472+
· exact (hC x hx).trans (le_max_left _ _)
1473+
· simp [hfs p x hp hx]
1474+
have : IntegrableOn (fun x ↦ ‖L‖ * ‖g x‖ * C) k μ :=
1475+
(hg.norm.const_mul _).mul_const _
1476+
apply Integrable.mono' this ?_ ?_
1477+
· borelize G
1478+
apply L.aestronglyMeasurable_comp₂ hg.aestronglyMeasurable
1479+
apply StronglyMeasurable.aestronglyMeasurable
1480+
apply Continuous.stronglyMeasurable_of_support_subset_isCompact (A p hp) hk
1481+
apply support_subset_iff'.2 (fun x hx ↦ hfs p x hp hx)
1482+
· apply eventually_of_forall (fun x ↦ (le_op_norm₂ L (g x) (f p x)).trans ?_)
1483+
gcongr
1484+
apply hC
1485+
filter_upwards [v_mem, self_mem_nhdsWithin] with p hp h'p
1486+
calc
1487+
‖∫ x, L (g x) (f p x) ∂μ - ∫ x, L (g x) (f q x) ∂μ‖
1488+
= ‖∫ x in k, L (g x) (f p x) ∂μ - ∫ x in k, L (g x) (f q x) ∂μ‖ := by
1489+
congr 2
1490+
· refine (set_integral_eq_integral_of_forall_compl_eq_zero (fun x hx ↦ ?_)).symm
1491+
simp [hfs p x h'p hx]
1492+
· refine (set_integral_eq_integral_of_forall_compl_eq_zero (fun x hx ↦ ?_)).symm
1493+
simp [hfs q x hq hx]
1494+
_ = ‖∫ x in k, L (g x) (f p x) - L (g x) (f q x) ∂μ‖ := by rw [integral_sub (I p h'p) (I q hq)]
1495+
_ ≤ ∫ x in k, ‖L (g x) (f p x) - L (g x) (f q x)‖ ∂μ := norm_integral_le_integral_norm _
1496+
_ ≤ ∫ x in k, ‖L‖ * ‖g x‖ * δ ∂μ := by
1497+
apply integral_mono_of_nonneg (eventually_of_forall (fun x ↦ by positivity))
1498+
· exact (hg.norm.const_mul _).mul_const _
1499+
· apply eventually_of_forall (fun x ↦ ?_)
1500+
by_cases hx : x ∈ k
1501+
· dsimp only
1502+
specialize hv p hp x hx
1503+
calc
1504+
‖L (g x) (f p x) - L (g x) (f q x)‖
1505+
= ‖L (g x) (f p x - f q x)‖ := by simp only [map_sub]
1506+
_ ≤ ‖L‖ * ‖g x‖ * ‖f p x - f q x‖ := le_op_norm₂ _ _ _
1507+
_ ≤ ‖L‖ * ‖g x‖ * δ := by gcongr
1508+
· simp only [hfs p x h'p hx, hfs q x hq hx, sub_self, norm_zero, mul_zero]
1509+
positivity
1510+
_ < ε := hδ
1511+
1512+
/-- Consider a parameterized integral `a ↦ ∫ x, f a x` where `f` is continuous and uniformly
1513+
compactly supported. Then the integral depends continuously on `a`. -/
1514+
lemma continuousOn_integral_of_compact_support
1515+
{f : α → β → E} {s : Set α} {k : Set β} [IsFiniteMeasureOnCompacts μ]
1516+
(hk : IsCompact k) (hf : ContinuousOn f.uncurry (s ×ˢ univ))
1517+
(hfs : ∀ p, ∀ x, p ∈ s → x ∉ k → f p x = 0) :
1518+
ContinuousOn (fun a ↦ ∫ x, f a x ∂μ) s := by
1519+
simpa using continuousOn_integral_bilinear_of_locally_integrable_of_compact_support (lsmul ℝ ℝ)
1520+
hk hf hfs (integrableOn_const.2 (Or.inr hk.measure_lt_top)) (μ := μ) (g := fun _ ↦ 1)
1521+
1522+
end ParametricIntegral

0 commit comments

Comments
 (0)