@@ -1023,6 +1023,67 @@ Proof. by move=> /differentiableP df; rewrite diff_val. Qed.
10231023
10241024End DifferentialR3_numFieldType.
10251025
1026+ Lemma derivable_row_mx {R : realFieldType} {n1 n2 : nat}
1027+ (f : R -> 'rV[R]_n1) (g : R -> 'rV[R]_n2) t v :
1028+ (forall x, derivable f x v) -> (forall x, derivable g x v) ->
1029+ derivable (fun x : R => row_mx (f x) (g x)) t v.
1030+ Proof .
1031+ move=> /= fv gv; apply/derivable_mxP => i j.
1032+ rewrite (ord1 i)/=.
1033+ have /cvg_ex[/= l Hl]:= fv t.
1034+ have /cvg_ex[/= k Hk]:= gv t.
1035+ apply/cvg_ex => /=; exists (row_mx l k)``_j.
1036+ apply/cvgrPdist_le => /= e e0.
1037+ move/cvgrPdist_le : Hl => /(_ _ e0) Hl.
1038+ move/cvgrPdist_le : Hk => /(_ _ e0) Hk.
1039+ move: Hl Hk; apply: filterS2 => x Hl Hk.
1040+ rewrite !mxE.
1041+ case: fintype.splitP => j1 jj1.
1042+ apply: le_trans Hl.
1043+ rewrite [in leRHS]/Num.Def.normr/= mx_normrE.
1044+ apply: le_trans; last first.
1045+ exact: (le_bigmax _ _ (ord0, j1)).
1046+ by rewrite !mxE/=.
1047+ apply: le_trans Hk.
1048+ rewrite [in leRHS]/Num.Def.normr/= mx_normrE.
1049+ apply: le_trans; last first.
1050+ exact: (le_bigmax _ _ (ord0, j1)).
1051+ by rewrite !mxE/=.
1052+ Qed .
1053+
1054+ Lemma derive_row_mx {R : realFieldType} {n1 n2 : nat}
1055+ (f : R -> 'rV[R]_n1) (g : R -> 'rV[R]_n2) t v :
1056+ (forall x : R, derivable f x v) ->
1057+ (forall x : R, derivable g x v) ->
1058+ 'D_v (fun x => row_mx (f x) (g x)) t = row_mx ('D_v f t) ('D_v g t).
1059+ Proof .
1060+ move=> fv gv.
1061+ apply/matrixP => i j.
1062+ rewrite [in LHS]derive_mx ?mxE//=; last first.
1063+ by apply: derivable_row_mx; [exact: fv|exact: gv].
1064+ do 2 rewrite derive_mx ?mxE//=.
1065+ case: fintype.split_ordP => /= j1 jj1; rewrite !mxE; congr ('D_v _ t).
1066+ apply/funext => x; rewrite !mxE.
1067+ case: fintype.split_ordP => k jE.
1068+ congr (f x i _).
1069+ move: jE.
1070+ by rewrite jj1 => /(congr1 val) => /= /val_inj.
1071+ move: jE.
1072+ rewrite jj1 => /(congr1 val)/=.
1073+ have /[swap] -> := ltn_ord j1.
1074+ by rewrite ltnNge/= leq_addr.
1075+ apply/funext => x; rewrite !mxE.
1076+ case: fintype.split_ordP => k jE.
1077+ move: jE.
1078+ rewrite jj1 => /(congr1 val)/=.
1079+ have /[swap] <- := ltn_ord k.
1080+ by rewrite ltnNge/= leq_addr.
1081+ congr (g x i _).
1082+ move: jE.
1083+ rewrite jj1 => /(congr1 val) => /= /eqP.
1084+ by rewrite eqn_add2l => /eqP /val_inj.
1085+ Qed .
1086+
10261087Section DeriveRU.
10271088Variables (R : numFieldType) (U : normedModType R).
10281089Implicit Types f : R -> U.
0 commit comments