Analysis II (Tao, 2022) -- Chapter 05 -- Section 03

section Chap05section Section03

The exponential mode is continuous and 1 : 1-periodic on : Type.

lemma fourierCharacter_formula_continuous_periodic (n : ) : Continuous (fun x : => Complex.exp (2 * Real.pi * Complex.I * (n : ) * (x : ))) Function.Periodic (fun x : => Complex.exp (2 * Real.pi * Complex.I * (n : ) * (x : ))) 1 := by constructor · continuity · intro x have hphase : 2 * Real.pi * Complex.I * (n : ) * (((x + 1 : ) : )) = 2 * Real.pi * Complex.I * (n : ) * (x : ) + n * (2 * Real.pi * Complex.I) := by calc 2 * Real.pi * Complex.I * (n : ) * (((x + 1 : ) : )) = 2 * Real.pi * Complex.I * (n : ) * ((x : ) + 1) := by simp _ = 2 * Real.pi * Complex.I * (n : ) * (x : ) + n * (2 * Real.pi * Complex.I) := by ring calc Complex.exp (2 * Real.pi * Complex.I * (n : ) * (((x + 1 : ) : ))) = Complex.exp (2 * Real.pi * Complex.I * (n : ) * (x : ) + n * (2 * Real.pi * Complex.I)) := by rw [hphase] _ = Complex.exp (2 * Real.pi * Complex.I * (n : ) * (x : )) * Complex.exp (n * (2 * Real.pi * Complex.I)) := by rw [Complex.exp_add] _ = Complex.exp (2 * Real.pi * Complex.I * (n : ) * (x : )) := by simp

Definition 5.3.1 (Characters): for every integer Unknown identifier `n`n, define by .

noncomputable def fourierCharacter (n : ) : C(AddCircle (1 : ), ) := fourier (T := (1 : )) n

Evaluation formula for the character Unknown identifier `e_n`e_n.

lemma fourierCharacter_apply (n : ) (x : ) : fourierCharacter n (x : AddCircle (1 : )) = Complex.exp (2 * Real.pi * Complex.I * (n : ) * (x : )) := by rw [fourierCharacter] convert (fourier_coe_apply (T := (1 : )) (n := n) (x := x)) using 1 simp

Lemma 5.3.5 (Characters are an orthonormal system): for integers , the Fourier characters satisfy when Unknown identifier `n`sorry = sorry : Propn = Unknown identifier `m`m and 0 : 0 otherwise, and , where Unknown identifier `e_k`e_k is viewed in as fourierLp 2 sorry : (MeasureTheory.Lp 2 AddCircle.haarAddCircle)fourierLp (T := 1) (p := 2) Unknown identifier `k`k.

lemma fourierCharacter_orthonormal_system (n m : ) : (inner (fourierLp (T := (1 : )) (p := 2) n) (fourierLp (T := (1 : )) (p := 2) m) = (if n = m then (1 : ) else 0)) fourierLp (T := (1 : )) (p := 2) n = (1 : ) := by have hOrtho : Orthonormal (fourierLp (T := (1 : )) (p := 2)) := orthonormal_fourier (T := (1 : )) constructor · exact (orthonormal_iff_ite.mp hOrtho) n m · exact hOrtho.norm_eq_one n

Definition 5.3.2 (Trigonometric polynomials): a function is a trigonometric polynomial if for some integer bound Unknown identifier `N`sorry 0 : PropN 0 and coefficients failed to synthesize Membership ?m.1 Type Hint: Additional diagnostic information may be available using the `set_option diagnostics true` command.Unknown identifier `c_n`c_n .

def IsTrigonometricPolynomial (f : C(AddCircle (1 : ), )) : Prop := N : , c : , f = Finset.sum (Finset.Icc (-(N : )) (N : )) (fun n => c n fourierCharacter n)

Helper for Corollary 5.3.6: coefficient extraction on a finite support set.

lemma helperForCorollary_5_3_6_inner_on_support (s : Finset ) (c : ) {n : } (hn : n s) : inner (fourierLp (T := (1 : )) (p := 2) n) (Finset.sum s (fun k => c k fourierLp (T := (1 : )) (p := 2) k)) = c n := by have hOrtho : Orthonormal (fourierLp (T := (1 : )) (p := 2)) := orthonormal_fourier (T := (1 : )) simpa using hOrtho.inner_right_sum c hn

Helper for Corollary 5.3.6: coefficient vanishing outside a finite support set.

lemma helperForCorollary_5_3_6_inner_off_support (s : Finset ) (c : ) {n : } (hn : n s) : inner (fourierLp (T := (1 : )) (p := 2) n) (Finset.sum s (fun k => c k fourierLp (T := (1 : )) (p := 2) k)) = 0 := by have hOrtho : Orthonormal (fourierLp (T := (1 : )) (p := 2)) := orthonormal_fourier (T := (1 : )) have hOrthoIte := orthonormal_iff_ite.mp hOrtho classical calc inner (fourierLp (T := (1 : )) (p := 2) n) (Finset.sum s (fun k => c k fourierLp (T := (1 : )) (p := 2) k)) = Finset.sum s (fun k => c k * inner (fourierLp (T := (1 : )) (p := 2) n) (fourierLp (T := (1 : )) (p := 2) k)) := by simp [inner_sum, inner_smul_right] _ = Finset.sum s (fun k => c k * (if n = k then (1 : ) else 0)) := by simp [hOrthoIte] _ = 0 := by refine Finset.sum_eq_zero ?_ intro k hk by_cases hnk : n = k · exfalso exact hn (hnk hk) · simp [hnk]

Helper for Corollary 5.3.6: finite Parseval identity for a finite Fourier sum.

lemma helperForCorollary_5_3_6_normSq_finite_sum (s : Finset ) (c : ) : Finset.sum s (fun k => c k fourierLp (T := (1 : )) (p := 2) k) ^ (2 : ) = Finset.sum s (fun k => c k ^ (2 : )) := by let f := Finset.sum s (fun k => c k fourierLp (T := (1 : )) (p := 2) k) have hOrtho : Orthonormal (fourierLp (T := (1 : )) (p := 2)) := orthonormal_fourier (T := (1 : )) have hInner : inner f f = Finset.sum s (fun k => (starRingEnd ) (c k) * c k) := by simpa [f] using hOrtho.inner_sum c c s have hReal : f ^ (2 : ) = Finset.sum s (fun k => c k ^ (2 : )) := by calc f ^ (2 : ) = Complex.re (inner f f) := by simpa using (norm_sq_eq_re_inner (𝕜 := ) f) _ = Complex.re (Finset.sum s (fun k => (starRingEnd ) (c k) * c k)) := by rw [hInner] _ = Finset.sum s (fun k => c k ^ (2 : )) := by simp [RCLike.conj_mul, pow_two] simpa [f] using hReal

Corollary 5.3.6: for a trigonometric polynomial , the Fourier coefficient at each Unknown identifier `n`n in the support interval is Unknown identifier `c_n`c_n, the coefficients outside that interval vanish, and .

theorem trigonometricPolynomial_fourierCoefficients_and_normSq (N : ) (c : ) : let f := Finset.sum (Finset.Icc (-(N : )) (N : )) (fun n => c n fourierLp (T := (1 : )) (p := 2) n) ( n : , n Finset.Icc (-(N : )) (N : ) inner (fourierLp (T := (1 : )) (p := 2) n) f = c n) ( n : , n Finset.Icc (-(N : )) (N : ) inner (fourierLp (T := (1 : )) (p := 2) n) f = 0) f ^ (2 : ) = Finset.sum (Finset.Icc (-(N : )) (N : )) (fun n => c n ^ (2 : )) := by let s : Finset := Finset.Icc (-(N : )) (N : ) let f := Finset.sum s (fun n => c n fourierLp (T := (1 : )) (p := 2) n) change ( n : , n s inner (fourierLp (T := (1 : )) (p := 2) n) f = c n) ( n : , n s inner (fourierLp (T := (1 : )) (p := 2) n) f = 0) f ^ (2 : ) = Finset.sum s (fun n => c n ^ (2 : )) constructor · intro n hn simpa [f] using helperForCorollary_5_3_6_inner_on_support s c hn · constructor · intro n hn simpa [f] using helperForCorollary_5_3_6_inner_off_support s c hn · simpa [f] using helperForCorollary_5_3_6_normSq_finite_sum s c

Definition 5.3.7 (Fourier transform): for , its Fourier transform is the function : Type sending Unknown identifier `n`n to the Unknown identifier `n`n-th Fourier coefficient .

noncomputable def fourierTransform (f : C(AddCircle (1 : ), )) : := fourierCoeff f

For , the Fourier series term family is .

noncomputable def fourierSeriesOnAddCircle (f : C(AddCircle (1 : ), )) : C(AddCircle (1 : ), ) := fun n => (fourierTransform f n) fourierCharacter n

Definition 5.3.8 (Fourier inversion, Fourier series, and Plancherel formula): for , the Fourier series is the formal family ; if Unknown identifier `f`f is a trigonometric polynomial, then Unknown identifier `f`f equals a finite sum of these Fourier-series terms; and in the same finite case one has the Parseval/Plancherel identity.

def fourierSeries_inversion_plancherel_onAddCircle (f : C(AddCircle (1 : ), )) : Prop := (fourierSeriesOnAddCircle f = fun n : => (fourierTransform f n) fourierCharacter n) (IsTrigonometricPolynomial f s : Finset , ( n : , n s fourierTransform f n = 0) f = Finset.sum s (fun n => fourierSeriesOnAddCircle f n)) (IsTrigonometricPolynomial f s : Finset , ( n : , n s fourierTransform f n = 0) ( x : AddCircle (1 : ), f x ^ (2 : ) (AddCircle.haarAddCircle : MeasureTheory.Measure (AddCircle (1 : )))) = Finset.sum s (fun n => fourierTransform f n ^ (2 : )))

Bridge fourierTransform (f : C(AddCircle 1, )) : fourierTransform to the inner product with Fourier modes.

lemma fourierTransform_eq_inner_fourierLp_toLp (f : C(AddCircle (1 : ), )) (n : ) : fourierTransform f n = inner (fourierLp (T := (1 : )) (p := 2) n) (ContinuousMap.toLp (E := ) 2 AddCircle.haarAddCircle f) := by calc fourierTransform f n = fourierCoeff (((ContinuousMap.toLp (E := ) 2 AddCircle.haarAddCircle ) f)) n := by simpa [fourierTransform] using (fourierCoeff_toLp (T := (1 : )) (f := f) n).symm _ = (fourierBasis (T := (1 : ))).repr (ContinuousMap.toLp (E := ) 2 AddCircle.haarAddCircle f) n := by simpa using (fourierBasis_repr (T := (1 : )) (f := (ContinuousMap.toLp (E := ) 2 AddCircle.haarAddCircle f)) (i := n)).symm _ = inner ((fourierBasis (T := (1 : ))) n) (ContinuousMap.toLp (E := ) 2 AddCircle.haarAddCircle f) := by simpa using (HilbertBasis.repr_apply_apply (fourierBasis (T := (1 : ))) (ContinuousMap.toLp (E := ) 2 AddCircle.haarAddCircle f) n) _ = inner (fourierLp (T := (1 : )) (p := 2) n) (ContinuousMap.toLp (E := ) 2 AddCircle.haarAddCircle f) := by simp [coe_fourierBasis]

If Unknown identifier `f`f is a trigonometric polynomial, then Unknown identifier `f`f equals a finite sum of its Fourier-series terms (Fourier inversion in the finite case).

theorem trigonometricPolynomial_fourierInversion (f : C(AddCircle (1 : ), )) (hf : IsTrigonometricPolynomial f) : s : Finset , ( n : , n s fourierTransform f n = 0) f = Finset.sum s (fun n => fourierSeriesOnAddCircle f n) := by rcases hf with N, c, hrepr let s : Finset := Finset.Icc (-(N : )) (N : ) have hreprLp : ContinuousMap.toLp (E := ) 2 AddCircle.haarAddCircle f = Finset.sum s (fun k => c k fourierLp (T := (1 : )) (p := 2) k) := by have h := congrArg (ContinuousMap.toLp (E := ) 2 AddCircle.haarAddCircle ) hrepr simpa [s, fourierCharacter, map_sum] using h have hcoeff_on : n : , n s fourierTransform f n = c n := by intro n hn rw [fourierTransform_eq_inner_fourierLp_toLp] rw [hreprLp] simpa using helperForCorollary_5_3_6_inner_on_support s c hn have hcoeff_off : n : , n s fourierTransform f n = 0 := by intro n hn rw [fourierTransform_eq_inner_fourierLp_toLp] rw [hreprLp] simpa using helperForCorollary_5_3_6_inner_off_support s c hn refine s, hcoeff_off, ?_ calc f = Finset.sum s (fun n => c n fourierCharacter n) := by simpa [s] using hrepr _ = Finset.sum s (fun n => fourierSeriesOnAddCircle f n) := by refine Finset.sum_congr rfl ?_ intro n hn simp [fourierSeriesOnAddCircle, hcoeff_on n hn]

If Unknown identifier `f`f is a trigonometric polynomial, then the finite Parseval/Plancherel identity holds: the norm identity on AddCircle.{u_1} {𝕜 : Type u_1} [AddCommGroup 𝕜] (p : 𝕜) : Type u_1AddCircle equals a finite sum of squared Fourier coefficients.

theorem trigonometricPolynomial_plancherel_formula (f : C(AddCircle (1 : ), )) (hf : IsTrigonometricPolynomial f) : s : Finset , ( n : , n s fourierTransform f n = 0) ( x : AddCircle (1 : ), f x ^ (2 : ) (AddCircle.haarAddCircle : MeasureTheory.Measure (AddCircle (1 : )))) = Finset.sum s (fun n => fourierTransform f n ^ (2 : )) := by rcases trigonometricPolynomial_fourierInversion f hf with s, hOff, _ have hOffCoeff : n : , n s fourierCoeff f n = 0 := by intro n hn simpa [fourierTransform] using hOff n hn have hParsevalCoeff : (∑' n : , fourierCoeff f n ^ (2 : )) = ( x : AddCircle (1 : ), f x ^ (2 : ) (AddCircle.haarAddCircle : MeasureTheory.Measure (AddCircle (1 : )))) := by have htsum := tsum_sq_fourierCoeff (T := (1 : )) (ContinuousMap.toLp (E := ) 2 AddCircle.haarAddCircle f) have hcoeffNorm : n : , fourierCoeff f n ^ (2 : ) = fourierCoeff (ContinuousMap.toLp (E := ) 2 AddCircle.haarAddCircle f) n ^ (2 : ) := by intro n simpa using congrArg (fun z : => z ^ (2 : )) (fourierCoeff_toLp (T := (1 : )) (f := f) n).symm have hcoe : (ContinuousMap.toLp (E := ) 2 AddCircle.haarAddCircle f) =ᵐ[AddCircle.haarAddCircle] f := by simpa using (ContinuousMap.coeFn_toLp (E := ) (p := (2 : ENNReal)) (μ := AddCircle.haarAddCircle) (𝕜 := ) f) calc (∑' n : , fourierCoeff f n ^ (2 : )) = ∑' n : , fourierCoeff (ContinuousMap.toLp (E := ) 2 AddCircle.haarAddCircle f) n ^ (2 : ) := by exact tsum_congr hcoeffNorm _ = x : AddCircle (1 : ), (ContinuousMap.toLp (E := ) 2 AddCircle.haarAddCircle f) x ^ (2 : ) (AddCircle.haarAddCircle : MeasureTheory.Measure (AddCircle (1 : ))) := by simpa using htsum _ = ( x : AddCircle (1 : ), f x ^ (2 : ) (AddCircle.haarAddCircle : MeasureTheory.Measure (AddCircle (1 : )))) := by exact MeasureTheory.integral_congr_ae <| hcoe.mono (fun x hx => by simpa using congrArg (fun z : => z ^ (2 : )) hx) have htsumToFinsetCoeff : (∑' n : , fourierCoeff f n ^ (2 : )) = Finset.sum s (fun n => fourierCoeff f n ^ (2 : )) := by refine tsum_eq_sum (s := s) ?_ intro n hn simp [hOffCoeff n hn] refine s, hOff, ?_ calc ( x : AddCircle (1 : ), f x ^ (2 : ) (AddCircle.haarAddCircle : MeasureTheory.Measure (AddCircle (1 : )))) = (∑' n : , fourierCoeff f n ^ (2 : )) := hParsevalCoeff.symm _ = Finset.sum s (fun n => fourierCoeff f n ^ (2 : )) := htsumToFinsetCoeff _ = Finset.sum s (fun n => fourierTransform f n ^ (2 : )) := by simp [fourierTransform]
end Section03end Chap05