Imports
/-
Copyright (c) 2026 Juan Jose Fernandez Morales. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Juan Jose Fernandez Morales
-/
module
public import Physlib.SpaceAndTime.Space.Derivatives.Basic
public import Physlib.SpaceAndTime.Space.Derivatives.MultiIndex
Iterated derivatives on Space d
i. Overview
This module defines iterated coordinate derivatives on Space d indexed by multi-indices.
The implementation is intentionally modest. A multi-index is first expanded into a canonical list
of coordinate directions, and the iterated derivative is then defined by repeated application of
Space.deriv along that list.
ii. Key results
Space.iteratedDeriv : iterated coordinate derivatives on Space d.
∂^[I] f : notation for the iterated derivative indexed by the multi-index I.
Space.iteratedDeriv_add, Space.iteratedDeriv_const_smul :
algebraic compatibility for smooth scalar-valued functions.
Space.iteratedDeriv_contDiff : smooth scalar-valued functions remain smooth after
iterated coordinate differentiation.
Space.tsupport_iteratedDeriv_subset :
the support of an iterated spatial derivative is contained in that of the original function.
iii. Table of contents
A. Iterated derivatives on Space d
B. Algebraic and regularity lemmas
C. Support lemmas
iv. References
@[expose] public section
A. Iterated derivatives on Space d
@[inherit_doc iteratedDeriv]
macro "∂^[" I:term "]" : term => `(iteratedDeriv $I)private lemma iteratedDerivList_contDiff (L : List (Fin d)) {f : Space d → ℝ}
(hf : ContDiff ℝ ∞ f) :
ContDiff ℝ ∞ (L.foldr (fun i g => deriv i g) f) := d:ℕL:List (Fin d)f:Space d → ℝhf:ContDiff ℝ ∞ f⊢ ContDiff ℝ ∞ (List.foldr (fun i g => deriv i g) f L)
induction L generalizing f with
d:ℕf:Space d → ℝhf:ContDiff ℝ ∞ f⊢ ContDiff ℝ ∞ (List.foldr (fun i g => deriv i g) f []) All goals completed! 🐙
d:ℕi:Fin dL:List (Fin d)ih:∀ {f : Space d → ℝ}, ContDiff ℝ ∞ f → ContDiff ℝ ∞ (List.foldr (fun i g => deriv i g) f L)f:Space d → ℝhf:ContDiff ℝ ∞ f⊢ ContDiff ℝ ∞ (List.foldr (fun i g => deriv i g) f (i :: L)) All goals completed! 🐙private lemma iteratedDerivList_add (L : List (Fin d)) {f g : Space d → ℝ}
(hf : ContDiff ℝ ∞ f) (hg : ContDiff ℝ ∞ g) :
L.foldr (fun i h => deriv i h) (f + g) =
L.foldr (fun i h => deriv i h) f + L.foldr (fun i h => deriv i h) g := d:ℕL:List (Fin d)f:Space d → ℝg:Space d → ℝhf:ContDiff ℝ ∞ fhg:ContDiff ℝ ∞ g⊢ List.foldr (fun i h => deriv i h) (f + g) L =
List.foldr (fun i h => deriv i h) f L + List.foldr (fun i h => deriv i h) g L
induction L generalizing f g with
d:ℕf:Space d → ℝg:Space d → ℝhf:ContDiff ℝ ∞ fhg:ContDiff ℝ ∞ g⊢ List.foldr (fun i h => deriv i h) (f + g) [] =
List.foldr (fun i h => deriv i h) f [] + List.foldr (fun i h => deriv i h) g [] All goals completed! 🐙
d:ℕi:Fin dL:List (Fin d)ih:∀ {f g : Space d → ℝ},
ContDiff ℝ ∞ f →
ContDiff ℝ ∞ g →
List.foldr (fun i h => deriv i h) (f + g) L =
List.foldr (fun i h => deriv i h) f L + List.foldr (fun i h => deriv i h) g Lf:Space d → ℝg:Space d → ℝhf:ContDiff ℝ ∞ fhg:ContDiff ℝ ∞ g⊢ List.foldr (fun i h => deriv i h) (f + g) (i :: L) =
List.foldr (fun i h => deriv i h) f (i :: L) + List.foldr (fun i h => deriv i h) g (i :: L)
d:ℕi:Fin dL:List (Fin d)ih:∀ {f g : Space d → ℝ},
ContDiff ℝ ∞ f →
ContDiff ℝ ∞ g →
List.foldr (fun i h => deriv i h) (f + g) L =
List.foldr (fun i h => deriv i h) f L + List.foldr (fun i h => deriv i h) g Lf:Space d → ℝg:Space d → ℝhf:ContDiff ℝ ∞ fhg:ContDiff ℝ ∞ g⊢ deriv i (List.foldr (fun i h => deriv i h) f L + List.foldr (fun i h => deriv i h) g L) =
deriv i (List.foldr (fun i h => deriv i h) f L) + deriv i (List.foldr (fun i h => deriv i h) g L)
exact Space.deriv_add _ _ ((iteratedDerivList_contDiff L hf).differentiable (d:ℕi:Fin dL:List (Fin d)ih:∀ {f g : Space d → ℝ},
ContDiff ℝ ∞ f →
ContDiff ℝ ∞ g →
List.foldr (fun i h => deriv i h) (f + g) L =
List.foldr (fun i h => deriv i h) f L + List.foldr (fun i h => deriv i h) g Lf:Space d → ℝg:Space d → ℝhf:ContDiff ℝ ∞ fhg:ContDiff ℝ ∞ g⊢ ∞ ≠ 0 All goals completed! 🐙))
((iteratedDerivList_contDiff L hg).differentiable (d:ℕi:Fin dL:List (Fin d)ih:∀ {f g : Space d → ℝ},
ContDiff ℝ ∞ f →
ContDiff ℝ ∞ g →
List.foldr (fun i h => deriv i h) (f + g) L =
List.foldr (fun i h => deriv i h) f L + List.foldr (fun i h => deriv i h) g Lf:Space d → ℝg:Space d → ℝhf:ContDiff ℝ ∞ fhg:ContDiff ℝ ∞ g⊢ ∞ ≠ 0 All goals completed! 🐙))private lemma iteratedDerivList_const_smul (L : List (Fin d)) (c : ℝ) {f : Space d → ℝ}
(hf : ContDiff ℝ ∞ f) :
L.foldr (fun i h => deriv i h) (c • f) =
c • L.foldr (fun i h => deriv i h) f := d:ℕL:List (Fin d)c:ℝf:Space d → ℝhf:ContDiff ℝ ∞ f⊢ List.foldr (fun i h => deriv i h) (c • f) L = c • List.foldr (fun i h => deriv i h) f L
induction L generalizing f with
d:ℕc:ℝf:Space d → ℝhf:ContDiff ℝ ∞ f⊢ List.foldr (fun i h => deriv i h) (c • f) [] = c • List.foldr (fun i h => deriv i h) f [] All goals completed! 🐙
d:ℕc:ℝi:Fin dL:List (Fin d)ih:∀ {f : Space d → ℝ},
ContDiff ℝ ∞ f → List.foldr (fun i h => deriv i h) (c • f) L = c • List.foldr (fun i h => deriv i h) f Lf:Space d → ℝhf:ContDiff ℝ ∞ f⊢ List.foldr (fun i h => deriv i h) (c • f) (i :: L) = c • List.foldr (fun i h => deriv i h) f (i :: L)
d:ℕc:ℝi:Fin dL:List (Fin d)ih:∀ {f : Space d → ℝ},
ContDiff ℝ ∞ f → List.foldr (fun i h => deriv i h) (c • f) L = c • List.foldr (fun i h => deriv i h) f Lf:Space d → ℝhf:ContDiff ℝ ∞ f⊢ deriv i (c • List.foldr (fun i h => deriv i h) f L) = c • deriv i (List.foldr (fun i h => deriv i h) f L)
exact Space.deriv_const_smul c ((iteratedDerivList_contDiff L hf).differentiable (d:ℕc:ℝi:Fin dL:List (Fin d)ih:∀ {f : Space d → ℝ},
ContDiff ℝ ∞ f → List.foldr (fun i h => deriv i h) (c • f) L = c • List.foldr (fun i h => deriv i h) f Lf:Space d → ℝhf:ContDiff ℝ ∞ f⊢ ∞ ≠ 0 All goals completed! 🐙))@[simp]
lemma iteratedDeriv_zero [AddCommGroup M] [Module ℝ M] [TopologicalSpace M]
(f : Space d → M) : ∂^[0] f = f := M:Typed:ℕinst✝²:AddCommGroup Minst✝¹:Module ℝ Minst✝:TopologicalSpace Mf:Space d → M⊢ iteratedDeriv 0 f = f
All goals completed! 🐙@[simp]
lemma iteratedDeriv_increment_zero [NeZero d] [AddCommGroup M] [Module ℝ M] [TopologicalSpace M]
(I : MultiIndex d) (f : Space d → M) :
∂^[MultiIndex.increment I 0] f = ∂[0] (∂^[I] f) := M:Typed:ℕinst✝³:NeZero dinst✝²:AddCommGroup Minst✝¹:Module ℝ Minst✝:TopologicalSpace MI:MultiIndex df:Space d → M⊢ iteratedDeriv (I.increment 0) f = deriv 0 (iteratedDeriv I f)
M:Typeinst✝³:AddCommGroup Minst✝²:Module ℝ Minst✝¹:TopologicalSpace Mn:ℕinst✝:NeZero n.succI:MultiIndex n.succf:Space n.succ → M⊢ iteratedDeriv (I.increment 0) f = deriv 0 (iteratedDeriv I f)
All goals completed! 🐙@[simp]
lemma iteratedDeriv_single [AddCommGroup M] [Module ℝ M] [TopologicalSpace M]
(i : Fin d) (f : Space d → M) :
∂^[MultiIndex.increment 0 i] f = ∂[i] f := M:Typed:ℕinst✝²:AddCommGroup Minst✝¹:Module ℝ Minst✝:TopologicalSpace Mi:Fin df:Space d → M⊢ iteratedDeriv (MultiIndex.increment 0 i) f = deriv i f
All goals completed! 🐙lemma iteratedDeriv_add (I : MultiIndex d) {f g : Space d → ℝ}
(hf : ContDiff ℝ ∞ f) (hg : ContDiff ℝ ∞ g) :
∂^[I] (f + g) = ∂^[I] f + ∂^[I] g := d:ℕI:MultiIndex df:Space d → ℝg:Space d → ℝhf:ContDiff ℝ ∞ fhg:ContDiff ℝ ∞ g⊢ iteratedDeriv I (f + g) = iteratedDeriv I f + iteratedDeriv I g
All goals completed! 🐙lemma iteratedDeriv_const_smul (I : MultiIndex d) (c : ℝ) {f : Space d → ℝ}
(hf : ContDiff ℝ ∞ f) :
∂^[I] (c • f) = c • ∂^[I] f := d:ℕI:MultiIndex dc:ℝf:Space d → ℝhf:ContDiff ℝ ∞ f⊢ iteratedDeriv I (c • f) = c • iteratedDeriv I f
All goals completed! 🐙Iterated spatial derivatives preserve smoothness for scalar-valued functions.
lemma iteratedDeriv_contDiff (I : MultiIndex d) {f : Space d → ℝ}
(hf : ContDiff ℝ ∞ f) :
ContDiff ℝ ∞ (∂^[I] f) := d:ℕI:MultiIndex df:Space d → ℝhf:ContDiff ℝ ∞ f⊢ ContDiff ℝ ∞ (iteratedDeriv I f)
All goals completed! 🐙The topological support of a spatial derivative is contained in that of the original function.
lemma tsupport_deriv_subset (i : Fin d) {f : Space d → ℝ} :
tsupport (deriv i f) ⊆ tsupport f := d:ℕi:Fin df:Space d → ℝ⊢ tsupport (deriv i f) ⊆ tsupport f
All goals completed! 🐙private lemma iteratedDerivList_commute_deriv (L : List (Fin d)) (i : Fin d)
{f : Space d → ℝ} (hf : ContDiff ℝ ∞ f) :
L.foldr (fun j g => deriv j g) (deriv i f) =
deriv i (L.foldr (fun j g => deriv j g) f) := d:ℕL:List (Fin d)i:Fin df:Space d → ℝhf:ContDiff ℝ ∞ f⊢ List.foldr (fun j g => deriv j g) (deriv i f) L = deriv i (List.foldr (fun j g => deriv j g) f L)
induction L generalizing f with
d:ℕi:Fin df:Space d → ℝhf:ContDiff ℝ ∞ f⊢ List.foldr (fun j g => deriv j g) (deriv i f) [] = deriv i (List.foldr (fun j g => deriv j g) f []) All goals completed! 🐙
d:ℕi:Fin dj:Fin dL:List (Fin d)ih:∀ {f : Space d → ℝ},
ContDiff ℝ ∞ f → List.foldr (fun j g => deriv j g) (deriv i f) L = deriv i (List.foldr (fun j g => deriv j g) f L)f:Space d → ℝhf:ContDiff ℝ ∞ f⊢ List.foldr (fun j g => deriv j g) (deriv i f) (j :: L) = deriv i (List.foldr (fun j g => deriv j g) f (j :: L))
d:ℕi:Fin dj:Fin dL:List (Fin d)ih:∀ {f : Space d → ℝ},
ContDiff ℝ ∞ f → List.foldr (fun j g => deriv j g) (deriv i f) L = deriv i (List.foldr (fun j g => deriv j g) f L)f:Space d → ℝhf:ContDiff ℝ ∞ f⊢ deriv j (deriv i (List.foldr (fun j g => deriv j g) f L)) = deriv i (deriv j (List.foldr (fun j g => deriv j g) f L))
All goals completed! 🐙An extra spatial derivative commutes with iterated spatial derivatives for smooth scalar-valued functions.
lemma deriv_iteratedDeriv_commute (i : Fin d) (I : MultiIndex d) {f : Space d → ℝ}
(hf : ContDiff ℝ ∞ f) :
deriv i (∂^[I] f) = ∂^[I] (deriv i f) := d:ℕi:Fin dI:MultiIndex df:Space d → ℝhf:ContDiff ℝ ∞ f⊢ deriv i (iteratedDeriv I f) = iteratedDeriv I (deriv i f)
All goals completed! 🐙private lemma tsupport_iteratedDerivList_subset (L : List (Fin d)) {f : Space d → ℝ} :
tsupport (L.foldr (fun i g => deriv i g) f) ⊆ tsupport f := d:ℕL:List (Fin d)f:Space d → ℝ⊢ tsupport (List.foldr (fun i g => deriv i g) f L) ⊆ tsupport f
induction L generalizing f with
d:ℕf:Space d → ℝ⊢ tsupport (List.foldr (fun i g => deriv i g) f []) ⊆ tsupport f All goals completed! 🐙
d:ℕi:Fin dL:List (Fin d)ih:∀ {f : Space d → ℝ}, tsupport (List.foldr (fun i g => deriv i g) f L) ⊆ tsupport ff:Space d → ℝ⊢ tsupport (List.foldr (fun i g => deriv i g) f (i :: L)) ⊆ tsupport f All goals completed! 🐙The topological support of an iterated spatial derivative is contained in that of the original function.
lemma tsupport_iteratedDeriv_subset (I : MultiIndex d) {f : Space d → ℝ} :
tsupport (∂^[I] f) ⊆ tsupport f := d:ℕI:MultiIndex df:Space d → ℝ⊢ tsupport (iteratedDeriv I f) ⊆ tsupport f
All goals completed! 🐙An iterated spatial derivative vanishes outside the topological support of the original function.
lemma iteratedDeriv_eq_zero_of_notMem_tsupport (I : MultiIndex d) {f : Space d → ℝ} {x : Space d}
(hx : x ∉ tsupport f) :
∂^[I] f x = 0 :=
image_eq_zero_of_notMem_tsupport fun h => hx (tsupport_iteratedDeriv_subset I h)