nevanlinna/Nevanlinna/partialDeriv.lean

123 lines
3.7 KiB
Plaintext
Raw Normal View History

2024-05-07 09:49:56 +02:00
import Mathlib.Data.Fin.Tuple.Basic
import Mathlib.Analysis.Complex.Basic
import Mathlib.Analysis.Complex.TaylorSeries
import Mathlib.Analysis.Calculus.LineDeriv.Basic
import Mathlib.Analysis.Calculus.ContDiff.Basic
import Mathlib.Analysis.Calculus.ContDiff.Defs
import Mathlib.Analysis.Calculus.FDeriv.Basic
2024-05-07 12:13:28 +02:00
import Mathlib.Analysis.Calculus.FDeriv.Comp
import Mathlib.Analysis.Calculus.FDeriv.Linear
2024-05-07 09:49:56 +02:00
import Mathlib.Analysis.Calculus.FDeriv.Symmetric
2024-05-07 12:13:28 +02:00
noncomputable def Real.partialDeriv : → () → () :=
fun v ↦ (fun f ↦ (fun w ↦ fderiv f w v))
2024-05-07 09:49:56 +02:00
2024-05-07 16:50:57 +02:00
theorem partialDeriv_smul₁ {f : } {a : } {v : } : Real.partialDeriv (a • v) f = a • Real.partialDeriv v f := by
unfold Real.partialDeriv
conv =>
left
intro w
rw [map_smul]
theorem partialDeriv_add₁ {f : } {v₁ v₂ : } : Real.partialDeriv (v₁ + v₂) f = (Real.partialDeriv v₁ f) + (Real.partialDeriv v₂ f) := by
unfold Real.partialDeriv
conv =>
left
intro w
rw [map_add]
theorem partialDeriv_smul₂ {f : } {a v : } (h : Differentiable f) : Real.partialDeriv v (a • f) = a • Real.partialDeriv v f := by
2024-05-07 09:49:56 +02:00
unfold Real.partialDeriv
have : a • f = fun y ↦ a • f y := by rfl
rw [this]
conv =>
left
intro w
rw [fderiv_const_smul (h w)]
2024-05-07 16:50:57 +02:00
theorem partialDeriv_add₂ {f₁ f₂ : } {v : } (h₁ : Differentiable f₁) (h₂ : Differentiable f₂) : Real.partialDeriv v (f₁ + f₂) = (Real.partialDeriv v f₁) + (Real.partialDeriv v f₂) := by
2024-05-07 12:13:28 +02:00
unfold Real.partialDeriv
have : f₁ + f₂ = fun y ↦ f₁ y + f₂ y := by rfl
rw [this]
conv =>
left
intro w
left
rw [fderiv_add (h₁ w) (h₂ w)]
2024-05-07 16:50:57 +02:00
theorem partialDeriv_compContLin {f : } {l : →L[] } {v : } (h : Differentiable f) : Real.partialDeriv v (l ∘ f) = l ∘ Real.partialDeriv v f := by
2024-05-07 12:13:28 +02:00
unfold Real.partialDeriv
conv =>
left
intro w
left
rw [fderiv.comp w (ContinuousLinearMap.differentiableAt l) (h w)]
simp
rfl
2024-05-07 09:49:56 +02:00
theorem partialDeriv_contDiff {n : } {f : } (h : ContDiff (n + 1) f) : ∀ v : , ContDiff n (Real.partialDeriv v f) := by
unfold Real.partialDeriv
intro v
let A := (contDiff_succ_iff_fderiv.1 h).right
simp at A
have : (fun w => (fderiv f w) v) = (fun f => f v) ∘ (fun w => (fderiv f w)) := by
rfl
rw [this]
refine ContDiff.comp ?hg A
refine ContDiff.of_succ ?hg.h
refine ContDiff.clm_apply ?hg.h.hf ?hg.h.hg
exact contDiff_id
exact contDiff_const
2024-05-07 10:16:23 +02:00
2024-05-07 12:13:28 +02:00
lemma partialDeriv_fderiv {f : } (hf : ContDiff 2 f) (z a b : ) :
fderiv (fderiv f) z b a = Real.partialDeriv b (Real.partialDeriv a f) z := by
unfold Real.partialDeriv
2024-05-07 10:16:23 +02:00
rw [fderiv_clm_apply]
· simp
· exact (contDiff_succ_iff_fderiv.1 hf).2.differentiable le_rfl z
· simp
theorem partialDeriv_comm {f : } (h : ContDiff 2 f) :
∀ v₁ v₂ : , Real.partialDeriv v₁ (Real.partialDeriv v₂ f) = Real.partialDeriv v₂ (Real.partialDeriv v₁ f) := by
intro v₁ v₂
funext z
2024-05-07 12:13:28 +02:00
have derivSymm :
(fderiv (fun w => fderiv f w) z) v₁ v₂ = (fderiv (fun w => fderiv f w) z) v₂ v₁ := by
2024-05-07 10:16:23 +02:00
2024-05-07 12:13:28 +02:00
let f' := fderiv f
have h₀ : ∀ y, HasFDerivAt f (f' y) y := by
intro y
exact DifferentiableAt.hasFDerivAt ((h.differentiable one_le_two) y)
2024-05-07 10:16:23 +02:00
2024-05-07 12:13:28 +02:00
let f'' := (fderiv f' z)
have h₁ : HasFDerivAt f' f'' z := by
apply DifferentiableAt.hasFDerivAt
apply (contDiff_succ_iff_fderiv.1 h).right.differentiable (Submonoid.oneLE.proof_2 ℕ∞)
apply second_derivative_symmetric h₀ h₁ v₁ v₂
rw [← partialDeriv_fderiv h z v₂ v₁]
rw [derivSymm]
rw [partialDeriv_fderiv h z v₁ v₂]