@@ -43,6 +43,7 @@ usual formulas (and existence assertions) for the derivative of
43
43
* multiplication of a function by a scalar function
44
44
* multiplication of two scalar functions
45
45
* composition of functions (the chain rule)
46
+ * inverse function (assuming that it exists; the inverse function theorem is in `inverse.lean`)
46
47
47
48
For most binary operations we also define `const_op` and `op_const` theorems for the cases when
48
49
the first or second argument is a constant. This makes writing chains of `has_deriv_at`'s easier,
@@ -346,14 +347,14 @@ lemma has_fderiv_at_filter.is_O_sub (h : has_fderiv_at_filter f f' x L) :
346
347
is_O (λ x', f x' - f x) (λ x', x' - x) L :=
347
348
h.is_O.congr_of_sub.2 (f'.is_O_sub _ _)
348
349
349
- lemma has_strict_fderiv_at.has_fderiv_at (hf : has_strict_fderiv_at f f' x) :
350
+ protected lemma has_strict_fderiv_at.has_fderiv_at (hf : has_strict_fderiv_at f f' x) :
350
351
has_fderiv_at f f' x :=
351
352
begin
352
353
rw [has_fderiv_at, has_fderiv_at_filter, is_o_iff],
353
354
exact (λ c hc, tendsto_id.prod_mk_nhds tendsto_const_nhds (is_o_iff.1 hf hc))
354
355
end
355
356
356
- lemma has_strict_fderiv_at.differentiable_at (hf : has_strict_fderiv_at f f' x) :
357
+ protected lemma has_strict_fderiv_at.differentiable_at (hf : has_strict_fderiv_at f f' x) :
357
358
differentiable_at 𝕜 f x :=
358
359
hf.has_fderiv_at.differentiable_at
359
360
@@ -563,10 +564,22 @@ lemma differentiable_on.continuous_on (h : differentiable_on 𝕜 f s) : continu
563
564
lemma differentiable.continuous (h : differentiable 𝕜 f) : continuous f :=
564
565
continuous_iff_continuous_at.2 $ λx, (h x).continuous_at
565
566
566
- lemma has_strict_fderiv_at.continuous_at (hf : has_strict_fderiv_at f f' x) :
567
+ protected lemma has_strict_fderiv_at.continuous_at (hf : has_strict_fderiv_at f f' x) :
567
568
continuous_at f x :=
568
569
hf.has_fderiv_at.continuous_at
569
570
571
+ lemma has_strict_fderiv_at.is_O_sub_rev {f' : E ≃L[𝕜] F}
572
+ (hf : has_strict_fderiv_at f (f' : E →L[𝕜] F) x) :
573
+ is_O (λ p : E × E, p.1 - p.2 ) (λ p : E × E, f p.1 - f p.2 ) (𝓝 (x, x)) :=
574
+ ((f'.is_O_comp_rev _ _).trans (hf.trans_is_O (f'.is_O_comp_rev _ _)).right_is_O_add).congr
575
+ (λ _, rfl) (λ _, sub_add_cancel _ _)
576
+
577
+ lemma has_fderiv_at_filter.is_O_sub_rev {f' : E ≃L[𝕜] F}
578
+ (hf : has_fderiv_at_filter f (f' : E →L[𝕜] F) x L) :
579
+ is_O (λ x', x' - x) (λ x', f x' - f x) L :=
580
+ ((f'.is_O_sub_rev _ _).trans (hf.trans_is_O (f'.is_O_sub_rev _ _)).right_is_O_add).congr
581
+ (λ _, rfl) (λ _, sub_add_cancel _ _)
582
+
570
583
end continuous
571
584
572
585
section congr
@@ -980,7 +993,7 @@ lemma differentiable.comp_differentiable_on {g : F → G} (hg : differentiable
980
993
(differentiable_on_univ.2 hg).comp hf (by simp)
981
994
982
995
/-- The chain rule for derivatives in the sense of strict differentiability. -/
983
- lemma has_strict_fderiv_at.comp {g : F → G} {g' : F →L[𝕜] G}
996
+ protected lemma has_strict_fderiv_at.comp {g : F → G} {g' : F →L[𝕜] G}
984
997
(hg : has_strict_fderiv_at g g' (f x)) (hf : has_strict_fderiv_at f f' x) :
985
998
has_strict_fderiv_at (λ x, g (f x)) (g'.comp f') x :=
986
999
((hg.comp_tendsto (hf.continuous_at.prod_map' hf.continuous_at)).trans_is_O hf.is_O_sub).triangle $
@@ -994,7 +1007,7 @@ section cartesian_product
994
1007
section prod
995
1008
variables {f₂ : E → G} {f₂' : E →L[𝕜] G}
996
1009
997
- lemma has_strict_fderiv_at.prod
1010
+ protected lemma has_strict_fderiv_at.prod
998
1011
(hf₁ : has_strict_fderiv_at f₁ f₁' x) (hf₂ : has_strict_fderiv_at f₂ f₂' x) :
999
1012
has_strict_fderiv_at (λx, (f₁ x, f₂ x)) (continuous_linear_map.prod f₁' f₂') x :=
1000
1013
hf₁.prod_left hf₂
@@ -2064,6 +2077,58 @@ end
2064
2077
2065
2078
end continuous_linear_equiv
2066
2079
2080
+ /-- If `f (g y) = y` for `y` in some neighborhood of `a`, `g` is continuous at `a`, and `f` has an
2081
+ invertible derivative `f'` at `g a` in the strict sense, then `g` has the derivative `f'⁻¹` at `a`
2082
+ in the strict sense.
2083
+
2084
+ This is one of the easy parts of the inverse function theorem: it assumes that we already have an
2085
+ inverse function. -/
2086
+ theorem has_strict_fderiv_at.of_local_left_inverse {f : E → F} {f' : E ≃L[𝕜] F} {g : F → E} {a : F}
2087
+ (hg : continuous_at g a) (hf : has_strict_fderiv_at f (f' : E →L[𝕜] F) (g a))
2088
+ (hfg : ∀ᶠ y in 𝓝 a, f (g y) = y) :
2089
+ has_strict_fderiv_at g (f'.symm : F →L[𝕜] E) a :=
2090
+ begin
2091
+ replace hg := hg.prod_map' hg,
2092
+ replace hfg := hfg.prod_mk_nhds hfg,
2093
+ have : is_O (λ p : F × F, g p.1 - g p.2 - f'.symm (p.1 - p.2 ))
2094
+ (λ p : F × F, f' (g p.1 - g p.2 ) - (p.1 - p.2 )) (𝓝 (a, a)),
2095
+ { refine ((f'.symm : F →L[𝕜] E).is_O_comp _ _).congr (λ x, _) (λ _, rfl),
2096
+ simp },
2097
+ refine this.trans_is_o _, clear this ,
2098
+ refine ((hf.comp_tendsto hg).symm.congr' (hfg.mono _)
2099
+ (eventually_of_forall _ $ λ _, rfl)).trans_is_O _,
2100
+ { rintros p ⟨hp1, hp2⟩,
2101
+ simp [hp1, hp2] },
2102
+ { refine (hf.is_O_sub_rev.comp_tendsto hg).congr'
2103
+ (eventually_of_forall _ $ λ _, rfl) (hfg.mono _),
2104
+ rintros p ⟨hp1, hp2⟩,
2105
+ simp only [(∘), hp1, hp2] }
2106
+ end
2107
+
2108
+ /-- If `f (g y) = y` for `y` in some neighborhood of `a`, `g` is continuous at `a`, and `f` has an
2109
+ invertible derivative `f'` at `g a`, then `g` has the derivative `f'⁻¹` at `a`.
2110
+
2111
+ This is one of the easy parts of the inverse function theorem: it assumes that we already have
2112
+ an inverse function. -/
2113
+ theorem has_fderiv_at.of_local_left_inverse {f : E → F} {f' : E ≃L[𝕜] F} {g : F → E} {a : F}
2114
+ (hg : continuous_at g a) (hf : has_fderiv_at f (f' : E →L[𝕜] F) (g a))
2115
+ (hfg : ∀ᶠ y in 𝓝 a, f (g y) = y) :
2116
+ has_fderiv_at g (f'.symm : F →L[𝕜] E) a :=
2117
+ begin
2118
+ have : is_O (λ x : F, g x - g a - f'.symm (x - a)) (λ x : F, f' (g x - g a) - (x - a)) (𝓝 a),
2119
+ { refine ((f'.symm : F →L[𝕜] E).is_O_comp _ _).congr (λ x, _) (λ _, rfl),
2120
+ simp },
2121
+ refine this.trans_is_o _, clear this ,
2122
+ refine ((hf.comp_tendsto hg).symm.congr' (hfg.mono _)
2123
+ (eventually_of_forall _ $ λ _, rfl)).trans_is_O _,
2124
+ { rintros p hp,
2125
+ simp [hp, hfg.self_of_nhds] },
2126
+ { refine (hf.is_O_sub_rev.comp_tendsto hg).congr'
2127
+ (eventually_of_forall _ $ λ _, rfl) (hfg.mono _),
2128
+ rintros p hp,
2129
+ simp only [(∘), hp, hfg.self_of_nhds] }
2130
+ end
2131
+
2067
2132
end
2068
2133
2069
2134
section
0 commit comments