@@ -2292,6 +2292,30 @@ Unshelve. all: by end_near. Qed.
22922292
22932293End pointwise_derivable.
22942294
2295+ Section derivable_mx.
2296+
2297+ Lemma derivable_row_mx {R : realFieldType} {V : normedModType R} {n1 n2 : nat}
2298+ (f : V -> 'rV[R]_n1) (g : V -> 'rV[R]_n2) t v :
2299+ (forall x, derivable f x v) -> (forall x, derivable g x v) ->
2300+ derivable (fun x : V => row_mx (f x) (g x)) t v.
2301+ Proof .
2302+ move=> /= fv gv; apply/derivable_mxP => i j; rewrite (ord1 i)/=.
2303+ have /cvg_ex[/= l Hl] := fv t.
2304+ have /cvg_ex[/= k Hk] := gv t.
2305+ apply/cvg_ex => /=; exists (row_mx l k ord0 j).
2306+ apply/cvgrPdist_le => /= e e0.
2307+ move/cvgrPdist_le : Hl => /(_ _ e0) Hl.
2308+ move/cvgrPdist_le : Hk => /(_ _ e0) Hk.
2309+ move: Hl Hk; apply: filterS2 => x Hl Hk.
2310+ rewrite !mxE; case: fintype.splitP => j1 jj1.
2311+ - rewrite (le_trans _ Hl)// [in leRHS]/Num.Def.normr/= mx_normrE.
2312+ by rewrite (le_trans _ (le_bigmax _ _ (ord0, j1)))// !mxE.
2313+ - rewrite (le_trans _ Hk)// [in leRHS]/Num.Def.normr/= mx_normrE.
2314+ by rewrite (le_trans _ (le_bigmax _ _ (ord0, j1)))// !mxE.
2315+ Qed .
2316+
2317+ End derivable_mx.
2318+
22952319Section pointwise_derive.
22962320Local Open Scope classical_set_scope.
22972321Context {R : realFieldType} {V : normedModType R}.
@@ -2329,3 +2353,32 @@ rewrite (le_trans (ler_normD _ _))// (splitr e) lerD//.
23292353Unshelve. all: by end_near. Qed .
23302354
23312355End pointwise_derive.
2356+
2357+ Section derive_mx.
2358+
2359+ Lemma derive_row_mx {R : realFieldType} {V : normedModType R} {n1 n2 : nat}
2360+ (f : V -> 'rV[R]_n1) (g : V -> 'rV[R]_n2) t v :
2361+ (forall x, derivable f x v) -> (forall x, derivable g x v) ->
2362+ 'D_v (fun x => row_mx (f x) (g x)) t = row_mx ('D_v f t) ('D_v g t).
2363+ Proof .
2364+ move=> fv gv; apply/matrixP => i j.
2365+ rewrite [in LHS]derive_mx ?mxE//=; last first.
2366+ by apply: derivable_row_mx; [exact: fv|exact: gv].
2367+ do 2 rewrite derive_mx ?mxE//=.
2368+ case: split_ordP => /= j' jj'; rewrite !mxE; congr ('D_v _ t).
2369+ - apply/funext => x; rewrite !mxE; case: split_ordP => [k jE|k].
2370+ + congr (f x i _).
2371+ by move: jE; rewrite jj' => /(congr1 val) => /= /val_inj.
2372+ + rewrite jj' => /(congr1 val)/=.
2373+ have /[swap] -> := ltn_ord j'.
2374+ by rewrite ltnNge/= leq_addr.
2375+ - apply/funext => x; rewrite !mxE; case: split_ordP => [k|k jE].
2376+ + rewrite jj' => /(congr1 val)/=.
2377+ have /[swap] <- := ltn_ord k.
2378+ by rewrite ltnNge/= leq_addr.
2379+ + congr (g x i _).
2380+ move: jE; rewrite jj' => /(congr1 val) => /= /eqP.
2381+ by rewrite eqn_add2l => /eqP /val_inj.
2382+ Qed .
2383+
2384+ End derive_mx.
0 commit comments