@@ -92,6 +92,7 @@ variables {𝕜 : Type*} [nondiscrete_normed_field 𝕜]
92
92
variables {E : Type *} [normed_group E] [normed_space 𝕜 E]
93
93
variables {F : Type *} [normed_group F] [normed_space 𝕜 F]
94
94
variables {G : Type *} [normed_group G] [normed_space 𝕜 G]
95
+ variables {G' : Type *} [normed_group G'] [normed_space 𝕜 G']
95
96
96
97
/-- A function `f` has the continuous linear map `f'` as derivative along the filter `L` if
97
98
`f x' = f x + f' (x' - x) + o (x' - x)` when `x'` converges along the filter `L`. This definition
@@ -642,6 +643,10 @@ end congr
642
643
section id
643
644
/-! ### Derivative of the identity -/
644
645
646
+ theorem has_strict_fderiv_at_id (x : E) :
647
+ has_strict_fderiv_at id (id : E →L[𝕜] E) x :=
648
+ (is_o_zero _ _).congr_left $ by simp
649
+
645
650
theorem has_fderiv_at_filter_id (x : E) (L : filter E) :
646
651
has_fderiv_at_filter id (id : E →L[𝕜] E) x L :=
647
652
(is_o_zero _ _).congr_left $ by simp
@@ -807,68 +812,9 @@ h.differentiable.differentiable_on
807
812
808
813
end continuous_linear_map
809
814
810
- section cartesian_product
811
- /-! ### Derivative of the cartesian product of two functions -/
812
-
813
- variables {f₂ : E → G} {f₂' : E →L[𝕜] G}
814
-
815
- lemma has_strict_fderiv_at.prod
816
- (hf₁ : has_strict_fderiv_at f₁ f₁' x) (hf₂ : has_strict_fderiv_at f₂ f₂' x) :
817
- has_strict_fderiv_at (λx, (f₁ x, f₂ x)) (continuous_linear_map.prod f₁' f₂') x :=
818
- hf₁.prod_left hf₂
819
-
820
- lemma has_fderiv_at_filter.prod
821
- (hf₁ : has_fderiv_at_filter f₁ f₁' x L) (hf₂ : has_fderiv_at_filter f₂ f₂' x L) :
822
- has_fderiv_at_filter (λx, (f₁ x, f₂ x)) (continuous_linear_map.prod f₁' f₂') x L :=
823
- hf₁.prod_left hf₂
824
-
825
- lemma has_fderiv_within_at.prod
826
- (hf₁ : has_fderiv_within_at f₁ f₁' s x) (hf₂ : has_fderiv_within_at f₂ f₂' s x) :
827
- has_fderiv_within_at (λx, (f₁ x, f₂ x)) (continuous_linear_map.prod f₁' f₂') s x :=
828
- hf₁.prod hf₂
829
-
830
- lemma has_fderiv_at.prod (hf₁ : has_fderiv_at f₁ f₁' x) (hf₂ : has_fderiv_at f₂ f₂' x) :
831
- has_fderiv_at (λx, (f₁ x, f₂ x)) (continuous_linear_map.prod f₁' f₂') x :=
832
- hf₁.prod hf₂
833
-
834
- lemma differentiable_within_at.prod
835
- (hf₁ : differentiable_within_at 𝕜 f₁ s x) (hf₂ : differentiable_within_at 𝕜 f₂ s x) :
836
- differentiable_within_at 𝕜 (λx:E, (f₁ x, f₂ x)) s x :=
837
- (hf₁.has_fderiv_within_at.prod hf₂.has_fderiv_within_at).differentiable_within_at
838
-
839
- lemma differentiable_at.prod (hf₁ : differentiable_at 𝕜 f₁ x) (hf₂ : differentiable_at 𝕜 f₂ x) :
840
- differentiable_at 𝕜 (λx:E, (f₁ x, f₂ x)) x :=
841
- (hf₁.has_fderiv_at.prod hf₂.has_fderiv_at).differentiable_at
842
-
843
- lemma differentiable_on.prod (hf₁ : differentiable_on 𝕜 f₁ s) (hf₂ : differentiable_on 𝕜 f₂ s) :
844
- differentiable_on 𝕜 (λx:E, (f₁ x, f₂ x)) s :=
845
- λx hx, differentiable_within_at.prod (hf₁ x hx) (hf₂ x hx)
846
-
847
- lemma differentiable.prod (hf₁ : differentiable 𝕜 f₁) (hf₂ : differentiable 𝕜 f₂) :
848
- differentiable 𝕜 (λx:E, (f₁ x, f₂ x)) :=
849
- λ x, differentiable_at.prod (hf₁ x) (hf₂ x)
850
-
851
- lemma differentiable_at.fderiv_prod
852
- (hf₁ : differentiable_at 𝕜 f₁ x) (hf₂ : differentiable_at 𝕜 f₂ x) :
853
- fderiv 𝕜 (λx:E, (f₁ x, f₂ x)) x =
854
- continuous_linear_map.prod (fderiv 𝕜 f₁ x) (fderiv 𝕜 f₂ x) :=
855
- has_fderiv_at.fderiv (has_fderiv_at.prod hf₁.has_fderiv_at hf₂.has_fderiv_at)
856
-
857
- lemma differentiable_at.fderiv_within_prod
858
- (hf₁ : differentiable_within_at 𝕜 f₁ s x) (hf₂ : differentiable_within_at 𝕜 f₂ s x)
859
- (hxs : unique_diff_within_at 𝕜 s x) :
860
- fderiv_within 𝕜 (λx:E, (f₁ x, f₂ x)) s x =
861
- continuous_linear_map.prod (fderiv_within 𝕜 f₁ s x) (fderiv_within 𝕜 f₂ s x) :=
862
- begin
863
- apply has_fderiv_within_at.fderiv_within _ hxs,
864
- exact has_fderiv_within_at.prod hf₁.has_fderiv_within_at hf₂.has_fderiv_within_at
865
- end
866
-
867
- end cartesian_product
868
-
869
815
section composition
870
- /-! ###
871
- Derivative of the composition of two functions
816
+ /-!
817
+ ### Derivative of the composition of two functions
872
818
873
819
For composition lemmas, we put x explicit to help the elaborator, as otherwise Lean tends to
874
820
get confused since there are too many possibilities for composition -/
@@ -953,7 +899,7 @@ lemma differentiable_at.comp_differentiable_within_at {g : F → G}
953
899
954
900
lemma fderiv_within.comp {g : F → G} {t : set F}
955
901
(hg : differentiable_within_at 𝕜 g t (f x)) (hf : differentiable_within_at 𝕜 f s x)
956
- (h : s ⊆ f ⁻¹' t) (hxs : unique_diff_within_at 𝕜 s x) :
902
+ (h : maps_to f s t) (hxs : unique_diff_within_at 𝕜 s x) :
957
903
fderiv_within 𝕜 (g ∘ f) s x = (fderiv_within 𝕜 g t (f x)).comp (fderiv_within 𝕜 f s x) :=
958
904
begin
959
905
apply has_fderiv_within_at.fderiv_within _ hxs,
@@ -1000,6 +946,245 @@ lemma has_strict_fderiv_at.comp {g : F → G} {g' : F →L[𝕜] G}
1000
946
1001
947
end composition
1002
948
949
+ section cartesian_product
950
+ /-! ### Derivative of the cartesian product of two functions -/
951
+
952
+ section prod
953
+ variables {f₂ : E → G} {f₂' : E →L[𝕜] G}
954
+
955
+ lemma has_strict_fderiv_at.prod
956
+ (hf₁ : has_strict_fderiv_at f₁ f₁' x) (hf₂ : has_strict_fderiv_at f₂ f₂' x) :
957
+ has_strict_fderiv_at (λx, (f₁ x, f₂ x)) (continuous_linear_map.prod f₁' f₂') x :=
958
+ hf₁.prod_left hf₂
959
+
960
+ lemma has_fderiv_at_filter.prod
961
+ (hf₁ : has_fderiv_at_filter f₁ f₁' x L) (hf₂ : has_fderiv_at_filter f₂ f₂' x L) :
962
+ has_fderiv_at_filter (λx, (f₁ x, f₂ x)) (continuous_linear_map.prod f₁' f₂') x L :=
963
+ hf₁.prod_left hf₂
964
+
965
+ lemma has_fderiv_within_at.prod
966
+ (hf₁ : has_fderiv_within_at f₁ f₁' s x) (hf₂ : has_fderiv_within_at f₂ f₂' s x) :
967
+ has_fderiv_within_at (λx, (f₁ x, f₂ x)) (continuous_linear_map.prod f₁' f₂') s x :=
968
+ hf₁.prod hf₂
969
+
970
+ lemma has_fderiv_at.prod (hf₁ : has_fderiv_at f₁ f₁' x) (hf₂ : has_fderiv_at f₂ f₂' x) :
971
+ has_fderiv_at (λx, (f₁ x, f₂ x)) (continuous_linear_map.prod f₁' f₂') x :=
972
+ hf₁.prod hf₂
973
+
974
+ lemma differentiable_within_at.prod
975
+ (hf₁ : differentiable_within_at 𝕜 f₁ s x) (hf₂ : differentiable_within_at 𝕜 f₂ s x) :
976
+ differentiable_within_at 𝕜 (λx:E, (f₁ x, f₂ x)) s x :=
977
+ (hf₁.has_fderiv_within_at.prod hf₂.has_fderiv_within_at).differentiable_within_at
978
+
979
+ lemma differentiable_at.prod (hf₁ : differentiable_at 𝕜 f₁ x) (hf₂ : differentiable_at 𝕜 f₂ x) :
980
+ differentiable_at 𝕜 (λx:E, (f₁ x, f₂ x)) x :=
981
+ (hf₁.has_fderiv_at.prod hf₂.has_fderiv_at).differentiable_at
982
+
983
+ lemma differentiable_on.prod (hf₁ : differentiable_on 𝕜 f₁ s) (hf₂ : differentiable_on 𝕜 f₂ s) :
984
+ differentiable_on 𝕜 (λx:E, (f₁ x, f₂ x)) s :=
985
+ λx hx, differentiable_within_at.prod (hf₁ x hx) (hf₂ x hx)
986
+
987
+ lemma differentiable.prod (hf₁ : differentiable 𝕜 f₁) (hf₂ : differentiable 𝕜 f₂) :
988
+ differentiable 𝕜 (λx:E, (f₁ x, f₂ x)) :=
989
+ λ x, differentiable_at.prod (hf₁ x) (hf₂ x)
990
+
991
+ lemma differentiable_at.fderiv_prod
992
+ (hf₁ : differentiable_at 𝕜 f₁ x) (hf₂ : differentiable_at 𝕜 f₂ x) :
993
+ fderiv 𝕜 (λx:E, (f₁ x, f₂ x)) x =
994
+ continuous_linear_map.prod (fderiv 𝕜 f₁ x) (fderiv 𝕜 f₂ x) :=
995
+ has_fderiv_at.fderiv (has_fderiv_at.prod hf₁.has_fderiv_at hf₂.has_fderiv_at)
996
+
997
+ lemma differentiable_at.fderiv_within_prod
998
+ (hf₁ : differentiable_within_at 𝕜 f₁ s x) (hf₂ : differentiable_within_at 𝕜 f₂ s x)
999
+ (hxs : unique_diff_within_at 𝕜 s x) :
1000
+ fderiv_within 𝕜 (λx:E, (f₁ x, f₂ x)) s x =
1001
+ continuous_linear_map.prod (fderiv_within 𝕜 f₁ s x) (fderiv_within 𝕜 f₂ s x) :=
1002
+ begin
1003
+ apply has_fderiv_within_at.fderiv_within _ hxs,
1004
+ exact has_fderiv_within_at.prod hf₁.has_fderiv_within_at hf₂.has_fderiv_within_at
1005
+ end
1006
+
1007
+ end prod
1008
+
1009
+ section fst
1010
+
1011
+ variables {f₂ : E → F × G} {f₂' : E →L[𝕜] F × G} {p : E × F}
1012
+
1013
+ lemma has_strict_fderiv_at_fst : has_strict_fderiv_at prod.fst (fst 𝕜 E F) p :=
1014
+ (fst 𝕜 E F).has_strict_fderiv_at
1015
+
1016
+ lemma has_strict_fderiv_at.fst (h : has_strict_fderiv_at f₂ f₂' x) :
1017
+ has_strict_fderiv_at (λ x, (f₂ x).1 ) ((fst 𝕜 F G).comp f₂') x :=
1018
+ has_strict_fderiv_at_fst.comp x h
1019
+
1020
+ lemma has_fderiv_at_filter_fst {L : filter (E × F)} :
1021
+ has_fderiv_at_filter prod.fst (fst 𝕜 E F) p L :=
1022
+ (fst 𝕜 E F).has_fderiv_at_filter
1023
+
1024
+ lemma has_fderiv_at_filter.fst (h : has_fderiv_at_filter f₂ f₂' x L) :
1025
+ has_fderiv_at_filter (λ x, (f₂ x).1 ) ((fst 𝕜 F G).comp f₂') x L :=
1026
+ has_fderiv_at_filter_fst.comp x h
1027
+
1028
+ lemma has_fderiv_at_fst : has_fderiv_at prod.fst (fst 𝕜 E F) p :=
1029
+ has_fderiv_at_filter_fst
1030
+
1031
+ lemma has_fderiv_at.fst (h : has_fderiv_at f₂ f₂' x) :
1032
+ has_fderiv_at (λ x, (f₂ x).1 ) ((fst 𝕜 F G).comp f₂') x :=
1033
+ h.fst
1034
+
1035
+ lemma has_fderiv_within_at_fst {s : set (E × F)} :
1036
+ has_fderiv_within_at prod.fst (fst 𝕜 E F) s p :=
1037
+ has_fderiv_at_filter_fst
1038
+
1039
+ lemma has_fderiv_within_at.fst (h : has_fderiv_within_at f₂ f₂' s x) :
1040
+ has_fderiv_within_at (λ x, (f₂ x).1 ) ((fst 𝕜 F G).comp f₂') s x :=
1041
+ h.fst
1042
+
1043
+ lemma differentiable_at_fst : differentiable_at 𝕜 prod.fst p :=
1044
+ has_fderiv_at_fst.differentiable_at
1045
+
1046
+ lemma differentiable_at.fst (h : differentiable_at 𝕜 f₂ x) :
1047
+ differentiable_at 𝕜 (λ x, (f₂ x).1 ) x :=
1048
+ differentiable_at_fst.comp x h
1049
+
1050
+ lemma differentiable_fst : differentiable 𝕜 (prod.fst : E × F → E) :=
1051
+ λ x, differentiable_at_fst
1052
+
1053
+ lemma differentiable.fst (h : differentiable 𝕜 f₂) : differentiable 𝕜 (λ x, (f₂ x).1 ) :=
1054
+ differentiable_fst.comp h
1055
+
1056
+ lemma differentiable_within_at_fst {s : set (E × F)} : differentiable_within_at 𝕜 prod.fst s p :=
1057
+ differentiable_at_fst.differentiable_within_at
1058
+
1059
+ lemma differentiable_within_at.fst (h : differentiable_within_at 𝕜 f₂ s x) :
1060
+ differentiable_within_at 𝕜 (λ x, (f₂ x).1 ) s x :=
1061
+ differentiable_at_fst.comp_differentiable_within_at x h
1062
+
1063
+ lemma differentiable_on_fst {s : set (E × F)} : differentiable_on 𝕜 prod.fst s :=
1064
+ differentiable_fst.differentiable_on
1065
+
1066
+ lemma differentiable_on.fst (h : differentiable_on 𝕜 f₂ s) :
1067
+ differentiable_on 𝕜 (λ x, (f₂ x).1 ) s :=
1068
+ differentiable_fst.comp_differentiable_on h
1069
+
1070
+ lemma fderiv_fst : fderiv 𝕜 prod.fst p = fst 𝕜 E F := has_fderiv_at_fst.fderiv
1071
+
1072
+ lemma fderiv.fst (h : differentiable_at 𝕜 f₂ x) :
1073
+ fderiv 𝕜 (λ x, (f₂ x).1 ) x = (fst 𝕜 F G).comp (fderiv 𝕜 f₂ x) :=
1074
+ h.has_fderiv_at.fst.fderiv
1075
+
1076
+ lemma fderiv_within_fst {s : set (E × F)} (hs : unique_diff_within_at 𝕜 s p) :
1077
+ fderiv_within 𝕜 prod.fst s p = fst 𝕜 E F :=
1078
+ has_fderiv_within_at_fst.fderiv_within hs
1079
+
1080
+ lemma fderiv_within.fst (hs : unique_diff_within_at 𝕜 s x) (h : differentiable_within_at 𝕜 f₂ s x) :
1081
+ fderiv_within 𝕜 (λ x, (f₂ x).1 ) s x = (fst 𝕜 F G).comp (fderiv_within 𝕜 f₂ s x) :=
1082
+ h.has_fderiv_within_at.fst.fderiv_within hs
1083
+
1084
+ end fst
1085
+
1086
+ section snd
1087
+
1088
+ variables {f₂ : E → F × G} {f₂' : E →L[𝕜] F × G} {p : E × F}
1089
+
1090
+ lemma has_strict_fderiv_at_snd : has_strict_fderiv_at prod.snd (snd 𝕜 E F) p :=
1091
+ (snd 𝕜 E F).has_strict_fderiv_at
1092
+
1093
+ lemma has_strict_fderiv_at.snd (h : has_strict_fderiv_at f₂ f₂' x) :
1094
+ has_strict_fderiv_at (λ x, (f₂ x).2 ) ((snd 𝕜 F G).comp f₂') x :=
1095
+ has_strict_fderiv_at_snd.comp x h
1096
+
1097
+ lemma has_fderiv_at_filter_snd {L : filter (E × F)} :
1098
+ has_fderiv_at_filter prod.snd (snd 𝕜 E F) p L :=
1099
+ (snd 𝕜 E F).has_fderiv_at_filter
1100
+
1101
+ lemma has_fderiv_at_filter.snd (h : has_fderiv_at_filter f₂ f₂' x L) :
1102
+ has_fderiv_at_filter (λ x, (f₂ x).2 ) ((snd 𝕜 F G).comp f₂') x L :=
1103
+ has_fderiv_at_filter_snd.comp x h
1104
+
1105
+ lemma has_fderiv_at_snd : has_fderiv_at prod.snd (snd 𝕜 E F) p :=
1106
+ has_fderiv_at_filter_snd
1107
+
1108
+ lemma has_fderiv_at.snd (h : has_fderiv_at f₂ f₂' x) :
1109
+ has_fderiv_at (λ x, (f₂ x).2 ) ((snd 𝕜 F G).comp f₂') x :=
1110
+ h.snd
1111
+
1112
+ lemma has_fderiv_within_at_snd {s : set (E × F)} :
1113
+ has_fderiv_within_at prod.snd (snd 𝕜 E F) s p :=
1114
+ has_fderiv_at_filter_snd
1115
+
1116
+ lemma has_fderiv_within_at.snd (h : has_fderiv_within_at f₂ f₂' s x) :
1117
+ has_fderiv_within_at (λ x, (f₂ x).2 ) ((snd 𝕜 F G).comp f₂') s x :=
1118
+ h.snd
1119
+
1120
+ lemma differentiable_at_snd : differentiable_at 𝕜 prod.snd p :=
1121
+ has_fderiv_at_snd.differentiable_at
1122
+
1123
+ lemma differentiable_at.snd (h : differentiable_at 𝕜 f₂ x) :
1124
+ differentiable_at 𝕜 (λ x, (f₂ x).2 ) x :=
1125
+ differentiable_at_snd.comp x h
1126
+
1127
+ lemma differentiable_snd : differentiable 𝕜 (prod.snd : E × F → F) :=
1128
+ λ x, differentiable_at_snd
1129
+
1130
+ lemma differentiable.snd (h : differentiable 𝕜 f₂) : differentiable 𝕜 (λ x, (f₂ x).2 ) :=
1131
+ differentiable_snd.comp h
1132
+
1133
+ lemma differentiable_within_at_snd {s : set (E × F)} : differentiable_within_at 𝕜 prod.snd s p :=
1134
+ differentiable_at_snd.differentiable_within_at
1135
+
1136
+ lemma differentiable_within_at.snd (h : differentiable_within_at 𝕜 f₂ s x) :
1137
+ differentiable_within_at 𝕜 (λ x, (f₂ x).2 ) s x :=
1138
+ differentiable_at_snd.comp_differentiable_within_at x h
1139
+
1140
+ lemma differentiable_on_snd {s : set (E × F)} : differentiable_on 𝕜 prod.snd s :=
1141
+ differentiable_snd.differentiable_on
1142
+
1143
+ lemma differentiable_on.snd (h : differentiable_on 𝕜 f₂ s) :
1144
+ differentiable_on 𝕜 (λ x, (f₂ x).2 ) s :=
1145
+ differentiable_snd.comp_differentiable_on h
1146
+
1147
+ lemma fderiv_snd : fderiv 𝕜 prod.snd p = snd 𝕜 E F := has_fderiv_at_snd.fderiv
1148
+
1149
+ lemma fderiv.snd (h : differentiable_at 𝕜 f₂ x) :
1150
+ fderiv 𝕜 (λ x, (f₂ x).2 ) x = (snd 𝕜 F G).comp (fderiv 𝕜 f₂ x) :=
1151
+ h.has_fderiv_at.snd.fderiv
1152
+
1153
+ lemma fderiv_within_snd {s : set (E × F)} (hs : unique_diff_within_at 𝕜 s p) :
1154
+ fderiv_within 𝕜 prod.snd s p = snd 𝕜 E F :=
1155
+ has_fderiv_within_at_snd.fderiv_within hs
1156
+
1157
+ lemma fderiv_within.snd (hs : unique_diff_within_at 𝕜 s x) (h : differentiable_within_at 𝕜 f₂ s x) :
1158
+ fderiv_within 𝕜 (λ x, (f₂ x).2 ) s x = (snd 𝕜 F G).comp (fderiv_within 𝕜 f₂ s x) :=
1159
+ h.has_fderiv_within_at.snd.fderiv_within hs
1160
+
1161
+ end snd
1162
+
1163
+ section prod_map
1164
+
1165
+ variables {f₂ : G → G'} {f₂' : G →L[𝕜] G'} {y : G} (p : E × G)
1166
+
1167
+ -- TODO (Lean 3.8): use `prod.map f f₂``
1168
+
1169
+ theorem has_strict_fderiv_at.prod_map (hf : has_strict_fderiv_at f f' p.1 )
1170
+ (hf₂ : has_strict_fderiv_at f₂ f₂' p.2 ) :
1171
+ has_strict_fderiv_at (λ p : E × G, (f p.1 , f₂ p.2 )) (f'.prod_map f₂') p :=
1172
+ (hf.comp p has_strict_fderiv_at_fst).prod (hf₂.comp p has_strict_fderiv_at_snd)
1173
+
1174
+ theorem has_fderiv_at.prod_map (hf : has_fderiv_at f f' p.1 )
1175
+ (hf₂ : has_fderiv_at f₂ f₂' p.2 ) :
1176
+ has_fderiv_at (λ p : E × G, (f p.1 , f₂ p.2 )) (f'.prod_map f₂') p :=
1177
+ (hf.comp p has_fderiv_at_fst).prod (hf₂.comp p has_fderiv_at_snd)
1178
+
1179
+ theorem differentiable_at.prod_map (hf : differentiable_at 𝕜 f p.1 )
1180
+ (hf₂ : differentiable_at 𝕜 f₂ p.2 ) :
1181
+ differentiable_at 𝕜 (λ p : E × G, (f p.1 , f₂ p.2 )) p :=
1182
+ (hf.comp p differentiable_at_fst).prod (hf₂.comp p differentiable_at_snd)
1183
+
1184
+ end prod_map
1185
+
1186
+ end cartesian_product
1187
+
1003
1188
section const_smul
1004
1189
/-! ### Derivative of a function multiplied by a constant -/
1005
1190
0 commit comments