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

Commit f93c119

Browse files
committed
feat(geometry/manifold/mfderiv): more arithmetic (#17793)
* generalize most arithmetic from normed algebra to normed space * add some arithmetic with `mfderiv` * redefine `mfderiv` (and variants) to use `if` instead of dependent `if`.
1 parent 27f315c commit f93c119

2 files changed

Lines changed: 103 additions & 32 deletions

File tree

src/geometry/manifold/cont_mdiff_mfderiv.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ begin
206206
{ apply cont_diff_on.prod B _,
207207
apply C.congr (λp hp, _),
208208
simp only with mfld_simps at hp,
209-
simp only [mfderiv_within, hf.mdifferentiable_on one_le_n _ hp.2, hp.1, dif_pos]
209+
simp only [mfderiv_within, hf.mdifferentiable_on one_le_n _ hp.2, hp.1, if_pos]
210210
with mfld_simps },
211211
have D : cont_diff_on 𝕜 m (λ x,
212212
(fderiv_within 𝕜 (I' ∘ f ∘ I.symm) (I.symm ⁻¹' s ∩ range I) x))
@@ -633,7 +633,7 @@ begin
633633
{ exact model_with_corners.unique_diff_at_image I },
634634
{ exact differentiable_at_id'.prod (differentiable_at_const _) } },
635635
simp only [tangent_bundle.zero_section, tangent_map, mfderiv,
636-
A, dif_pos, chart_at, basic_smooth_vector_bundle_core.chart,
636+
A, if_pos, chart_at, basic_smooth_vector_bundle_core.chart,
637637
basic_smooth_vector_bundle_core.to_vector_bundle_core, tangent_bundle_core,
638638
function.comp, continuous_linear_map.map_zero] with mfld_simps,
639639
rw ← fderiv_within_inter N (I.unique_diff (I ((chart_at H x) x)) (set.mem_range_self _)) at B,

src/geometry/manifold/mfderiv.lean

Lines changed: 101 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ derivative of `f` at `x` within `s`, as a continuous linear map from the tangent
280280
tangent space at `f x`. -/
281281
def mfderiv_within (f : M → M') (s : set M) (x : M) :
282282
tangent_space I x →L[𝕜] tangent_space I' (f x) :=
283-
if h : mdifferentiable_within_at I I' f s x then
283+
if mdifferentiable_within_at I I' f s x then
284284
(fderiv_within 𝕜 (written_in_ext_chart_at I I' x f) ((ext_chart_at I x).symm ⁻¹' s ∩ range I)
285285
((ext_chart_at I x) x) : _)
286286
else 0
@@ -289,7 +289,7 @@ else 0
289289
`f` at `x`, as a continuous linear map from the tangent space at `x` to the tangent space at
290290
`f x`. -/
291291
def mfderiv (f : M → M') (x : M) : tangent_space I x →L[𝕜] tangent_space I' (f x) :=
292-
if h : mdifferentiable_at I I' f x then
292+
if mdifferentiable_at I I' f x then
293293
(fderiv_within 𝕜 (written_in_ext_chart_at I I' x f : E → E') (range I)
294294
((ext_chart_at I x) x) : _)
295295
else 0
@@ -431,11 +431,11 @@ lemma mdifferentiable_within_at_iff_of_mem_source
431431

432432
lemma mfderiv_within_zero_of_not_mdifferentiable_within_at
433433
(h : ¬ mdifferentiable_within_at I I' f s x) : mfderiv_within I I' f s x = 0 :=
434-
by simp only [mfderiv_within, h, dif_neg, not_false_iff]
434+
by simp only [mfderiv_within, h, if_neg, not_false_iff]
435435

436436
lemma mfderiv_zero_of_not_mdifferentiable_at
437437
(h : ¬ mdifferentiable_at I I' f x) : mfderiv I I' f x = 0 :=
438-
by simp only [mfderiv, h, dif_neg, not_false_iff]
438+
by simp only [mfderiv, h, if_neg, not_false_iff]
439439

440440
theorem has_mfderiv_within_at.mono (h : has_mfderiv_within_at I I' f t x f') (hst : s ⊆ t) :
441441
has_mfderiv_within_at I I' f s x f' :=
@@ -504,28 +504,28 @@ lemma mdifferentiable_within_at.has_mfderiv_within_at (h : mdifferentiable_withi
504504
has_mfderiv_within_at I I' f s x (mfderiv_within I I' f s x) :=
505505
begin
506506
refine ⟨h.1, _⟩,
507-
simp only [mfderiv_within, h, dif_pos] with mfld_simps,
507+
simp only [mfderiv_within, h, if_pos] with mfld_simps,
508508
exact differentiable_within_at.has_fderiv_within_at h.2
509509
end
510510

511511
lemma mdifferentiable_within_at.mfderiv_within (h : mdifferentiable_within_at I I' f s x) :
512512
(mfderiv_within I I' f s x) =
513513
fderiv_within 𝕜 (written_in_ext_chart_at I I' x f : _) ((ext_chart_at I x).symm ⁻¹' s ∩ range I)
514514
((ext_chart_at I x) x) :=
515-
by simp only [mfderiv_within, h, dif_pos]
515+
by simp only [mfderiv_within, h, if_pos]
516516

517517
lemma mdifferentiable_at.has_mfderiv_at (h : mdifferentiable_at I I' f x) :
518518
has_mfderiv_at I I' f x (mfderiv I I' f x) :=
519519
begin
520520
refine ⟨h.1, _⟩,
521-
simp only [mfderiv, h, dif_pos] with mfld_simps,
521+
simp only [mfderiv, h, if_pos] with mfld_simps,
522522
exact differentiable_within_at.has_fderiv_within_at h.2
523523
end
524524

525525
lemma mdifferentiable_at.mfderiv (h : mdifferentiable_at I I' f x) :
526526
(mfderiv I I' f x) =
527527
fderiv_within 𝕜 (written_in_ext_chart_at I I' x f : _) (range I) ((ext_chart_at I x) x) :=
528-
by simp only [mfderiv, h, dif_pos]
528+
by simp only [mfderiv, h, if_pos]
529529

530530
lemma has_mfderiv_at.mfderiv (h : has_mfderiv_at I I' f x f') :
531531
mfderiv I I' f x = f' :=
@@ -778,7 +778,7 @@ begin
778778
by_cases h : mdifferentiable_within_at I I' f s x,
779779
{ exact ((h.has_mfderiv_within_at).congr_of_eventually_eq hL hx).mfderiv_within hs },
780780
{ unfold mfderiv_within,
781-
rw [dif_neg h, dif_neg],
781+
rw [if_neg h, if_neg],
782782
rwa ← hL.mdifferentiable_within_at_iff I I' hx }
783783
end
784784

@@ -1037,8 +1037,8 @@ alias mdifferentiable_iff_differentiable ↔
10371037
mfderiv_within (𝓘(𝕜, E)) (𝓘(𝕜, E')) f s x = fderiv_within 𝕜 f s x :=
10381038
begin
10391039
by_cases h : mdifferentiable_within_at (𝓘(𝕜, E)) (𝓘(𝕜, E')) f s x,
1040-
{ simp only [mfderiv_within, h, dif_pos] with mfld_simps },
1041-
{ simp only [mfderiv_within, h, dif_neg, not_false_iff],
1040+
{ simp only [mfderiv_within, h, if_pos] with mfld_simps },
1041+
{ simp only [mfderiv_within, h, if_neg, not_false_iff],
10421042
rw [mdifferentiable_within_at_iff_differentiable_within_at] at h,
10431043
exact (fderiv_within_zero_of_not_differentiable_within_at h).symm }
10441044
end
@@ -1236,10 +1236,8 @@ Note that in the in `has_mfderiv_at` lemmas there is an abuse of the defeq betwe
12361236
canonical, but in this case (the tangent space of a vector space) it is canonical.
12371237
-/
12381238

1239-
variables { z : M} {F' : Type*} [normed_comm_ring F'] [normed_algebra 𝕜 F']
1240-
{f g : M → E'} {p q : M → F'} {I}
1241-
{f' g' : tangent_space I z →L[𝕜] E'}
1242-
{p' q' : tangent_space I z →L[𝕜] F'}
1239+
section group
1240+
variables {I} {z : M} {f g : M → E'} {f' g' : tangent_space I z →L[𝕜] E'}
12431241

12441242
lemma has_mfderiv_at.add (hf : has_mfderiv_at I 𝓘(𝕜, E') f z f')
12451243
(hg : has_mfderiv_at I 𝓘(𝕜, E') g z g') : has_mfderiv_at I 𝓘(𝕜, E') (f + g) z (f' + g') :=
@@ -1253,18 +1251,11 @@ lemma mdifferentiable.add (hf : mdifferentiable I 𝓘(𝕜, E') f) (hg : mdiffe
12531251
mdifferentiable I 𝓘(𝕜, E') (f + g) :=
12541252
λ x, (hf x).add (hg x)
12551253

1256-
lemma has_mfderiv_at.mul (hp : has_mfderiv_at I 𝓘(𝕜, F') p z p')
1257-
(hq : has_mfderiv_at I 𝓘(𝕜, F') q z q') :
1258-
has_mfderiv_at I 𝓘(𝕜, F') (p * q) z (p z • q' + q z • p' : E →L[𝕜] F') :=
1259-
⟨hp.1.mul hq.1, by simpa only with mfld_simps using hp.2.mul hq.2
1260-
1261-
lemma mdifferentiable_at.mul (hp : mdifferentiable_at I 𝓘(𝕜, F') p z)
1262-
(hq : mdifferentiable_at I 𝓘(𝕜, F') q z) : mdifferentiable_at I 𝓘(𝕜, F') (p * q) z :=
1263-
(hp.has_mfderiv_at.mul hq.has_mfderiv_at).mdifferentiable_at
1264-
1265-
lemma mdifferentiable.mul {f g : M → F'} (hf : mdifferentiable I 𝓘(𝕜, F') f)
1266-
(hg : mdifferentiable I 𝓘(𝕜, F') g) : mdifferentiable I 𝓘(𝕜, F') (f * g) :=
1267-
λ x, (hf x).mul (hg x)
1254+
lemma mfderiv_add (hf : mdifferentiable_at I 𝓘(𝕜, E') f z)
1255+
(hg : mdifferentiable_at I 𝓘(𝕜, E') g z) :
1256+
(mfderiv I 𝓘(𝕜, E') (f + g) z : tangent_space I z →L[𝕜] E') =
1257+
(mfderiv I 𝓘(𝕜, E') f z + mfderiv I 𝓘(𝕜, E') g z : tangent_space I z →L[𝕜] E') :=
1258+
(hf.has_mfderiv_at.add hg.has_mfderiv_at).mfderiv
12681259

12691260
lemma has_mfderiv_at.const_smul (hf : has_mfderiv_at I 𝓘(𝕜, E') f z f') (s : 𝕜) :
12701261
has_mfderiv_at I 𝓘(𝕜, E') (s • f) z (s • f') :=
@@ -1274,22 +1265,45 @@ lemma mdifferentiable_at.const_smul (hf : mdifferentiable_at I 𝓘(𝕜, E') f
12741265
mdifferentiable_at I 𝓘(𝕜, E') (s • f) z :=
12751266
(hf.has_mfderiv_at.const_smul s).mdifferentiable_at
12761267

1277-
lemma mdifferentiable.const_smul {f : M → E'} (s : 𝕜) (hf : mdifferentiable I 𝓘(𝕜, E') f) :
1268+
lemma mdifferentiable.const_smul (s : 𝕜) (hf : mdifferentiable I 𝓘(𝕜, E') f) :
12781269
mdifferentiable I 𝓘(𝕜, E') (s • f) :=
12791270
λ x, (hf x).const_smul s
12801271

1272+
lemma const_smul_mfderiv (hf : mdifferentiable_at I 𝓘(𝕜, E') f z) (s : 𝕜) :
1273+
(mfderiv I 𝓘(𝕜, E') (s • f) z : tangent_space I z →L[𝕜] E') =
1274+
(s • mfderiv I 𝓘(𝕜, E') f z : tangent_space I z →L[𝕜] E') :=
1275+
(hf.has_mfderiv_at.const_smul s).mfderiv
1276+
12811277
lemma has_mfderiv_at.neg (hf : has_mfderiv_at I 𝓘(𝕜, E') f z f') :
12821278
has_mfderiv_at I 𝓘(𝕜, E') (-f) z (-f') :=
12831279
⟨hf.1.neg, hf.2.neg⟩
12841280

1281+
lemma has_mfderiv_at_neg :
1282+
has_mfderiv_at I 𝓘(𝕜, E') (-f) z (-f') ↔ has_mfderiv_at I 𝓘(𝕜, E') f z f' :=
1283+
⟨λ hf, by { convert hf.neg; rw [neg_neg] }, λ hf, hf.neg⟩
1284+
12851285
lemma mdifferentiable_at.neg (hf : mdifferentiable_at I 𝓘(𝕜, E') f z) :
12861286
mdifferentiable_at I 𝓘(𝕜, E') (-f) z :=
12871287
hf.has_mfderiv_at.neg.mdifferentiable_at
12881288

1289-
lemma mdifferentiable.neg {f : M → E'} (hf : mdifferentiable I 𝓘(𝕜, E') f) :
1289+
lemma mdifferentiable_at_neg :
1290+
mdifferentiable_at I 𝓘(𝕜, E') (-f) z ↔ mdifferentiable_at I 𝓘(𝕜, E') f z :=
1291+
⟨λ hf, by { convert hf.neg; rw [neg_neg] }, λ hf, hf.neg⟩
1292+
1293+
lemma mdifferentiable.neg (hf : mdifferentiable I 𝓘(𝕜, E') f) :
12901294
mdifferentiable I 𝓘(𝕜, E') (-f) :=
12911295
λ x, (hf x).neg
12921296

1297+
lemma mfderiv_neg (f : M → E') (x : M) :
1298+
(mfderiv I 𝓘(𝕜, E') (-f) x : tangent_space I x →L[𝕜] E') =
1299+
(- mfderiv I 𝓘(𝕜, E') f x : tangent_space I x →L[𝕜] E') :=
1300+
begin
1301+
simp_rw [mfderiv],
1302+
by_cases hf : mdifferentiable_at I 𝓘(𝕜, E') f x,
1303+
{ exact hf.has_mfderiv_at.neg.mfderiv },
1304+
{ rw [if_neg hf], rw [← mdifferentiable_at_neg] at hf, rw [if_neg hf, neg_zero] },
1305+
end
1306+
12931307
lemma has_mfderiv_at.sub (hf : has_mfderiv_at I 𝓘(𝕜, E') f z f')
12941308
(hg : has_mfderiv_at I 𝓘(𝕜, E') g z g') : has_mfderiv_at I 𝓘(𝕜, E') (f - g) z (f'- g') :=
12951309
⟨hf.1.sub hg.1, hf.2.sub hg.2
@@ -1298,10 +1312,67 @@ lemma mdifferentiable_at.sub (hf : mdifferentiable_at I 𝓘(𝕜, E') f z)
12981312
(hg : mdifferentiable_at I 𝓘(𝕜, E') g z) : mdifferentiable_at I 𝓘(𝕜, E') (f - g) z :=
12991313
(hf.has_mfderiv_at.sub hg.has_mfderiv_at).mdifferentiable_at
13001314

1301-
lemma mdifferentiable.sub {f : M → E'} (hf : mdifferentiable I 𝓘(𝕜, E') f)
1315+
lemma mdifferentiable.sub (hf : mdifferentiable I 𝓘(𝕜, E') f)
13021316
(hg : mdifferentiable I 𝓘(𝕜, E') g) : mdifferentiable I 𝓘(𝕜, E') (f - g) :=
13031317
λ x, (hf x).sub (hg x)
13041318

1319+
lemma mfderiv_sub (hf : mdifferentiable_at I 𝓘(𝕜, E') f z)
1320+
(hg : mdifferentiable_at I 𝓘(𝕜, E') g z) :
1321+
(mfderiv I 𝓘(𝕜, E') (f - g) z : tangent_space I z →L[𝕜] E') =
1322+
(mfderiv I 𝓘(𝕜, E') f z - mfderiv I 𝓘(𝕜, E') g z : tangent_space I z →L[𝕜] E') :=
1323+
(hf.has_mfderiv_at.sub hg.has_mfderiv_at).mfderiv
1324+
1325+
end group
1326+
1327+
section algebra_over_ring
1328+
variables {I} {z : M} {F' : Type*} [normed_ring F'] [normed_algebra 𝕜 F']
1329+
{p q : M → F'} {p' q' : tangent_space I z →L[𝕜] F'}
1330+
1331+
lemma has_mfderiv_within_at.mul' (hp : has_mfderiv_within_at I 𝓘(𝕜, F') p s z p')
1332+
(hq : has_mfderiv_within_at I 𝓘(𝕜, F') q s z q') :
1333+
has_mfderiv_within_at I 𝓘(𝕜, F') (p * q) s z (p z • q' + p'.smul_right (q z) : E →L[𝕜] F') :=
1334+
⟨hp.1.mul hq.1, by simpa only with mfld_simps using hp.2.mul' hq.2
1335+
1336+
lemma has_mfderiv_at.mul' (hp : has_mfderiv_at I 𝓘(𝕜, F') p z p')
1337+
(hq : has_mfderiv_at I 𝓘(𝕜, F') q z q') :
1338+
has_mfderiv_at I 𝓘(𝕜, F') (p * q) z (p z • q' + p'.smul_right (q z) : E →L[𝕜] F') :=
1339+
has_mfderiv_within_at_univ.mp $ hp.has_mfderiv_within_at.mul' hq.has_mfderiv_within_at
1340+
1341+
lemma mdifferentiable_within_at.mul (hp : mdifferentiable_within_at I 𝓘(𝕜, F') p s z)
1342+
(hq : mdifferentiable_within_at I 𝓘(𝕜, F') q s z) :
1343+
mdifferentiable_within_at I 𝓘(𝕜, F') (p * q) s z :=
1344+
(hp.has_mfderiv_within_at.mul' hq.has_mfderiv_within_at).mdifferentiable_within_at
1345+
1346+
lemma mdifferentiable_at.mul (hp : mdifferentiable_at I 𝓘(𝕜, F') p z)
1347+
(hq : mdifferentiable_at I 𝓘(𝕜, F') q z) : mdifferentiable_at I 𝓘(𝕜, F') (p * q) z :=
1348+
(hp.has_mfderiv_at.mul' hq.has_mfderiv_at).mdifferentiable_at
1349+
1350+
lemma mdifferentiable_on.mul (hp : mdifferentiable_on I 𝓘(𝕜, F') p s)
1351+
(hq : mdifferentiable_on I 𝓘(𝕜, F') q s) : mdifferentiable_on I 𝓘(𝕜, F') (p * q) s :=
1352+
λ x hx, (hp x hx).mul $ hq x hx
1353+
1354+
lemma mdifferentiable.mul (hp : mdifferentiable I 𝓘(𝕜, F') p)
1355+
(hq : mdifferentiable I 𝓘(𝕜, F') q) : mdifferentiable I 𝓘(𝕜, F') (p * q) :=
1356+
λ x, (hp x).mul (hq x)
1357+
1358+
end algebra_over_ring
1359+
1360+
section algebra_over_comm_ring
1361+
variables {I} {z : M} {F' : Type*} [normed_comm_ring F'] [normed_algebra 𝕜 F']
1362+
{p q : M → F'} {p' q' : tangent_space I z →L[𝕜] F'}
1363+
1364+
lemma has_mfderiv_within_at.mul (hp : has_mfderiv_within_at I 𝓘(𝕜, F') p s z p')
1365+
(hq : has_mfderiv_within_at I 𝓘(𝕜, F') q s z q') :
1366+
has_mfderiv_within_at I 𝓘(𝕜, F') (p * q) s z (p z • q' + q z • p' : E →L[𝕜] F') :=
1367+
by { convert hp.mul' hq, ext z, apply mul_comm }
1368+
1369+
lemma has_mfderiv_at.mul (hp : has_mfderiv_at I 𝓘(𝕜, F') p z p')
1370+
(hq : has_mfderiv_at I 𝓘(𝕜, F') q z q') :
1371+
has_mfderiv_at I 𝓘(𝕜, F') (p * q) z (p z • q' + q z • p' : E →L[𝕜] F') :=
1372+
has_mfderiv_within_at_univ.mp $ hp.has_mfderiv_within_at.mul hq.has_mfderiv_within_at
1373+
1374+
end algebra_over_comm_ring
1375+
13051376
end arithmetic
13061377

13071378
namespace model_with_corners

0 commit comments

Comments
 (0)