@@ -433,7 +433,7 @@ end CommGroup
433
433
434
434
end ConvolutionExists
435
435
436
- variable [NormedSpace ℝ F] [CompleteSpace F]
436
+ variable [NormedSpace ℝ F]
437
437
438
438
/-- The convolution of two functions `f` and `g` with respect to a continuous bilinear map `L` and
439
439
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[
443
443
#align convolution convolution
444
444
445
445
-- mathport name: convolution
446
+ /-- The convolution of two functions with respect to a bilinear operation `L` and a measure `μ`. -/
446
447
scoped [Convolution] notation :67 f " ⋆[" L:67 ", " μ:67 "] " g:66 => convolution f g L μ
447
448
448
449
-- mathport name: convolution.volume
450
+ /-- The convolution of two functions with respect to a bilinear operation `L` and the volume. -/
449
451
scoped [Convolution]
450
452
notation :67 f " ⋆[" L:67 "]" g:66 => convolution f g L MeasureTheory.MeasureSpace.volume
451
453
452
454
-- mathport name: convolution.lsmul
455
+ /-- The convolution of two real-valued functions with respect to volume. -/
453
456
scoped [Convolution]
454
457
notation :67 f " ⋆ " g:66 =>
455
458
convolution f g (ContinuousLinearMap.lsmul ℝ ℝ) MeasureTheory.MeasureSpace.volume
@@ -590,136 +593,73 @@ protected theorem HasCompactSupport.convolution [T2Space G] (hcf : HasCompactSup
590
593
(hcg.isCompact.add hcf).isClosed
591
594
#align has_compact_support.convolution HasCompactSupport.convolution
592
595
593
- variable [BorelSpace G] [FirstCountableTopology G] [ TopologicalSpace P] [FirstCountableTopology P]
596
+ variable [BorelSpace G] [TopologicalSpace P]
594
597
595
598
/-- The convolution `f * g` is continuous if `f` is locally integrable and `g` is continuous and
596
599
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 )
601
603
(hf : LocallyIntegrable f μ) (hg : ContinuousOn (↿g) (s ×ˢ univ)) :
602
604
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
644
609
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
697
648
#align continuous_on_convolution_right_with_param continuousOn_convolution_right_with_param
698
649
699
650
/-- The convolution `f * g` is continuous if `f` is locally integrable and `g` is continuous and
700
651
compactly supported. Version where `g` depends on an additional parameter in an open subset `s` of
701
652
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)
706
656
(hgs : ∀ p, ∀ x, p ∈ s → x ∉ k → g p x = 0 ) (hf : LocallyIntegrable f μ)
707
657
(hg : ContinuousOn (↿g) (s ×ˢ univ)) : ContinuousOn (fun x => (f ⋆[L, μ] g x) (v x)) s := by
708
658
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)
710
660
intro x hx
711
661
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
723
663
#align continuous_on_convolution_right_with_param_comp continuousOn_convolution_right_with_param_comp
724
664
725
665
/-- 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
729
669
rw [continuous_iff_continuousOn_univ]
730
670
let g' : G → G → E' := fun _ q => g q
731
671
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
734
674
(fun p x _ hx => image_eq_zero_of_nmem_tsupport hx) hf this
735
675
#align has_compact_support.continuous_convolution_right HasCompactSupport.continuous_convolution_right
736
676
737
677
/-- The convolution is continuous if one function is integrable and the other is bounded and
738
678
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']
740
681
(hbg : BddAbove (range fun x => ‖g x‖)) (hf : Integrable f μ) (hg : Continuous g) :
741
682
Continuous (f ⋆[L, μ] g) := by
742
683
refine' continuous_iff_continuousAt.mpr fun x₀ => _
@@ -815,7 +756,7 @@ variable [TopologicalAddGroup G]
815
756
816
757
variable [BorelSpace G]
817
758
818
- theorem HasCompactSupport.continuous_convolution_left [FirstCountableTopology G]
759
+ theorem HasCompactSupport.continuous_convolution_left
819
760
(hcf : HasCompactSupport f) (hf : Continuous f) (hg : LocallyIntegrable g μ) :
820
761
Continuous (f ⋆[L, μ] g) := by
821
762
rw [← convolution_flip]
0 commit comments