Zulip Chat Archive
Stream: new members
Topic: Using iterated_fderiv
Zhangir Azerbayev (Jun 30 2020 at 20:53):
I'm trying to state that the second derivative is symmetric (or a special case of this, by mathlib standards).
variable f : ℝ × ℝ → ℝ
theorem partial_symm (h : times_cont_diff ℝ 2 f) (p : ℝ × ℝ) :
∀ v w : ℝ × ℝ, iterated_fderiv ℝ 2 f p (v, w) = iterated_fderiv ℝ 2 f p (w, v) := sorry
I'm getting an error saying that my (v, w)
should have type Π (i : fin 2), (λ (i : fin 2), ℝ × ℝ) i
. What is this type, and how do I construct a term of that type?
Heather Macbeth (Jun 30 2020 at 21:18):
With the caveat that I have never used these libraries, I might suggest
variables {E : Type*} [normed_group E] [normed_space ℝ E]
variable f : E → ℝ
theorem partial_symm (h : times_cont_diff ℝ 2 f) (p : E)
(σ : equiv.perm (fin 2)) (v : (fin 2) → E) :
iterated_fderiv ℝ 2 f p (v ∘ σ) = iterated_fderiv ℝ 2 f p v
Zhangir Azerbayev (Jun 30 2020 at 22:54):
Thank you @Heather Macbeth .
Patrick Massot (Jun 30 2020 at 23:03):
Just to make sure things are clear: Heather gave you a more general statement than what you wanted, since E
could have any dimension (even infinite). What you tried to state is:
import analysis.calculus.times_cont_diff
def swap : fin 2 → fin 2 := λ i, if i = 0 then 1 else 0
variable f : ℝ × ℝ → ℝ
theorem partial_symm (h : times_cont_diff ℝ 2 f) (p : ℝ × ℝ) :
∀ v : fin 2 → ℝ × ℝ, iterated_fderiv ℝ 2 f p v = iterated_fderiv ℝ 2 f p (v ∘ swap) :=
sorry
Patrick Massot (Jun 30 2020 at 23:05):
I also used swap
instead of a general permutation of as Heather did, but this is of course a trivial change, contrary to going from dimension 2 to arbitrary dimension.
Heather Macbeth (Jun 30 2020 at 23:11):
I used a general permutation to conceal the fact that I did not know how write down swap
!
Alex J. Best (Jul 01 2020 at 00:03):
There is swap as a perm also in data.equiv.basic
, which might have some useful lemmas proved about it.
So you can do
import data.equiv.basic
import analysis.calculus.times_cont_diff
open equiv
variable f : ℝ × ℝ → ℝ
theorem partial_symm (h : times_cont_diff ℝ 2 f) (p : ℝ × ℝ) :
∀ v : fin 2 → ℝ × ℝ, iterated_fderiv ℝ 2 f p v = iterated_fderiv ℝ 2 f p (v ∘ swap 0 1) :=
sorry
Victor Tsynkov (Jul 01 2020 at 10:44):
Not sure I understand the arguments in iterated_fderiv
and there aren't many comments in mathlib. Please help me clarify: in iterated_fderiv ℝ 2 f p v
the point where the derivative is evaluated is p
? If that is true, why not rather use permutations on finset.range n
to indicate what derivative is taken. To make a connection between the present choice and usual notation, what is v
going to be for example if one needs d^2/dx^2
versus d^2/dxdy
? Sorry if I miss something obvious here.
Sebastien Gouezel (Jul 01 2020 at 10:51):
The derivative in mathlib is the general notion of Fréchet derivative, i.e., a linear map approximating the original map around a point. So, we are not talking of derivatives in a specific directions, but rather in all directions simultaneously. The derivative in direction a
is fderiv k f p a
. In the same way, the iterated derivative is a multilinear map, taking all directions into account at the same time. So, if you want to compute the second derivative in directions a
and b
, you write iterated_fderiv k 2 f p v
, where v = (a, b)
(except that it is seen as a function from fin 2
to your space E
, instead of an element of E x E
, as this is the point of view that generalizes well to higher derivatives).
Mario Carneiro (Jul 01 2020 at 10:53):
There is a discussion of the meanings of the arguments in the header comment of https://leanprover-community.github.io/mathlib_docs/analysis/calculus/times_cont_diff.html
Mario Carneiro (Jul 01 2020 at 10:55):
So the answer to the question is that v
should be (0 -> (1, 0), 1 -> (1, 0))
for d^2/dx^2
and (0 -> (1, 0), 1 -> (0, 1))
for d^2/dxdy
, where (0 -> a, 1 -> b)
is the function on fin 2
taking 0 to a and 1 to b
Victor Tsynkov (Jul 01 2020 at 10:58):
Mario Carneiro said:
So the answer to the question is that
v
should be(0 -> (1, 0), 1 -> (1, 0))
ford^2/dx^2
and(0 -> (1, 0), 1 -> (0, 1))
ford^2/dxdy
, where(0 -> a, 1 -> b)
is the function onfin 2
taking 0 to a and 1 to b
This is the part I was missing. Thank you!
Victor Tsynkov (Jul 03 2020 at 09:56):
Mario Carneiro said:
There is a discussion of the meanings of the arguments in the header comment of https://leanprover-community.github.io/mathlib_docs/analysis/calculus/times_cont_diff.html
Maybe it's because I'm not a mathematician, but it seems to me that exactly the part that is more difficult to understand, about what the map v
is, is missing from those explanations.
Jalex Stark (Jul 03 2020 at 14:01):
reading mathlib is not supposed to be an efficient way to learn multivariable calculus
Sebastien Gouezel (Jul 03 2020 at 15:33):
Jalex Stark said:
reading mathlib is not supposed to be an efficient way to learn multivariable calculus
I don't read it this way. Instead, I see that we are missing a whole API around partial derivatives, and we will definitely need to add it some day, because this is the way many people approach and use calculus.
Last updated: Dec 20 2023 at 11:08 UTC