Skip to content

Commit 20dde39

Browse files
committed
derive row_mx
1 parent 7c8cd3f commit 20dde39

2 files changed

Lines changed: 63 additions & 0 deletions

File tree

CHANGELOG_UNRELEASED.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@
6565

6666
- in `derive.v`:
6767
+ lemmas `compact_EVT_max`, `compact_EVT_min`, `EVT_max_rV`, `EVT_min_rV`
68+
- in `derive.v`:
69+
+ lemmas `derivable_row_mx`, `derive_row_mx`
6870

6971
### Changed
7072
- in `set_interval.v`

theories/derive.v

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1023,6 +1023,67 @@ Proof. by move=> /differentiableP df; rewrite diff_val. Qed.
10231023

10241024
End 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+
10261087
Section DeriveRU.
10271088
Variables (R : numFieldType) (U : normedModType R).
10281089
Implicit Types f : R -> U.

0 commit comments

Comments
 (0)