Skip to content

Commit 4b0f6a6

Browse files
committed
derive row_mx
1 parent d2e2bbb commit 4b0f6a6

2 files changed

Lines changed: 56 additions & 0 deletions

File tree

CHANGELOG_UNRELEASED.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44

55
### Added
66

7+
- in `derive.v`:
8+
+ lemmas `derivable_row_mx`, `derive_row_mx`
9+
710
### Changed
811

912
### Renamed

theories/derive.v

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2292,6 +2292,30 @@ Unshelve. all: by end_near. Qed.
22922292

22932293
End 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+
22952319
Section pointwise_derive.
22962320
Local Open Scope classical_set_scope.
22972321
Context {R : realFieldType} {V : normedModType R}.
@@ -2329,3 +2353,32 @@ rewrite (le_trans (ler_normD _ _))// (splitr e) lerD//.
23292353
Unshelve. all: by end_near. Qed.
23302354

23312355
End 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

Comments
 (0)