Skip to content

Commit 3a8f0ce

Browse files
committed
feat: Fourier transform as a continuous linear equiv on Schwartz space (#12144)
We define the Fourier transform on the Schwartz space, as a continuous linear equivalence. First, we define it as a continuous linear map (which amounts to showing that the Fourier transform of a Schwartz function is smooth, with explicit bounds for the successive derivatives in terms of various Schwartz seminorms). Then, we extend it to a continuous linear equivalence thanks to Fourier inversion.
1 parent 263eee7 commit 3a8f0ce

File tree

1 file changed

+97
-36
lines changed

1 file changed

+97
-36
lines changed

Mathlib/Analysis/Distribution/FourierSchwartz.lean

Lines changed: 97 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -5,45 +5,106 @@ Authors: Sébastien Gouëzel
55
-/
66
import Mathlib.Analysis.Distribution.SchwartzSpace
77
import Mathlib.Analysis.Fourier.FourierTransformDeriv
8+
import Mathlib.Analysis.Fourier.Inversion
89

910
/-!
1011
# Fourier transform on Schwartz functions
1112
12-
This file will construct the Fourier transform as a continuous linear map acting on Schwartz
13-
functions.
14-
15-
For now, it only contains the fact that the Fourier transform of a Schwartz function is
16-
differentiable, with an explicit derivative given by a Fourier transform. See
17-
`SchwartzMap.hasFDerivAt_fourier`.
13+
This file constructs the Fourier transform as a continuous linear map acting on Schwartz
14+
functions, in `fourierTransformCLM`. It is also given as a continuous linear equiv, in
15+
`fourierTransformCLE`.
1816
-/
1917

20-
open Real Complex TopologicalSpace SchwartzMap MeasureTheory MeasureTheory.Measure VectorFourier
21-
22-
noncomputable section
23-
24-
variable {D : Type*} [NormedAddCommGroup D] [NormedSpace ℝ D]
25-
{E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E]
26-
{V : Type*} [NormedAddCommGroup V] [NormedSpace ℂ V]
27-
(L : D →L[ℝ] E →L[ℝ] ℝ)
28-
29-
/-- Multiplication by a linear map on Schwartz space: for `f : D → V` a Schwartz function and `L` a
30-
bilinear map from `D × E` to `ℝ`, we define a new Schwartz function on `D` taking values in the
31-
space of linear maps from `E` to `V`, given by
32-
`(VectorFourier.fourierSMulRightSchwartz L f) (v) = -(2 * π * I) • L (v, ⬝) • f v`.
33-
The point of this definition is that the derivative of the Fourier transform of `f` is the
34-
Fourier transform of `VectorFourier.fourierSMulRightSchwartz L f`. -/
35-
def VectorFourier.fourierSMulRightSchwartz : 𝓢(D, V) →L[ℝ] 𝓢(D, E →L[ℝ] V) :=
36-
-(2 * π * I) • (bilinLeftCLM (ContinuousLinearMap.smulRightL ℝ E V).flip L.hasTemperateGrowth)
37-
38-
@[simp]
39-
lemma VectorFourier.fourierSMulRightSchwartz_apply (f : 𝓢(D, V)) (d : D) :
40-
VectorFourier.fourierSMulRightSchwartz L f d = -(2 * π * I) • (L d).smulRight (f d) := rfl
41-
42-
/-- The Fourier transform of a Schwartz map `f` has a Fréchet derivative (everywhere in its domain)
43-
and its derivative is the Fourier transform of the Schwartz map `mul_L_schwartz L f`. -/
44-
theorem SchwartzMap.hasFDerivAt_fourierIntegral [MeasurableSpace D] [BorelSpace D]
45-
{μ : Measure D} [SecondCountableTopology D] [HasTemperateGrowth μ] (f : 𝓢(D, V)) (w : E) :
46-
HasFDerivAt (fourierIntegral fourierChar μ L.toLinearMap₂ f)
47-
(fourierIntegral fourierChar μ L.toLinearMap₂ (fourierSMulRightSchwartz L f) w) w :=
48-
VectorFourier.hasFDerivAt_fourierIntegral L f.integrable
49-
(by simpa using f.integrable_pow_mul μ 1) w
18+
open Real Complex TopologicalSpace SchwartzMap MeasureTheory MeasureTheory.Measure
19+
20+
open scoped FourierTransform BigOperators
21+
22+
namespace SchwartzMap
23+
24+
variable
25+
(𝕜 : Type*) [RCLike 𝕜]
26+
{E : Type*} [NormedAddCommGroup E] [NormedSpace ℂ E] [NormedSpace 𝕜 E] [SMulCommClass ℂ 𝕜 E]
27+
{V : Type*} [NormedAddCommGroup V] [InnerProductSpace ℝ V] [FiniteDimensional ℝ V]
28+
[MeasurableSpace V] [BorelSpace V]
29+
30+
/-- The Fourier transform on a real inner product space, as a continuous linear map on the
31+
Schwartz space. -/
32+
noncomputable def fourierTransformCLM : 𝓢(V, E) →L[𝕜] 𝓢(V, E) := by
33+
refine mkCLM (fun (f : V → E) ↦ 𝓕 f) ?_ ?_ ?_ ?_
34+
· intro f g x
35+
simp only [fourierIntegral_eq, Pi.add_apply, smul_add]
36+
rw [integral_add]
37+
· exact (fourierIntegral_convergent_iff _).2 f.integrable
38+
· exact (fourierIntegral_convergent_iff _).2 g.integrable
39+
· intro c f x
40+
simp only [fourierIntegral_eq, Pi.smul_apply, RingHom.id_apply, smul_comm _ c, integral_smul]
41+
· intro f
42+
exact Real.contDiff_fourierIntegral (fun n _ ↦ integrable_pow_mul volume f n)
43+
· rintro ⟨k, n⟩
44+
refine ⟨Finset.range (n + integrablePower (volume : Measure V) + 1) ×ˢ Finset.range (k + 1),
45+
(2 * π) ^ n * (2 * ↑n + 2) ^ k * (Finset.range (n + 1) ×ˢ Finset.range (k + 1)).card
46+
* 2 ^ integrablePower (volume : Measure V) *
47+
(∫ (x : V), (1 + ‖x‖) ^ (- (integrablePower (volume : Measure V) : ℝ))) * 2,
48+
by positivity, fun f x ↦ ?_⟩⟩
49+
apply (pow_mul_norm_iteratedFDeriv_fourierIntegral_le (f.smooth ⊤)
50+
(fun k n _hk _hn ↦ integrable_pow_mul_iteratedFDeriv _ f k n) le_top le_top x).trans
51+
simp only [mul_assoc]
52+
gcongr
53+
calc
54+
∑ p in Finset.range (n + 1) ×ˢ Finset.range (k + 1),
55+
∫ (v : V), ‖v‖ ^ p.1 * ‖iteratedFDeriv ℝ p.2 (⇑f) v‖
56+
≤ ∑ p in Finset.range (n + 1) ×ˢ Finset.range (k + 1),
57+
2 ^ integrablePower (volume : Measure V) *
58+
(∫ (x : V), (1 + ‖x‖) ^ (- (integrablePower (volume : Measure V) : ℝ))) * 2 *
59+
((Finset.range (n + integrablePower (volume : Measure V) + 1) ×ˢ Finset.range (k + 1)).sup
60+
(schwartzSeminormFamily 𝕜 V E)) f := by
61+
apply Finset.sum_le_sum (fun p hp ↦ ?_)
62+
simp only [Finset.mem_product, Finset.mem_range] at hp
63+
apply (f.integral_pow_mul_iteratedFDeriv_le 𝕜 _ _ _).trans
64+
simp only [mul_assoc]
65+
rw [two_mul]
66+
gcongr
67+
· apply Seminorm.le_def.1
68+
have : (0, p.2) ∈ (Finset.range (n + integrablePower (volume : Measure V) + 1)
69+
×ˢ Finset.range (k + 1)) := by simp [hp.2]
70+
apply Finset.le_sup this (f := fun p ↦ SchwartzMap.seminorm 𝕜 p.1 p.2 (E := V) (F := E))
71+
· apply Seminorm.le_def.1
72+
have : (p.1 + integrablePower (volume : Measure V), p.2) ∈ (Finset.range
73+
(n + integrablePower (volume : Measure V) + 1) ×ˢ Finset.range (k + 1)) := by
74+
simp [hp.2]
75+
linarith
76+
apply Finset.le_sup this (f := fun p ↦ SchwartzMap.seminorm 𝕜 p.1 p.2 (E := V) (F := E))
77+
_ = _ := by simp [mul_assoc]
78+
79+
@[simp] lemma fourierTransformCLM_apply (f : 𝓢(V, E)) :
80+
fourierTransformCLM 𝕜 f = 𝓕 f := rfl
81+
82+
variable [CompleteSpace E]
83+
84+
/-- The Fourier transform on a real inner product space, as a continuous linear equiv on the
85+
Schwartz space. -/
86+
noncomputable def fourierTransformCLE : 𝓢(V, E) ≃L[𝕜] 𝓢(V, E) where
87+
__ := fourierTransformCLM 𝕜
88+
invFun := (compCLMOfContinuousLinearEquiv 𝕜 (LinearIsometryEquiv.neg ℝ (E := V)))
89+
∘L (fourierTransformCLM 𝕜)
90+
left_inv := by
91+
intro f
92+
ext x
93+
change 𝓕 (𝓕 f) (-x) = f x
94+
rw [← fourierIntegralInv_eq_fourierIntegral_neg, Continuous.fourier_inversion f.continuous
95+
f.integrable (fourierTransformCLM 𝕜 f).integrable]
96+
right_inv := by
97+
intro f
98+
ext x
99+
change 𝓕 (fun x ↦ (𝓕 f) (-x)) x = f x
100+
simp_rw [← fourierIntegralInv_eq_fourierIntegral_neg, Continuous.fourier_inversion_inv
101+
f.continuous f.integrable (fourierTransformCLM 𝕜 f).integrable]
102+
continuous_invFun := ContinuousLinearMap.continuous _
103+
104+
@[simp] lemma fourierTransformCLE_apply (f : 𝓢(V, E)) :
105+
fourierTransformCLE 𝕜 f = 𝓕 f := rfl
106+
107+
@[simp] lemma fourierTransformCLE_symm_apply (f : 𝓢(V, E)) :
108+
(fourierTransformCLE 𝕜).symm f = 𝓕⁻ f := by
109+
ext x
110+
exact (fourierIntegralInv_eq_fourierIntegral_neg f x).symm

0 commit comments

Comments
 (0)