Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit 90db6fc

Browse files
committed
feat(analysis/calculus/times_cont_diff): smoothness of f : E → Π i, F i (#6674)
Also add helper lemmas/definitions about multilinear maps.
1 parent 1f47833 commit 90db6fc

File tree

5 files changed

+200
-29
lines changed

5 files changed

+200
-29
lines changed

src/analysis/calculus/times_cont_diff.lean

Lines changed: 78 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -232,9 +232,7 @@ begin
232232
refine ⟨λ H, ⟨H.continuous_on, H.zero_eq⟩,
233233
λ H, ⟨H.2, λ m hm, false.elim (not_le.2 hm bot_le), _⟩⟩,
234234
assume m hm,
235-
have : (m : with_top ℕ) = ((0 : ℕ) : with_bot ℕ) := le_antisymm hm bot_le,
236-
rw with_top.coe_eq_coe at this,
237-
rw this,
235+
obtain rfl : m = 0, by exact_mod_cast (hm.antisymm (zero_le _)),
238236
have : ∀ x ∈ s, p x 0 = (continuous_multilinear_curry_fin0 𝕜 E F).symm (f x),
239237
by { assume x hx, rw ← H.2 x hx, symmetry, exact continuous_multilinear_map.uncurry0_curry0 _ },
240238
rw [continuous_on_congr this, linear_isometry_equiv.comp_continuous_on_iff],
@@ -1649,20 +1647,14 @@ lemma has_ftaylor_series_up_to_on.continuous_linear_map_comp {n : with_top ℕ}
16491647
(hf : has_ftaylor_series_up_to_on n f p s) :
16501648
has_ftaylor_series_up_to_on n (g ∘ f) (λ x k, g.comp_continuous_multilinear_map (p x k)) s :=
16511649
begin
1650+
set L : Π m : ℕ, (E [×m]→L[𝕜] F) →L[𝕜] (E [×m]→L[𝕜] G) :=
1651+
λ m, continuous_linear_map.comp_continuous_multilinear_mapL g,
16521652
split,
1653-
{ assume x hx, simp [(hf.zero_eq x hx).symm] },
1654-
{ assume m hm x hx,
1655-
let A : (E [×m]→L[𝕜] F) → (E [×m]→L[𝕜] G) := λ f, g.comp_continuous_multilinear_map f,
1656-
have hA : is_bounded_linear_map 𝕜 A :=
1657-
is_bounded_bilinear_map_comp_multilinear.is_bounded_linear_map_right _,
1658-
have := hf.fderiv_within m hm x hx,
1659-
convert has_fderiv_at.comp_has_fderiv_within_at x (hA.has_fderiv_at) this },
1660-
{ assume m hm,
1661-
let A : (E [×m]→L[𝕜] F) → (E [×m]→L[𝕜] G) :=
1662-
λ f, g.comp_continuous_multilinear_map f,
1663-
have hA : is_bounded_linear_map 𝕜 A :=
1664-
is_bounded_bilinear_map_comp_multilinear.is_bounded_linear_map_right _,
1665-
exact hA.continuous.comp_continuous_on (hf.cont m hm) }
1653+
{ exact λ x hx, congr_arg g (hf.zero_eq x hx) },
1654+
{ intros m hm x hx,
1655+
convert (L m).has_fderiv_at.comp_has_fderiv_within_at x (hf.fderiv_within m hm x hx) },
1656+
{ intros m hm,
1657+
convert (L m).continuous.comp_continuous_on (hf.cont m hm) }
16661658
end
16671659

16681660
/-- Composition by continuous linear maps on the left preserves `C^n` functions in a domain
@@ -1815,17 +1807,14 @@ lemma has_ftaylor_series_up_to_on.prod {n : with_top ℕ} (hf : has_ftaylor_seri
18151807
{g : E → G} {q : E → formal_multilinear_series 𝕜 E G} (hg : has_ftaylor_series_up_to_on n g q s) :
18161808
has_ftaylor_series_up_to_on n (λ y, (f y, g y)) (λ y k, (p y k).prod (q y k)) s :=
18171809
begin
1810+
set L := λ m, continuous_multilinear_map.prodL 𝕜 (λ i : fin m, E) F G,
18181811
split,
18191812
{ assume x hx, rw [← hf.zero_eq x hx, ← hg.zero_eq x hx], refl },
18201813
{ assume m hm x hx,
1821-
let A : (E [×m]→L[𝕜] F) × (E [×m]→L[𝕜] G) → (E [×m]→L[𝕜] (F × G)) := λ p, p.1.prod p.2,
1822-
have hA : is_bounded_linear_map 𝕜 A := is_bounded_linear_map_prod_multilinear,
1823-
convert hA.has_fderiv_at.comp_has_fderiv_within_at x
1814+
convert (L m).has_fderiv_at.comp_has_fderiv_within_at x
18241815
((hf.fderiv_within m hm x hx).prod (hg.fderiv_within m hm x hx)) },
18251816
{ assume m hm,
1826-
let A : (E [×m]→L[𝕜] F) × (E [×m]→L[𝕜] G) → (E [×m]→L[𝕜] (F × G)) := λ p, p.1.prod p.2,
1827-
have hA : is_bounded_linear_map 𝕜 A := is_bounded_linear_map_prod_multilinear,
1828-
exact hA.continuous.comp_continuous_on ((hf.cont m hm).prod (hg.cont m hm)) }
1817+
exact (L m).continuous.comp_continuous_on ((hf.cont m hm).prod (hg.cont m hm)) }
18291818
end
18301819

18311820
/-- The cartesian product of `C^n` functions at a point in a domain is `C^n`. -/
@@ -1863,6 +1852,73 @@ lemma times_cont_diff.prod {n : with_top ℕ} {f : E → F} {g : E → G}
18631852
times_cont_diff_on_univ.1 $ times_cont_diff_on.prod (times_cont_diff_on_univ.2 hf)
18641853
(times_cont_diff_on_univ.2 hg)
18651854

1855+
/-!
1856+
### Smoothness of functions `f : E → Π i, F' i`
1857+
-/
1858+
1859+
section pi
1860+
1861+
variables {ι : Type*} [fintype ι] {F' : ι → Type*} [Π i, normed_group (F' i)]
1862+
[Π i, normed_space 𝕜 (F' i)] {φ : Π i, E → F' i}
1863+
{p' : Π i, E → formal_multilinear_series 𝕜 E (F' i)}
1864+
{Φ : E → Π i, F' i} {P' : E → formal_multilinear_series 𝕜 E (Π i, F' i)}
1865+
{n : with_top ℕ}
1866+
1867+
lemma has_ftaylor_series_up_to_on_pi :
1868+
has_ftaylor_series_up_to_on n (λ x i, φ i x)
1869+
(λ x m, continuous_multilinear_map.pi (λ i, p' i x m)) s ↔
1870+
∀ i, has_ftaylor_series_up_to_on n (φ i) (p' i) s :=
1871+
begin
1872+
set pr := @continuous_linear_map.proj 𝕜 _ ι F' _ _ _,
1873+
letI : Π (m : ℕ) (i : ι), normed_space 𝕜 (E [×m]→L[𝕜] (F' i)) := λ m i, infer_instance,
1874+
set L : Π m : ℕ, (Π i, E [×m]→L[𝕜] (F' i)) ≃ₗᵢ[𝕜] (E [×m]→L[𝕜] (Π i, F' i)) :=
1875+
λ m, continuous_multilinear_map.piₗᵢ _ _,
1876+
refine ⟨λ h i, _, λ h, ⟨λ x hx, _, _, _⟩⟩,
1877+
{ convert h.continuous_linear_map_comp (pr i),
1878+
ext, refl },
1879+
{ ext1 i,
1880+
exact (h i).zero_eq x hx },
1881+
{ intros m hm x hx,
1882+
have := has_fderiv_within_at_pi.2 (λ i, (h i).fderiv_within m hm x hx),
1883+
convert (L m).has_fderiv_at.comp_has_fderiv_within_at x this },
1884+
{ intros m hm,
1885+
have := continuous_on_pi.2 (λ i, (h i).cont m hm),
1886+
convert (L m).continuous.comp_continuous_on this }
1887+
end
1888+
1889+
@[simp] lemma has_ftaylor_series_up_to_on_pi' :
1890+
has_ftaylor_series_up_to_on n Φ P' s ↔
1891+
∀ i, has_ftaylor_series_up_to_on n (λ x, Φ x i)
1892+
(λ x m, (@continuous_linear_map.proj 𝕜 _ ι F' _ _ _ i).comp_continuous_multilinear_map
1893+
(P' x m)) s :=
1894+
by { convert has_ftaylor_series_up_to_on_pi, ext, refl }
1895+
1896+
lemma times_cont_diff_within_at_pi :
1897+
times_cont_diff_within_at 𝕜 n Φ s x ↔
1898+
∀ i, times_cont_diff_within_at 𝕜 n (λ x, Φ x i) s x :=
1899+
begin
1900+
set pr := @continuous_linear_map.proj 𝕜 _ ι F' _ _ _,
1901+
refine ⟨λ h i, h.continuous_linear_map_comp (pr i), λ h m hm, _⟩,
1902+
choose u hux p hp using λ i, h i m hm,
1903+
exact ⟨⋂ i, u i, filter.Inter_mem_sets.2 hux, _,
1904+
has_ftaylor_series_up_to_on_pi.2 (λ i, (hp i).mono $ Inter_subset _ _)⟩,
1905+
end
1906+
1907+
lemma times_cont_diff_on_pi :
1908+
times_cont_diff_on 𝕜 n Φ s ↔ ∀ i, times_cont_diff_on 𝕜 n (λ x, Φ x i) s :=
1909+
⟨λ h i x hx, times_cont_diff_within_at_pi.1 (h x hx) _,
1910+
λ h x hx, times_cont_diff_within_at_pi.2 (λ i, h i x hx)⟩
1911+
1912+
lemma times_cont_diff_at_pi :
1913+
times_cont_diff_at 𝕜 n Φ x ↔ ∀ i, times_cont_diff_at 𝕜 n (λ x, Φ x i) x :=
1914+
times_cont_diff_within_at_pi
1915+
1916+
lemma times_cont_diff_pi :
1917+
times_cont_diff 𝕜 n Φ ↔ ∀ i, times_cont_diff 𝕜 n (λ x, Φ x i) :=
1918+
by simp only [← times_cont_diff_on_univ, times_cont_diff_on_pi]
1919+
1920+
end pi
1921+
18661922
/-!
18671923
### Composition of `C^n` functions
18681924

src/analysis/normed_space/multilinear.lean

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,26 @@ le_antisymm
388388
(f.op_norm_le_bound (norm_nonneg _) $ λ m, (le_max_left _ _).trans ((f.prod g).le_op_norm _))
389389
(g.op_norm_le_bound (norm_nonneg _) $ λ m, (le_max_right _ _).trans ((f.prod g).le_op_norm _))
390390

391+
lemma norm_pi {ι' : Type v'} [fintype ι'] {E' : ι' → Type wE'} [Π i', normed_group (E' i')]
392+
[Π i', normed_space 𝕜 (E' i')] (f : Π i', continuous_multilinear_map 𝕜 E (E' i')) :
393+
∥pi f∥ = ∥f∥ :=
394+
begin
395+
apply le_antisymm,
396+
{ refine (op_norm_le_bound _ (norm_nonneg f) (λ m, _)),
397+
dsimp,
398+
rw pi_norm_le_iff,
399+
exacts [λ i, (f i).le_of_op_norm_le m (norm_le_pi_norm f i),
400+
mul_nonneg (norm_nonneg f) (prod_nonneg $ λ _ _, norm_nonneg _)] },
401+
{ refine (pi_norm_le_iff (norm_nonneg _)).2 (λ i, _),
402+
refine (op_norm_le_bound _ (norm_nonneg _) (λ m, _)),
403+
refine le_trans _ ((pi f).le_op_norm m),
404+
convert norm_le_pi_norm (λ j, f j m) i }
405+
end
406+
407+
section
408+
409+
variables (𝕜 E E' G G')
410+
391411
/-- `continuous_multilinear_map.prod` as a `linear_isometry_equiv`. -/
392412
def prodL :
393413
(continuous_multilinear_map 𝕜 E G) × (continuous_multilinear_map 𝕜 E G') ≃ₗᵢ[𝕜]
@@ -401,6 +421,23 @@ def prodL :
401421
right_inv := λ f, by ext; refl,
402422
norm_map' := λ f, op_norm_prod f.1 f.2 }
403423

424+
/-- `continuous_multilinear_map.pi` as a `linear_isometry_equiv`. -/
425+
def piₗᵢ {ι' : Type v'} [fintype ι'] {E' : ι' → Type wE'} [Π i', normed_group (E' i')]
426+
[Π i', normed_space 𝕜 (E' i')] :
427+
@linear_isometry_equiv 𝕜 (Π i', continuous_multilinear_map 𝕜 E (E' i'))
428+
(continuous_multilinear_map 𝕜 E (Π i, E' i)) _ _ _
429+
(@pi.semimodule ι' _ 𝕜 _ _ (λ i', infer_instance)) _ :=
430+
{ to_fun := pi,
431+
map_add' := λ f g, rfl,
432+
map_smul' := λ c f, rfl,
433+
inv_fun := λ f i,
434+
(@continuous_linear_map.proj 𝕜 _ _ E' _ _ _ i).comp_continuous_multilinear_map f,
435+
left_inv := λ f, by { ext, refl },
436+
right_inv := λ f, by { ext, refl },
437+
norm_map' := norm_pi }
438+
439+
end
440+
404441
section restrict_scalars
405442

406443
variables [Π i, normed_space 𝕜' (E i)] [∀ i, is_scalar_tower 𝕜' 𝕜 (E i)]

src/geometry/manifold/times_cont_mdiff.lean

Lines changed: 56 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1712,17 +1712,66 @@ hf.prod_map hg
17121712

17131713
end prod_map
17141714

1715+
section pi_space
1716+
1717+
/-!
1718+
### Smoothness of functions with codomain `Π i, F i`
1719+
1720+
We have no `model_with_corners.pi` yet, so we prove lemmas about functions `f : M → Π i, F i` and
1721+
use `𝓘(𝕜, Π i, F i)` as the model space.
1722+
-/
1723+
1724+
variables {ι : Type*} [fintype ι] {Fi : ι → Type*} [Π i, normed_group (Fi i)]
1725+
[Π i, normed_space 𝕜 (Fi i)] {φ : M → Π i, Fi i}
1726+
1727+
lemma times_cont_mdiff_within_at_pi_space :
1728+
times_cont_mdiff_within_at I (𝓘(𝕜, Π i, Fi i)) n φ s x ↔
1729+
∀ i, times_cont_mdiff_within_at I (𝓘(𝕜, Fi i)) n (λ x, φ x i) s x :=
1730+
by simp only [times_cont_mdiff_within_at_iff'', continuous_within_at_pi,
1731+
times_cont_diff_within_at_pi, forall_and_distrib, written_in_ext_chart_at,
1732+
ext_chart_model_space_eq_id, (∘), local_equiv.refl_coe, id]
1733+
1734+
lemma times_cont_mdiff_on_pi_space :
1735+
times_cont_mdiff_on I (𝓘(𝕜, Π i, Fi i)) n φ s ↔
1736+
∀ i, times_cont_mdiff_on I (𝓘(𝕜, Fi i)) n (λ x, φ x i) s :=
1737+
⟨λ h i x hx, times_cont_mdiff_within_at_pi_space.1 (h x hx) i,
1738+
λ h x hx, times_cont_mdiff_within_at_pi_space.2 (λ i, h i x hx)⟩
1739+
1740+
lemma times_cont_mdiff_at_pi_space :
1741+
times_cont_mdiff_at I (𝓘(𝕜, Π i, Fi i)) n φ x ↔
1742+
∀ i, times_cont_mdiff_at I (𝓘(𝕜, Fi i)) n (λ x, φ x i) x :=
1743+
times_cont_mdiff_within_at_pi_space
1744+
1745+
lemma times_cont_mdiff_pi_space :
1746+
times_cont_mdiff I (𝓘(𝕜, Π i, Fi i)) n φ ↔
1747+
∀ i, times_cont_mdiff I (𝓘(𝕜, Fi i)) n (λ x, φ x i) :=
1748+
⟨λ h i x, times_cont_mdiff_at_pi_space.1 (h x) i,
1749+
λ h x, times_cont_mdiff_at_pi_space.2 (λ i, h i x)⟩
1750+
1751+
lemma smooth_within_at_pi_space :
1752+
smooth_within_at I (𝓘(𝕜, Π i, Fi i)) φ s x ↔
1753+
∀ i, smooth_within_at I (𝓘(𝕜, Fi i)) (λ x, φ x i) s x :=
1754+
times_cont_mdiff_within_at_pi_space
1755+
1756+
lemma smooth_on_pi_space :
1757+
smooth_on I (𝓘(𝕜, Π i, Fi i)) φ s ↔ ∀ i, smooth_on I (𝓘(𝕜, Fi i)) (λ x, φ x i) s :=
1758+
times_cont_mdiff_on_pi_space
1759+
1760+
lemma smooth_at_pi_space :
1761+
smooth_at I (𝓘(𝕜, Π i, Fi i)) φ x ↔ ∀ i, smooth_at I (𝓘(𝕜, Fi i)) (λ x, φ x i) x :=
1762+
times_cont_mdiff_at_pi_space
1763+
1764+
lemma smooth_pi_space :
1765+
smooth I (𝓘(𝕜, Π i, Fi i)) φ ↔ ∀ i, smooth I (𝓘(𝕜, Fi i)) (λ x, φ x i) :=
1766+
times_cont_mdiff_pi_space
1767+
1768+
end pi_space
1769+
17151770
/-! ### Linear maps between normed spaces are smooth -/
17161771

17171772
lemma continuous_linear_map.times_cont_mdiff (L : E →L[𝕜] F) :
17181773
times_cont_mdiff 𝓘(𝕜, E) 𝓘(𝕜, F) n L :=
1719-
begin
1720-
rw times_cont_mdiff_iff,
1721-
refine ⟨L.cont, λ x y, _⟩,
1722-
simp only with mfld_simps,
1723-
rw times_cont_diff_on_univ,
1724-
exact continuous_linear_map.times_cont_diff L,
1725-
end
1774+
L.times_cont_diff.times_cont_mdiff
17261775

17271776
/-! ### Smoothness of standard operations -/
17281777

src/linear_algebra/multilinear.lean

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,15 @@ def prod (f : multilinear_map R M₁ M₂) (g : multilinear_map R M₁ M₃) :
165165
map_add' := λ m i x y, by simp,
166166
map_smul' := λ m i c x, by simp }
167167

168+
/-- Combine a family of multilinear maps with the same domain and codomains `M' i` into a
169+
multilinear map taking values in the space of functions `Π i, M' i`. -/
170+
@[simps] def pi {ι' : Type*} {M' : ι' → Type*} [Π i, add_comm_monoid (M' i)]
171+
[Π i, semimodule R (M' i)] (f : Π i, multilinear_map R M₁ (M' i)) :
172+
multilinear_map R M₁ (Π i, M' i) :=
173+
{ to_fun := λ m i, f i m,
174+
map_add' := λ m i x y, funext $ λ j, (f j).map_add _ _ _ _,
175+
map_smul' := λ m i c x, funext $ λ j, (f j).map_smul _ _ _ _ }
176+
168177
/-- Given a multilinear map `f` on `n` variables (parameterized by `fin n`) and a subset `s` of `k`
169178
of these variables, one gets a new multilinear map on `fin k` by varying these variables, and fixing
170179
the other ones equal to a given value `z`. It is denoted by `f.restr s hk z`, where `hk` is a

src/topology/algebra/multilinear.lean

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,26 @@ def prod (f : continuous_multilinear_map R M₁ M₂) (g : continuous_multilinea
140140
(f : continuous_multilinear_map R M₁ M₂) (g : continuous_multilinear_map R M₁ M₃) (m : Πi, M₁ i) :
141141
(f.prod g) m = (f m, g m) := rfl
142142

143+
/-- Combine a family of continuous multilinear maps with the same domain and codomains `M' i` into a
144+
continuous multilinear map taking values in the space of functions `Π i, M' i`. -/
145+
def pi {ι' : Type*} {M' : ι' → Type*} [Π i, add_comm_group (M' i)] [Π i, topological_space (M' i)]
146+
[Π i, semimodule R (M' i)] (f : Π i, continuous_multilinear_map R M₁ (M' i)) :
147+
continuous_multilinear_map R M₁ (Π i, M' i) :=
148+
{ cont := continuous_pi $ λ i, (f i).coe_continuous,
149+
to_multilinear_map := multilinear_map.pi (λ i, (f i).to_multilinear_map) }
150+
151+
@[simp] lemma coe_pi {ι' : Type*} {M' : ι' → Type*} [Π i, add_comm_group (M' i)]
152+
[Π i, topological_space (M' i)] [Π i, semimodule R (M' i)]
153+
(f : Π i, continuous_multilinear_map R M₁ (M' i)) :
154+
⇑(pi f) = λ m j, f j m :=
155+
rfl
156+
157+
lemma pi_apply {ι' : Type*} {M' : ι' → Type*} [Π i, add_comm_group (M' i)]
158+
[Π i, topological_space (M' i)] [Π i, semimodule R (M' i)]
159+
(f : Π i, continuous_multilinear_map R M₁ (M' i)) (m : Π i, M₁ i) (j : ι') :
160+
pi f m j = f j m :=
161+
rfl
162+
143163
/-- If `g` is continuous multilinear and `f` is a collection of continuous linear maps,
144164
then `g (f₁ m₁, ..., fₙ mₙ)` is again a continuous multilinear map, that we call
145165
`g.comp_continuous_linear_map f`. -/

0 commit comments

Comments
 (0)