Skip to content

Commit 185ec9c

Browse files
committed
feat: the Lie bracket of vector fields in vector spaces (#18852)
1 parent f02eb61 commit 185ec9c

File tree

2 files changed

+344
-0
lines changed

2 files changed

+344
-0
lines changed

β€ŽMathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1172,6 +1172,7 @@ import Mathlib.Analysis.Calculus.SmoothSeries
11721172
import Mathlib.Analysis.Calculus.TangentCone
11731173
import Mathlib.Analysis.Calculus.Taylor
11741174
import Mathlib.Analysis.Calculus.UniformLimitsDeriv
1175+
import Mathlib.Analysis.Calculus.VectorField
11751176
import Mathlib.Analysis.Complex.AbelLimit
11761177
import Mathlib.Analysis.Complex.AbsMax
11771178
import Mathlib.Analysis.Complex.Angle
Lines changed: 343 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,343 @@
1+
/-
2+
Copyright (c) 2024 SΓ©bastien GouΓ«zel. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: SΓ©bastien GouΓ«zel
5+
-/
6+
import Mathlib.Analysis.Calculus.FDeriv.Symmetric
7+
8+
/-!
9+
# Vector fields in vector spaces
10+
11+
We study functions of the form `V : E β†’ E` on a vector space, thinking of these as vector fields.
12+
We define several notions in this context, with the aim to generalize them to vector fields on
13+
manifolds.
14+
15+
Notably, we define the pullback of a vector field under a map, as
16+
`VectorField.pullback π•œ f V x := (fderiv π•œ f x).inverse (V (f x))` (together with the same notion
17+
within a set).
18+
19+
In addition to comprehensive API on this notion, the main result is the following:
20+
* `VectorField.leibniz_identity_lieBracket` is the Leibniz
21+
identity `[U, [V, W]] = [[U, V], W] + [V, [U, W]]`.
22+
23+
-/
24+
25+
open Set
26+
open scoped Topology
27+
28+
noncomputable section
29+
30+
variable {π•œ : Type*} [NontriviallyNormedField π•œ]
31+
{E : Type*} [NormedAddCommGroup E] [NormedSpace π•œ E]
32+
{F : Type*} [NormedAddCommGroup F] [NormedSpace π•œ F]
33+
{G : Type*} [NormedAddCommGroup G] [NormedSpace π•œ G]
34+
{V W V₁ W₁ : E β†’ E} {s t : Set E} {x : E}
35+
36+
/-!
37+
### The Lie bracket of vector fields in a vector space
38+
39+
We define the Lie bracket of two vector fields, and call it `lieBracket π•œ V W x`. We also define
40+
a version localized to sets, `lieBracketWithin π•œ V W s x`. We copy the relevant API
41+
of `fderivWithin` and `fderiv` for these notions to get a comprehensive API.
42+
-/
43+
44+
namespace VectorField
45+
46+
variable (π•œ) in
47+
/-- The Lie bracket `[V, W] (x)` of two vector fields at a point, defined as
48+
`DW(x) (V x) - DV(x) (W x)`. -/
49+
def lieBracket (V W : E β†’ E) (x : E) : E :=
50+
fderiv π•œ W x (V x) - fderiv π•œ V x (W x)
51+
52+
variable (π•œ) in
53+
/-- The Lie bracket `[V, W] (x)` of two vector fields within a set at a point, defined as
54+
`DW(x) (V x) - DV(x) (W x)` where the derivatives are taken inside `s`. -/
55+
def lieBracketWithin (V W : E β†’ E) (s : Set E) (x : E) : E :=
56+
fderivWithin π•œ W s x (V x) - fderivWithin π•œ V s x (W x)
57+
58+
lemma lieBracket_eq :
59+
lieBracket π•œ V W = fun x ↦ fderiv π•œ W x (V x) - fderiv π•œ V x (W x) := rfl
60+
61+
lemma lieBracketWithin_eq :
62+
lieBracketWithin π•œ V W s =
63+
fun x ↦ fderivWithin π•œ W s x (V x) - fderivWithin π•œ V s x (W x) := rfl
64+
65+
@[simp]
66+
theorem lieBracketWithin_univ : lieBracketWithin π•œ V W univ = lieBracket π•œ V W := by
67+
ext1 x
68+
simp [lieBracketWithin, lieBracket]
69+
70+
lemma lieBracketWithin_eq_zero_of_eq_zero (hV : V x = 0) (hW : W x = 0) :
71+
lieBracketWithin π•œ V W s x = 0 := by
72+
simp [lieBracketWithin, hV, hW]
73+
74+
lemma lieBracket_eq_zero_of_eq_zero (hV : V x = 0) (hW : W x = 0) :
75+
lieBracket π•œ V W x = 0 := by
76+
simp [lieBracket, hV, hW]
77+
78+
lemma lieBracketWithin_smul_left {c : π•œ} (hV : DifferentiableWithinAt π•œ V s x)
79+
(hs : UniqueDiffWithinAt π•œ s x) :
80+
lieBracketWithin π•œ (c β€’ V) W s x =
81+
c β€’ lieBracketWithin π•œ V W s x := by
82+
simp only [lieBracketWithin, Pi.add_apply, map_add, Pi.smul_apply, map_smul, smul_sub]
83+
rw [fderivWithin_const_smul' hs hV]
84+
rfl
85+
86+
lemma lieBracket_smul_left {c : π•œ} (hV : DifferentiableAt π•œ V x) :
87+
lieBracket π•œ (c β€’ V) W x = c β€’ lieBracket π•œ V W x := by
88+
simp only [← differentiableWithinAt_univ, ← lieBracketWithin_univ] at hV ⊒
89+
exact lieBracketWithin_smul_left hV uniqueDiffWithinAt_univ
90+
91+
lemma lieBracketWithin_smul_right {c : π•œ} (hW : DifferentiableWithinAt π•œ W s x)
92+
(hs : UniqueDiffWithinAt π•œ s x) :
93+
lieBracketWithin π•œ V (c β€’ W) s x =
94+
c β€’ lieBracketWithin π•œ V W s x := by
95+
simp only [lieBracketWithin, Pi.add_apply, map_add, Pi.smul_apply, map_smul, smul_sub]
96+
rw [fderivWithin_const_smul' hs hW]
97+
rfl
98+
99+
lemma lieBracket_smul_right {c : π•œ} (hW : DifferentiableAt π•œ W x) :
100+
lieBracket π•œ V (c β€’ W) x = c β€’ lieBracket π•œ V W x := by
101+
simp only [← differentiableWithinAt_univ, ← lieBracketWithin_univ] at hW ⊒
102+
exact lieBracketWithin_smul_right hW uniqueDiffWithinAt_univ
103+
104+
lemma lieBracketWithin_add_left (hV : DifferentiableWithinAt π•œ V s x)
105+
(hV₁ : DifferentiableWithinAt π•œ V₁ s x) (hs : UniqueDiffWithinAt π•œ s x) :
106+
lieBracketWithin π•œ (V + V₁) W s x =
107+
lieBracketWithin π•œ V W s x + lieBracketWithin π•œ V₁ W s x := by
108+
simp only [lieBracketWithin, Pi.add_apply, map_add]
109+
rw [fderivWithin_add' hs hV hV₁, ContinuousLinearMap.add_apply]
110+
abel
111+
112+
lemma lieBracket_add_left (hV : DifferentiableAt π•œ V x) (hV₁ : DifferentiableAt π•œ V₁ x) :
113+
lieBracket π•œ (V + V₁) W x =
114+
lieBracket π•œ V W x + lieBracket π•œ V₁ W x := by
115+
simp only [lieBracket, Pi.add_apply, map_add]
116+
rw [fderiv_add' hV hV₁, ContinuousLinearMap.add_apply]
117+
abel
118+
119+
lemma lieBracketWithin_add_right (hW : DifferentiableWithinAt π•œ W s x)
120+
(hW₁ : DifferentiableWithinAt π•œ W₁ s x) (hs : UniqueDiffWithinAt π•œ s x) :
121+
lieBracketWithin π•œ V (W + W₁) s x =
122+
lieBracketWithin π•œ V W s x + lieBracketWithin π•œ V W₁ s x := by
123+
simp only [lieBracketWithin, Pi.add_apply, map_add]
124+
rw [fderivWithin_add' hs hW hW₁, ContinuousLinearMap.add_apply]
125+
abel
126+
127+
lemma lieBracket_add_right (hW : DifferentiableAt π•œ W x) (hW₁ : DifferentiableAt π•œ W₁ x) :
128+
lieBracket π•œ V (W + W₁) x =
129+
lieBracket π•œ V W x + lieBracket π•œ V W₁ x := by
130+
simp only [lieBracket, Pi.add_apply, map_add]
131+
rw [fderiv_add' hW hW₁, ContinuousLinearMap.add_apply]
132+
abel
133+
134+
lemma lieBracketWithin_swap : lieBracketWithin π•œ V W s = - lieBracketWithin π•œ W V s := by
135+
ext x; simp [lieBracketWithin]
136+
137+
lemma lieBracket_swap : lieBracket π•œ V W x = - lieBracket π•œ W V x := by
138+
simp [lieBracket]
139+
140+
@[simp] lemma lieBracketWithin_self : lieBracketWithin π•œ V V s = 0 := by
141+
ext x; simp [lieBracketWithin]
142+
143+
@[simp] lemma lieBracket_self : lieBracket π•œ V V = 0 := by
144+
ext x; simp [lieBracket]
145+
146+
lemma _root_.ContDiffWithinAt.lieBracketWithin_vectorField
147+
{m n : β„•βˆž} (hV : ContDiffWithinAt π•œ n V s x)
148+
(hW : ContDiffWithinAt π•œ n W s x) (hs : UniqueDiffOn π•œ s) (hmn : m + 1 ≀ n) (hx : x ∈ s) :
149+
ContDiffWithinAt π•œ m (lieBracketWithin π•œ V W s) s x := by
150+
apply ContDiffWithinAt.sub
151+
Β· exact ContDiffWithinAt.clm_apply (hW.fderivWithin_right hs hmn hx)
152+
(hV.of_le (le_trans le_self_add hmn))
153+
Β· exact ContDiffWithinAt.clm_apply (hV.fderivWithin_right hs hmn hx)
154+
(hW.of_le (le_trans le_self_add hmn))
155+
156+
lemma _root_.ContDiffAt.lieBracket_vectorField {m n : β„•βˆž} (hV : ContDiffAt π•œ n V x)
157+
(hW : ContDiffAt π•œ n W x) (hmn : m + 1 ≀ n) :
158+
ContDiffAt π•œ m (lieBracket π•œ V W) x := by
159+
rw [← contDiffWithinAt_univ] at hV hW ⊒
160+
simp_rw [← lieBracketWithin_univ]
161+
exact hV.lieBracketWithin_vectorField hW uniqueDiffOn_univ hmn (mem_univ _)
162+
163+
lemma _root_.ContDiffOn.lieBracketWithin_vectorField {m n : β„•βˆž} (hV : ContDiffOn π•œ n V s)
164+
(hW : ContDiffOn π•œ n W s) (hs : UniqueDiffOn π•œ s) (hmn : m + 1 ≀ n) :
165+
ContDiffOn π•œ m (lieBracketWithin π•œ V W s) s :=
166+
fun x hx ↦ (hV x hx).lieBracketWithin_vectorField (hW x hx) hs hmn hx
167+
168+
lemma _root_.ContDiff.lieBracket_vectorField {m n : β„•βˆž} (hV : ContDiff π•œ n V)
169+
(hW : ContDiff π•œ n W) (hmn : m + 1 ≀ n) :
170+
ContDiff π•œ m (lieBracket π•œ V W) :=
171+
contDiff_iff_contDiffAt.2 (fun _ ↦ hV.contDiffAt.lieBracket_vectorField hW.contDiffAt hmn)
172+
173+
theorem lieBracketWithin_of_mem_nhdsWithin (st : t ∈ 𝓝[s] x) (hs : UniqueDiffWithinAt π•œ s x)
174+
(hV : DifferentiableWithinAt π•œ V t x) (hW : DifferentiableWithinAt π•œ W t x) :
175+
lieBracketWithin π•œ V W s x = lieBracketWithin π•œ V W t x := by
176+
simp [lieBracketWithin, fderivWithin_of_mem_nhdsWithin st hs hV,
177+
fderivWithin_of_mem_nhdsWithin st hs hW]
178+
179+
theorem lieBracketWithin_subset (st : s βŠ† t) (ht : UniqueDiffWithinAt π•œ s x)
180+
(hV : DifferentiableWithinAt π•œ V t x) (hW : DifferentiableWithinAt π•œ W t x) :
181+
lieBracketWithin π•œ V W s x = lieBracketWithin π•œ V W t x :=
182+
lieBracketWithin_of_mem_nhdsWithin (nhdsWithin_mono _ st self_mem_nhdsWithin) ht hV hW
183+
184+
theorem lieBracketWithin_inter (ht : t ∈ 𝓝 x) :
185+
lieBracketWithin π•œ V W (s ∩ t) x = lieBracketWithin π•œ V W s x := by
186+
simp [lieBracketWithin, fderivWithin_inter, ht]
187+
188+
theorem lieBracketWithin_of_mem_nhds (h : s ∈ 𝓝 x) :
189+
lieBracketWithin π•œ V W s x = lieBracket π•œ V W x := by
190+
rw [← lieBracketWithin_univ, ← univ_inter s, lieBracketWithin_inter h]
191+
192+
theorem lieBracketWithin_of_isOpen (hs : IsOpen s) (hx : x ∈ s) :
193+
lieBracketWithin π•œ V W s x = lieBracket π•œ V W x :=
194+
lieBracketWithin_of_mem_nhds (hs.mem_nhds hx)
195+
196+
theorem lieBracketWithin_eq_lieBracket (hs : UniqueDiffWithinAt π•œ s x)
197+
(hV : DifferentiableAt π•œ V x) (hW : DifferentiableAt π•œ W x) :
198+
lieBracketWithin π•œ V W s x = lieBracket π•œ V W x := by
199+
simp [lieBracketWithin, lieBracket, fderivWithin_eq_fderiv, hs, hV, hW]
200+
201+
/-- Variant of `lieBracketWithin_congr_set` where one requires the sets to coincide only in
202+
the complement of a point. -/
203+
theorem lieBracketWithin_congr_set' (y : E) (h : s =αΆ [𝓝[{y}ᢜ] x] t) :
204+
lieBracketWithin π•œ V W s x = lieBracketWithin π•œ V W t x := by
205+
simp [lieBracketWithin, fderivWithin_congr_set' _ h]
206+
207+
theorem lieBracketWithin_congr_set (h : s =αΆ [𝓝 x] t) :
208+
lieBracketWithin π•œ V W s x = lieBracketWithin π•œ V W t x :=
209+
lieBracketWithin_congr_set' x <| h.filter_mono inf_le_left
210+
211+
/-- Variant of `lieBracketWithin_eventually_congr_set` where one requires the sets to coincide only
212+
in the complement of a point. -/
213+
theorem lieBracketWithin_eventually_congr_set' (y : E) (h : s =αΆ [𝓝[{y}ᢜ] x] t) :
214+
lieBracketWithin π•œ V W s =αΆ [𝓝 x] lieBracketWithin π•œ V W t :=
215+
(eventually_nhds_nhdsWithin.2 h).mono fun _ => lieBracketWithin_congr_set' y
216+
217+
theorem lieBracketWithin_eventually_congr_set (h : s =αΆ [𝓝 x] t) :
218+
lieBracketWithin π•œ V W s =αΆ [𝓝 x] lieBracketWithin π•œ V W t :=
219+
lieBracketWithin_eventually_congr_set' x <| h.filter_mono inf_le_left
220+
221+
theorem _root_.DifferentiableWithinAt.lieBracketWithin_congr_mono
222+
(hV : DifferentiableWithinAt π•œ V s x) (hVs : EqOn V₁ V t) (hVx : V₁ x = V x)
223+
(hW : DifferentiableWithinAt π•œ W s x) (hWs : EqOn W₁ W t) (hWx : W₁ x = W x)
224+
(hxt : UniqueDiffWithinAt π•œ t x) (h₁ : t βŠ† s) :
225+
lieBracketWithin π•œ V₁ W₁ t x = lieBracketWithin π•œ V W s x := by
226+
simp [lieBracketWithin, hV.fderivWithin_congr_mono, hW.fderivWithin_congr_mono, hVs, hVx,
227+
hWs, hWx, hxt, h₁]
228+
229+
theorem _root_.Filter.EventuallyEq.lieBracketWithin_vectorField_eq
230+
(hV : V₁ =αΆ [𝓝[s] x] V) (hxV : V₁ x = V x) (hW : W₁ =αΆ [𝓝[s] x] W) (hxW : W₁ x = W x) :
231+
lieBracketWithin π•œ V₁ W₁ s x = lieBracketWithin π•œ V W s x := by
232+
simp only [lieBracketWithin, hV.fderivWithin_eq hxV, hW.fderivWithin_eq hxW, hxV, hxW]
233+
234+
theorem _root_.Filter.EventuallyEq.lieBracketWithin_vectorField_eq_of_mem
235+
(hV : V₁ =αΆ [𝓝[s] x] V) (hW : W₁ =αΆ [𝓝[s] x] W) (hx : x ∈ s) :
236+
lieBracketWithin π•œ V₁ W₁ s x = lieBracketWithin π•œ V W s x :=
237+
hV.lieBracketWithin_vectorField_eq (mem_of_mem_nhdsWithin hx hV :)
238+
hW (mem_of_mem_nhdsWithin hx hW :)
239+
240+
/-- If vector fields coincide on a neighborhood of a point within a set, then the Lie brackets
241+
also coincide on a neighborhood of this point within this set. Version where one considers the Lie
242+
bracket within a subset. -/
243+
theorem _root_.Filter.EventuallyEq.lieBracketWithin_vectorField'
244+
(hV : V₁ =αΆ [𝓝[s] x] V) (hW : W₁ =αΆ [𝓝[s] x] W) (ht : t βŠ† s) :
245+
lieBracketWithin π•œ V₁ W₁ t =αΆ [𝓝[s] x] lieBracketWithin π•œ V W t := by
246+
filter_upwards [hV.fderivWithin' ht (π•œ := π•œ), hW.fderivWithin' ht (π•œ := π•œ), hV, hW]
247+
with x hV' hW' hV hW
248+
simp [lieBracketWithin, hV', hW', hV, hW]
249+
250+
protected theorem _root_.Filter.EventuallyEq.lieBracketWithin_vectorField
251+
(hV : V₁ =αΆ [𝓝[s] x] V) (hW : W₁ =αΆ [𝓝[s] x] W) :
252+
lieBracketWithin π•œ V₁ W₁ s =αΆ [𝓝[s] x] lieBracketWithin π•œ V W s :=
253+
hV.lieBracketWithin_vectorField' hW Subset.rfl
254+
255+
protected theorem _root_.Filter.EventuallyEq.lieBracketWithin_vectorField_eq_of_insert
256+
(hV : V₁ =αΆ [𝓝[insert x s] x] V) (hW : W₁ =αΆ [𝓝[insert x s] x] W) :
257+
lieBracketWithin π•œ V₁ W₁ s x = lieBracketWithin π•œ V W s x := by
258+
apply mem_of_mem_nhdsWithin (mem_insert x s) (hV.lieBracketWithin_vectorField' hW
259+
(subset_insert x s))
260+
261+
theorem _root_.Filter.EventuallyEq.lieBracketWithin_vectorField_eq_nhds
262+
(hV : V₁ =αΆ [𝓝 x] V) (hW : W₁ =αΆ [𝓝 x] W) :
263+
lieBracketWithin π•œ V₁ W₁ s x = lieBracketWithin π•œ V W s x :=
264+
(hV.filter_mono nhdsWithin_le_nhds).lieBracketWithin_vectorField_eq hV.self_of_nhds
265+
(hW.filter_mono nhdsWithin_le_nhds) hW.self_of_nhds
266+
267+
theorem lieBracketWithin_congr
268+
(hV : EqOn V₁ V s) (hVx : V₁ x = V x) (hW : EqOn W₁ W s) (hWx : W₁ x = W x) :
269+
lieBracketWithin π•œ V₁ W₁ s x = lieBracketWithin π•œ V W s x :=
270+
(hV.eventuallyEq.filter_mono inf_le_right).lieBracketWithin_vectorField_eq hVx
271+
(hW.eventuallyEq.filter_mono inf_le_right) hWx
272+
273+
/-- Version of `lieBracketWithin_congr` in which one assumes that the point belongs to the
274+
given set. -/
275+
theorem lieBracketWithin_congr' (hV : EqOn V₁ V s) (hW : EqOn W₁ W s) (hx : x ∈ s) :
276+
lieBracketWithin π•œ V₁ W₁ s x = lieBracketWithin π•œ V W s x :=
277+
lieBracketWithin_congr hV (hV hx) hW (hW hx)
278+
279+
theorem _root_.Filter.EventuallyEq.lieBracket_vectorField_eq
280+
(hV : V₁ =αΆ [𝓝 x] V) (hW : W₁ =αΆ [𝓝 x] W) :
281+
lieBracket π•œ V₁ W₁ x = lieBracket π•œ V W x := by
282+
rw [← lieBracketWithin_univ, ← lieBracketWithin_univ, hV.lieBracketWithin_vectorField_eq_nhds hW]
283+
284+
protected theorem _root_.Filter.EventuallyEq.lieBracket_vectorField
285+
(hV : V₁ =αΆ [𝓝 x] V) (hW : W₁ =αΆ [𝓝 x] W) : lieBracket π•œ V₁ W₁ =αΆ [𝓝 x] lieBracket π•œ V W := by
286+
filter_upwards [hV.eventuallyEq_nhds, hW.eventuallyEq_nhds] with y hVy hWy
287+
exact hVy.lieBracket_vectorField_eq hWy
288+
289+
/-- The Lie bracket of vector fields in vector spaces satisfies the Leibniz identity
290+
`[U, [V, W]] = [[U, V], W] + [V, [U, W]]`. -/
291+
lemma leibniz_identity_lieBracketWithin_of_isSymmSndFDerivWithinAt
292+
{U V W : E β†’ E} {s : Set E} {x : E} (hs : UniqueDiffOn π•œ s) (hx : x ∈ s)
293+
(hU : ContDiffWithinAt π•œ 2 U s x) (hV : ContDiffWithinAt π•œ 2 V s x)
294+
(hW : ContDiffWithinAt π•œ 2 W s x)
295+
(h'U : IsSymmSndFDerivWithinAt π•œ U s x) (h'V : IsSymmSndFDerivWithinAt π•œ V s x)
296+
(h'W : IsSymmSndFDerivWithinAt π•œ W s x) :
297+
lieBracketWithin π•œ U (lieBracketWithin π•œ V W s) s x =
298+
lieBracketWithin π•œ (lieBracketWithin π•œ U V s) W s x
299+
+ lieBracketWithin π•œ V (lieBracketWithin π•œ U W s) s x := by
300+
simp only [lieBracketWithin_eq, map_sub]
301+
have aux₁ {U V : E β†’ E} (hU : ContDiffWithinAt π•œ 2 U s x) (hV : ContDiffWithinAt π•œ 2 V s x) :
302+
DifferentiableWithinAt π•œ (fun x ↦ (fderivWithin π•œ V s x) (U x)) s x :=
303+
have := hV.fderivWithin_right_apply (hU.of_le one_le_two) hs le_rfl hx
304+
this.differentiableWithinAt le_rfl
305+
have auxβ‚‚ {U V : E β†’ E} (hU : ContDiffWithinAt π•œ 2 U s x) (hV : ContDiffWithinAt π•œ 2 V s x) :
306+
fderivWithin π•œ (fun y ↦ (fderivWithin π•œ U s y) (V y)) s x =
307+
(fderivWithin π•œ U s x).comp (fderivWithin π•œ V s x) +
308+
(fderivWithin π•œ (fderivWithin π•œ U s) s x).flip (V x) := by
309+
refine fderivWithin_clm_apply (hs x hx) ?_ (hV.differentiableWithinAt one_le_two)
310+
exact (hU.fderivWithin_right hs le_rfl hx).differentiableWithinAt le_rfl
311+
rw [fderivWithin_sub (hs x hx) (aux₁ hV hW) (aux₁ hW hV)]
312+
rw [fderivWithin_sub (hs x hx) (aux₁ hU hV) (aux₁ hV hU)]
313+
rw [fderivWithin_sub (hs x hx) (aux₁ hU hW) (aux₁ hW hU)]
314+
rw [auxβ‚‚ hW hV, auxβ‚‚ hV hW, auxβ‚‚ hV hU, auxβ‚‚ hU hV, auxβ‚‚ hW hU, auxβ‚‚ hU hW]
315+
simp only [ContinuousLinearMap.coe_sub', Pi.sub_apply, ContinuousLinearMap.add_apply,
316+
ContinuousLinearMap.coe_comp', Function.comp_apply, ContinuousLinearMap.flip_apply, h'V.eq,
317+
h'U.eq, h'W.eq]
318+
abel
319+
320+
/-- The Lie bracket of vector fields in vector spaces satisfies the Leibniz identity
321+
`[U, [V, W]] = [[U, V], W] + [V, [U, W]]`. -/
322+
lemma leibniz_identity_lieBracketWithin [IsRCLikeNormedField π•œ] {U V W : E β†’ E} {s : Set E} {x : E}
323+
(hs : UniqueDiffOn π•œ s) (h'x : x ∈ closure (interior s)) (hx : x ∈ s)
324+
(hU : ContDiffWithinAt π•œ 2 U s x) (hV : ContDiffWithinAt π•œ 2 V s x)
325+
(hW : ContDiffWithinAt π•œ 2 W s x) :
326+
lieBracketWithin π•œ U (lieBracketWithin π•œ V W s) s x =
327+
lieBracketWithin π•œ (lieBracketWithin π•œ U V s) W s x
328+
+ lieBracketWithin π•œ V (lieBracketWithin π•œ U W s) s x := by
329+
apply leibniz_identity_lieBracketWithin_of_isSymmSndFDerivWithinAt hs hx hU hV hW
330+
Β· exact hU.isSymmSndFDerivWithinAt le_rfl hs h'x hx
331+
Β· exact hV.isSymmSndFDerivWithinAt le_rfl hs h'x hx
332+
Β· exact hW.isSymmSndFDerivWithinAt le_rfl hs h'x hx
333+
334+
/-- The Lie bracket of vector fields in vector spaces satisfies the Leibniz identity
335+
`[U, [V, W]] = [[U, V], W] + [V, [U, W]]`. -/
336+
lemma leibniz_identity_lieBracket [IsRCLikeNormedField π•œ] {U V W : E β†’ E} {x : E}
337+
(hU : ContDiffAt π•œ 2 U x) (hV : ContDiffAt π•œ 2 V x) (hW : ContDiffAt π•œ 2 W x) :
338+
lieBracket π•œ U (lieBracket π•œ V W) x =
339+
lieBracket π•œ (lieBracket π•œ U V) W x + lieBracket π•œ V (lieBracket π•œ U W) x := by
340+
simp only [← lieBracketWithin_univ, ← contDiffWithinAt_univ] at hU hV hW ⊒
341+
exact leibniz_identity_lieBracketWithin uniqueDiffOn_univ (by simp) (mem_univ _) hU hV hW
342+
343+
end VectorField

0 commit comments

Comments
Β (0)