@@ -2153,3 +2153,92 @@ exact/derivable1_diffP/derivable_horner.
21532153Qed .
21542154
21552155End derive_horner.
2156+
2157+ Section pointwise_derivable.
2158+ Context {R : realFieldType} {V W : normedModType R} {m n : nat}.
2159+ Implicit Types M : V -> 'M[R]_(m, n).
2160+
2161+ Definition derivable_mx M t v :=
2162+ forall i j, derivable (fun x => M x i j) t v.
2163+
2164+ (* NB: from robot-rocq *)
2165+ Lemma derivable_mxP M t v : derivable_mx M t v <-> derivable M t v.
2166+ Proof .
2167+ split; rewrite /derivable_mx /derivable.
2168+ - move=> H.
2169+ apply/cvg_ex => /=.
2170+ pose l := \matrix_(i < m, j < n) sval (cid ((cvg_ex _).1 (H i j))).
2171+ exists l.
2172+ apply/cvgrPdist_le => /= e e0.
2173+ near=> x.
2174+ rewrite /Num.Def.normr/= mx_normrE.
2175+ apply: (bigmax_le _ (ltW e0)) => /= i _.
2176+ rewrite !mxE/=.
2177+ move: i.
2178+ near: x.
2179+ apply: filter_forall => /= i.
2180+ exact: ((@cvgrPdist_le _ _ _ _ (dnbhs_filter 0) _ _).1
2181+ (svalP (cid ((cvg_ex _).1 (H i.1 i.2)))) _ e0).
2182+ - move=> /cvg_ex[/= l Hl] i j.
2183+ apply/cvg_ex; exists (l i j).
2184+ apply/cvgrPdist_le => /= e e0.
2185+ move/cvgrPdist_le : Hl => /(_ _ e0)[/= r r0] H.
2186+ near=> x.
2187+ apply: le_trans; last first.
2188+ apply: (H x).
2189+ rewrite /ball_/=.
2190+ rewrite sub0r normrN.
2191+ near: x.
2192+ exact: dnbhs0_lt.
2193+ near: x.
2194+ exact: nbhs_dnbhs_neq.
2195+ rewrite [leRHS]/Num.Def.normr/= mx_normrE.
2196+ apply: le_trans; last exact: le_bigmax.
2197+ by rewrite /= !mxE.
2198+ Unshelve. all: by end_near. Qed .
2199+
2200+ End pointwise_derivable.
2201+
2202+ Section pointwise_derive.
2203+ Local Open Scope classical_set_scope.
2204+ Context {R : realFieldType} {V W : normedModType R} .
2205+
2206+ (* NB: from robot-rocq *)
2207+ Lemma derive_mx {m n : nat} (M : V -> 'M[R]_(m, n)) t v :
2208+ derivable M t v ->
2209+ 'D_v M t = \matrix_(i < m, j < n) 'D_v (fun t => M t i j) t.
2210+ Proof .
2211+ move=> /cvg_ex[/= l Hl]; apply/cvg_lim => //=.
2212+ apply/cvgrPdist_le => /= e e0.
2213+ move/cvgrPdist_le : (Hl) => /(_ (e / 2)).
2214+ rewrite divr_gt0// => /(_ isT)[d /= d0 dle].
2215+ near=> x.
2216+ rewrite [in leLHS]/Num.Def.normr/= mx_normrE.
2217+ apply/(bigmax_le _ (ltW e0)) => -[/= i j] _.
2218+ rewrite [in leLHS]mxE/= [X in _ + X]mxE -[X in X - _](subrK (l i j)).
2219+ rewrite -(addrA (_ - _)) (le_trans (ler_normD _ _))// (splitr e) lerD//.
2220+ - rewrite mxE.
2221+ suff : (h^-1 *: (M (h *: v + t) i j - M t i j)) @[h --> 0^'] --> l i j.
2222+ move/cvg_lim => /=; rewrite /derive /= => ->//.
2223+ by rewrite subrr normr0 divr_ge0// ltW.
2224+ apply/cvgrPdist_le => /= r r0.
2225+ move/cvgrPdist_le : Hl => /(_ r r0)[/= s s0] sr.
2226+ near=> y.
2227+ have : `|l - y^-1 *: (M (y *: v + t) - M t)| <= r.
2228+ rewrite sr//=; last by near: y; exact: nbhs_dnbhs_neq.
2229+ by rewrite sub0r normrN; near: y; exact: dnbhs0_lt.
2230+ apply: le_trans.
2231+ rewrite [in leRHS]/Num.Def.normr/= mx_normrE.
2232+ by under eq_bigr do rewrite !mxE; exact: (le_bigmax _ _ (i, j)).
2233+ - rewrite mxE.
2234+ have : `|l - x^-1 *: (M (x *: v + t) - M t)| <= e / 2.
2235+ apply: dle => //=; last by near: x; exact: nbhs_dnbhs_neq.
2236+ by rewrite sub0r normrN; near: x; exact: dnbhs0_lt.
2237+ apply: le_trans.
2238+ rewrite [in leRHS]/Num.Def.normr/= mx_normrE/=.
2239+ under eq_bigr do rewrite !mxE.
2240+ apply: le_trans; last exact: le_bigmax.
2241+ by rewrite !mxE.
2242+ Unshelve. all: by end_near. Qed .
2243+
2244+ End pointwise_derive.
0 commit comments