@@ -144,19 +144,24 @@ theorem norm_le_gronwallBound_of_norm_deriv_right_le {f f' : ℝ → E} {δ K ε
144
144
(fun x hx _r hr => (hf' x hx).liminf_right_slope_norm_le hr) ha bound
145
145
#align norm_le_gronwall_bound_of_norm_deriv_right_le norm_le_gronwallBound_of_norm_deriv_right_le
146
146
147
+ variable {v : ℝ → E → E} {s : ℝ → Set E} {K : ℝ≥0 } {f g f' g' : ℝ → E} {a b t₀ : ℝ} {εf εg δ : ℝ}
148
+ (hv : ∀ t, LipschitzOnWith K (v t) (s t))
149
+
147
150
/-- If `f` and `g` are two approximate solutions of the same ODE, then the distance between them
148
151
can't grow faster than exponentially. This is a simple corollary of Grönwall's inequality, and some
149
152
people call this Grönwall's inequality too.
150
153
151
154
This version assumes all inequalities to be true in some time-dependent set `s t`,
152
155
and assumes that the solutions never leave this set. -/
153
- theorem dist_le_of_approx_trajectories_ODE_of_mem_set {v : ℝ → E → E} {s : ℝ → Set E} {K : ℝ≥0 }
154
- (hv : ∀ t, LipschitzOnWith K (v t) (s t))
155
- {f g f' g' : ℝ → E} {a b : ℝ} {εf εg δ : ℝ} (hf : ContinuousOn f (Icc a b))
156
+ theorem dist_le_of_approx_trajectories_ODE_of_mem
157
+ (hf : ContinuousOn f (Icc a b))
156
158
(hf' : ∀ t ∈ Ico a b, HasDerivWithinAt f (f' t) (Ici t) t)
157
- (f_bound : ∀ t ∈ Ico a b, dist (f' t) (v t (f t)) ≤ εf) (hfs : ∀ t ∈ Ico a b, f t ∈ s t)
158
- (hg : ContinuousOn g (Icc a b)) (hg' : ∀ t ∈ Ico a b, HasDerivWithinAt g (g' t) (Ici t) t)
159
- (g_bound : ∀ t ∈ Ico a b, dist (g' t) (v t (g t)) ≤ εg) (hgs : ∀ t ∈ Ico a b, g t ∈ s t)
159
+ (f_bound : ∀ t ∈ Ico a b, dist (f' t) (v t (f t)) ≤ εf)
160
+ (hfs : ∀ t ∈ Ico a b, f t ∈ s t)
161
+ (hg : ContinuousOn g (Icc a b))
162
+ (hg' : ∀ t ∈ Ico a b, HasDerivWithinAt g (g' t) (Ici t) t)
163
+ (g_bound : ∀ t ∈ Ico a b, dist (g' t) (v t (g t)) ≤ εg)
164
+ (hgs : ∀ t ∈ Ico a b, g t ∈ s t)
160
165
(ha : dist (f a) (g a) ≤ δ) :
161
166
∀ t ∈ Icc a b, dist (f t) (g t) ≤ gronwallBound δ K (εf + εg) (t - a) := by
162
167
simp only [dist_eq_norm] at ha ⊢
@@ -170,22 +175,25 @@ theorem dist_le_of_approx_trajectories_ODE_of_mem_set {v : ℝ → E → E} {s :
170
175
refine this.trans ((add_le_add (add_le_add (f_bound t ht) (g_bound t ht)) hv).trans ?_)
171
176
rw [add_comm]
172
177
set_option linter.uppercaseLean3 false in
173
- #align dist_le_of_approx_trajectories_ODE_of_mem_set dist_le_of_approx_trajectories_ODE_of_mem_set
178
+ #align dist_le_of_approx_trajectories_ODE_of_mem_set dist_le_of_approx_trajectories_ODE_of_mem
174
179
175
180
/-- If `f` and `g` are two approximate solutions of the same ODE, then the distance between them
176
181
can't grow faster than exponentially. This is a simple corollary of Grönwall's inequality, and some
177
182
people call this Grönwall's inequality too.
178
183
179
184
This version assumes all inequalities to be true in the whole space. -/
180
- theorem dist_le_of_approx_trajectories_ODE {v : ℝ → E → E} {K : ℝ≥0 }
181
- (hv : ∀ t, LipschitzWith K (v t)) {f g f' g' : ℝ → E} {a b : ℝ} {εf εg δ : ℝ}
182
- (hf : ContinuousOn f (Icc a b)) (hf' : ∀ t ∈ Ico a b, HasDerivWithinAt f (f' t) (Ici t) t)
183
- (f_bound : ∀ t ∈ Ico a b, dist (f' t) (v t (f t)) ≤ εf) (hg : ContinuousOn g (Icc a b))
185
+ theorem dist_le_of_approx_trajectories_ODE
186
+ (hv : ∀ t, LipschitzWith K (v t))
187
+ (hf : ContinuousOn f (Icc a b))
188
+ (hf' : ∀ t ∈ Ico a b, HasDerivWithinAt f (f' t) (Ici t) t)
189
+ (f_bound : ∀ t ∈ Ico a b, dist (f' t) (v t (f t)) ≤ εf)
190
+ (hg : ContinuousOn g (Icc a b))
184
191
(hg' : ∀ t ∈ Ico a b, HasDerivWithinAt g (g' t) (Ici t) t)
185
- (g_bound : ∀ t ∈ Ico a b, dist (g' t) (v t (g t)) ≤ εg) (ha : dist (f a) (g a) ≤ δ) :
192
+ (g_bound : ∀ t ∈ Ico a b, dist (g' t) (v t (g t)) ≤ εg)
193
+ (ha : dist (f a) (g a) ≤ δ) :
186
194
∀ t ∈ Icc a b, dist (f t) (g t) ≤ gronwallBound δ K (εf + εg) (t - a) :=
187
195
have hfs : ∀ t ∈ Ico a b, f t ∈ @univ E := fun _ _ => trivial
188
- dist_le_of_approx_trajectories_ODE_of_mem_set (fun t => (hv t).lipschitzOnWith _) hf hf'
196
+ dist_le_of_approx_trajectories_ODE_of_mem (fun t => (hv t).lipschitzOnWith _) hf hf'
189
197
f_bound hfs hg hg' g_bound (fun _ _ => trivial) ha
190
198
set_option linter.uppercaseLean3 false in
191
199
#align dist_le_of_approx_trajectories_ODE dist_le_of_approx_trajectories_ODE
@@ -196,34 +204,37 @@ people call this Grönwall's inequality too.
196
204
197
205
This version assumes all inequalities to be true in some time-dependent set `s t`,
198
206
and assumes that the solutions never leave this set. -/
199
- theorem dist_le_of_trajectories_ODE_of_mem_set {v : ℝ → E → E} {s : ℝ → Set E} {K : ℝ≥ 0 }
200
- (hv : ∀ t, LipschitzOnWith K (v t) (s t ))
201
- {f g : ℝ → E} { a b : ℝ} {δ : ℝ} (hf : ContinuousOn f (Icc a b) )
202
- (hf' : ∀ t ∈ Ico a b, HasDerivWithinAt f (v t (f t)) (Ici t) t) ( hfs : ∀ t ∈ Ico a b, f t ∈ s t)
207
+ theorem dist_le_of_trajectories_ODE_of_mem
208
+ (hf : ContinuousOn f (Icc a b ))
209
+ (hf' : ∀ t ∈ Ico a b, HasDerivWithinAt f (v t (f t)) (Ici t) t )
210
+ (hfs : ∀ t ∈ Ico a b, f t ∈ s t)
203
211
(hg : ContinuousOn g (Icc a b)) (hg' : ∀ t ∈ Ico a b, HasDerivWithinAt g (v t (g t)) (Ici t) t)
204
212
(hgs : ∀ t ∈ Ico a b, g t ∈ s t) (ha : dist (f a) (g a) ≤ δ) :
205
213
∀ t ∈ Icc a b, dist (f t) (g t) ≤ δ * exp (K * (t - a)) := by
206
214
have f_bound : ∀ t ∈ Ico a b, dist (v t (f t)) (v t (f t)) ≤ 0 := by intros; rw [dist_self]
207
215
have g_bound : ∀ t ∈ Ico a b, dist (v t (g t)) (v t (g t)) ≤ 0 := by intros; rw [dist_self]
208
216
intro t ht
209
217
have :=
210
- dist_le_of_approx_trajectories_ODE_of_mem_set hv hf hf' f_bound hfs hg hg' g_bound hgs ha t ht
218
+ dist_le_of_approx_trajectories_ODE_of_mem hv hf hf' f_bound hfs hg hg' g_bound hgs ha t ht
211
219
rwa [zero_add, gronwallBound_ε0 ] at this
212
220
set_option linter.uppercaseLean3 false in
213
- #align dist_le_of_trajectories_ODE_of_mem_set dist_le_of_trajectories_ODE_of_mem_set
221
+ #align dist_le_of_trajectories_ODE_of_mem_set dist_le_of_trajectories_ODE_of_mem
214
222
215
223
/-- If `f` and `g` are two exact solutions of the same ODE, then the distance between them
216
224
can't grow faster than exponentially. This is a simple corollary of Grönwall's inequality, and some
217
225
people call this Grönwall's inequality too.
218
226
219
227
This version assumes all inequalities to be true in the whole space. -/
220
- theorem dist_le_of_trajectories_ODE {v : ℝ → E → E} {K : ℝ≥0 } (hv : ∀ t, LipschitzWith K (v t))
221
- {f g : ℝ → E} {a b : ℝ} {δ : ℝ} (hf : ContinuousOn f (Icc a b))
222
- (hf' : ∀ t ∈ Ico a b, HasDerivWithinAt f (v t (f t)) (Ici t) t) (hg : ContinuousOn g (Icc a b))
223
- (hg' : ∀ t ∈ Ico a b, HasDerivWithinAt g (v t (g t)) (Ici t) t) (ha : dist (f a) (g a) ≤ δ) :
228
+ theorem dist_le_of_trajectories_ODE
229
+ (hv : ∀ t, LipschitzWith K (v t))
230
+ (hf : ContinuousOn f (Icc a b))
231
+ (hf' : ∀ t ∈ Ico a b, HasDerivWithinAt f (v t (f t)) (Ici t) t)
232
+ (hg : ContinuousOn g (Icc a b))
233
+ (hg' : ∀ t ∈ Ico a b, HasDerivWithinAt g (v t (g t)) (Ici t) t)
234
+ (ha : dist (f a) (g a) ≤ δ) :
224
235
∀ t ∈ Icc a b, dist (f t) (g t) ≤ δ * exp (K * (t - a)) :=
225
236
have hfs : ∀ t ∈ Ico a b, f t ∈ @univ E := fun _ _ => trivial
226
- dist_le_of_trajectories_ODE_of_mem_set (fun t => (hv t).lipschitzOnWith _) hf hf' hfs hg
237
+ dist_le_of_trajectories_ODE_of_mem (fun t => (hv t).lipschitzOnWith _) hf hf' hfs hg
227
238
hg' (fun _ _ => trivial) ha
228
239
set_option linter.uppercaseLean3 false in
229
240
#align dist_le_of_trajectories_ODE dist_le_of_trajectories_ODE
@@ -233,26 +244,137 @@ a given initial value provided that the RHS is Lipschitz continuous in `x` withi
233
244
and we consider only solutions included in `s`.
234
245
235
246
This version shows uniqueness in a closed interval `Icc a b`, where `a` is the initial time. -/
236
- theorem ODE_solution_unique_of_mem_set {v : ℝ → E → E} {s : ℝ → Set E} {K : ℝ≥0 }
237
- (hv : ∀ t, LipschitzOnWith K (v t) (s t))
238
- {f g : ℝ → E} {a b : ℝ} (hf : ContinuousOn f (Icc a b))
239
- (hf' : ∀ t ∈ Ico a b, HasDerivWithinAt f (v t (f t)) (Ici t) t) (hfs : ∀ t ∈ Ico a b, f t ∈ s t)
240
- (hg : ContinuousOn g (Icc a b)) (hg' : ∀ t ∈ Ico a b, HasDerivWithinAt g (v t (g t)) (Ici t) t)
241
- (hgs : ∀ t ∈ Ico a b, g t ∈ s t) (ha : f a = g a) : EqOn f g (Icc a b) := fun t ht ↦ by
242
- have := dist_le_of_trajectories_ODE_of_mem_set hv hf hf' hfs hg hg' hgs (dist_le_zero.2 ha) t ht
247
+ theorem ODE_solution_unique_of_mem_Icc_right
248
+ (hf : ContinuousOn f (Icc a b))
249
+ (hf' : ∀ t ∈ Ico a b, HasDerivWithinAt f (v t (f t)) (Ici t) t)
250
+ (hfs : ∀ t ∈ Ico a b, f t ∈ s t)
251
+ (hg : ContinuousOn g (Icc a b))
252
+ (hg' : ∀ t ∈ Ico a b, HasDerivWithinAt g (v t (g t)) (Ici t) t)
253
+ (hgs : ∀ t ∈ Ico a b, g t ∈ s t)
254
+ (ha : f a = g a) :
255
+ EqOn f g (Icc a b) := fun t ht ↦ by
256
+ have := dist_le_of_trajectories_ODE_of_mem hv hf hf' hfs hg hg' hgs (dist_le_zero.2 ha) t ht
243
257
rwa [zero_mul, dist_le_zero] at this
244
258
set_option linter.uppercaseLean3 false in
245
- #align ODE_solution_unique_of_mem_set ODE_solution_unique_of_mem_set
259
+ #align ODE_solution_unique_of_mem_set ODE_solution_unique_of_mem_Icc_right
260
+
261
+ /-- A time-reversed version of `ODE_solution_unique_of_mem_Icc_right`. Uniqueness is shown in a
262
+ closed interval `Icc a b`, where `b` is the "initial" time. -/
263
+ theorem ODE_solution_unique_of_mem_Icc_left
264
+ (hf : ContinuousOn f (Icc a b))
265
+ (hf' : ∀ t ∈ Ioc a b, HasDerivWithinAt f (v t (f t)) (Iic t) t)
266
+ (hfs : ∀ t ∈ Ioc a b, f t ∈ s t)
267
+ (hg : ContinuousOn g (Icc a b))
268
+ (hg' : ∀ t ∈ Ioc a b, HasDerivWithinAt g (v t (g t)) (Iic t) t)
269
+ (hgs : ∀ t ∈ Ioc a b, g t ∈ s t)
270
+ (hb : f b = g b) :
271
+ EqOn f g (Icc a b) := by
272
+ have hv' t : LipschitzOnWith K (Neg.neg ∘ (v (-t))) (s (-t)) := by
273
+ rw [← one_mul K]
274
+ exact LipschitzWith.id.neg.comp_lipschitzOnWith (hv _)
275
+ have hmt1 : MapsTo Neg.neg (Icc (-b) (-a)) (Icc a b) :=
276
+ fun _ ht ↦ ⟨le_neg.mp ht.2 , neg_le.mp ht.1 ⟩
277
+ have hmt2 : MapsTo Neg.neg (Ico (-b) (-a)) (Ioc a b) :=
278
+ fun _ ht ↦ ⟨lt_neg.mp ht.2 , neg_le.mp ht.1 ⟩
279
+ have hmt3 (t : ℝ) : MapsTo Neg.neg (Ici t) (Iic (-t)) :=
280
+ fun _ ht' ↦ mem_Iic.mpr <| neg_le_neg ht'
281
+ suffices EqOn (f ∘ Neg.neg) (g ∘ Neg.neg) (Icc (-b) (-a)) by
282
+ rw [eqOn_comp_right_iff] at this
283
+ convert this
284
+ simp
285
+ apply ODE_solution_unique_of_mem_Icc_right hv'
286
+ (hf.comp continuousOn_neg hmt1) _ (fun _ ht ↦ hfs _ (hmt2 ht))
287
+ (hg.comp continuousOn_neg hmt1) _ (fun _ ht ↦ hgs _ (hmt2 ht)) (by simp [hb])
288
+ · intros t ht
289
+ convert HasFDerivWithinAt.comp_hasDerivWithinAt t (hf' (-t) (hmt2 ht))
290
+ (hasDerivAt_neg t).hasDerivWithinAt (hmt3 t)
291
+ simp
292
+ · intros t ht
293
+ convert HasFDerivWithinAt.comp_hasDerivWithinAt t (hg' (-t) (hmt2 ht))
294
+ (hasDerivAt_neg t).hasDerivWithinAt (hmt3 t)
295
+ simp
296
+
297
+ /-- A version of `ODE_solution_unique_of_mem_Icc_right` for uniqueness in a closed interval whose
298
+ interior contains the initial time. -/
299
+ theorem ODE_solution_unique_of_mem_Icc
300
+ (ht : t₀ ∈ Ioo a b)
301
+ (hf : ContinuousOn f (Icc a b))
302
+ (hf' : ∀ t ∈ Ioo a b, HasDerivAt f (v t (f t)) t)
303
+ (hfs : ∀ t ∈ Ioo a b, f t ∈ s t)
304
+ (hg : ContinuousOn g (Icc a b))
305
+ (hg' : ∀ t ∈ Ioo a b, HasDerivAt g (v t (g t)) t)
306
+ (hgs : ∀ t ∈ Ioo a b, g t ∈ s t)
307
+ (heq : f t₀ = g t₀) :
308
+ EqOn f g (Icc a b) := by
309
+ rw [← Icc_union_Icc_eq_Icc (le_of_lt ht.1 ) (le_of_lt ht.2 )]
310
+ apply EqOn.union
311
+ · have hss : Ioc a t₀ ⊆ Ioo a b := Ioc_subset_Ioo_right ht.2
312
+ exact ODE_solution_unique_of_mem_Icc_left hv
313
+ (hf.mono <| Icc_subset_Icc_right <| le_of_lt ht.2 )
314
+ (fun _ ht' ↦ (hf' _ (hss ht')).hasDerivWithinAt) (fun _ ht' ↦ (hfs _ (hss ht')))
315
+ (hg.mono <| Icc_subset_Icc_right <| le_of_lt ht.2 )
316
+ (fun _ ht' ↦ (hg' _ (hss ht')).hasDerivWithinAt) (fun _ ht' ↦ (hgs _ (hss ht'))) heq
317
+ · have hss : Ico t₀ b ⊆ Ioo a b := Ico_subset_Ioo_left ht.1
318
+ exact ODE_solution_unique_of_mem_Icc_right hv
319
+ (hf.mono <| Icc_subset_Icc_left <| le_of_lt ht.1 )
320
+ (fun _ ht' ↦ (hf' _ (hss ht')).hasDerivWithinAt) (fun _ ht' ↦ (hfs _ (hss ht')))
321
+ (hg.mono <| Icc_subset_Icc_left <| le_of_lt ht.1 )
322
+ (fun _ ht' ↦ (hg' _ (hss ht')).hasDerivWithinAt) (fun _ ht' ↦ (hgs _ (hss ht'))) heq
323
+
324
+ /-- A version of `ODE_solution_unique_of_mem_Icc` for uniqueness in an open interval. -/
325
+ theorem ODE_solution_unique_of_mem_Ioo
326
+ (ht : t₀ ∈ Ioo a b)
327
+ (hf : ∀ t ∈ Ioo a b, HasDerivAt f (v t (f t)) t ∧ f t ∈ s t)
328
+ (hg : ∀ t ∈ Ioo a b, HasDerivAt g (v t (g t)) t ∧ g t ∈ s t)
329
+ (heq : f t₀ = g t₀) :
330
+ EqOn f g (Ioo a b) := by
331
+ intros t' ht'
332
+ rcases lt_or_le t' t₀ with (h | h)
333
+ · have hss : Icc t' t₀ ⊆ Ioo a b :=
334
+ fun _ ht'' ↦ ⟨lt_of_lt_of_le ht'.1 ht''.1 , lt_of_le_of_lt ht''.2 ht.2 ⟩
335
+ exact ODE_solution_unique_of_mem_Icc_left hv
336
+ (ContinuousAt.continuousOn fun _ ht'' ↦ (hf _ <| hss ht'').1 .continuousAt)
337
+ (fun _ ht'' ↦ (hf _ <| hss <| Ioc_subset_Icc_self ht'').1 .hasDerivWithinAt)
338
+ (fun _ ht'' ↦ (hf _ <| hss <| Ioc_subset_Icc_self ht'').2 )
339
+ (ContinuousAt.continuousOn fun _ ht'' ↦ (hg _ <| hss ht'').1 .continuousAt)
340
+ (fun _ ht'' ↦ (hg _ <| hss <| Ioc_subset_Icc_self ht'').1 .hasDerivWithinAt)
341
+ (fun _ ht'' ↦ (hg _ <| hss <| Ioc_subset_Icc_self ht'').2 ) heq
342
+ ⟨le_rfl, le_of_lt h⟩
343
+ · have hss : Icc t₀ t' ⊆ Ioo a b :=
344
+ fun _ ht'' ↦ ⟨lt_of_lt_of_le ht.1 ht''.1 , lt_of_le_of_lt ht''.2 ht'.2 ⟩
345
+ exact ODE_solution_unique_of_mem_Icc_right hv
346
+ (ContinuousAt.continuousOn fun _ ht'' ↦ (hf _ <| hss ht'').1 .continuousAt)
347
+ (fun _ ht'' ↦ (hf _ <| hss <| Ico_subset_Icc_self ht'').1 .hasDerivWithinAt)
348
+ (fun _ ht'' ↦ (hf _ <| hss <| Ico_subset_Icc_self ht'').2 )
349
+ (ContinuousAt.continuousOn fun _ ht'' ↦ (hg _ <| hss ht'').1 .continuousAt)
350
+ (fun _ ht'' ↦ (hg _ <| hss <| Ico_subset_Icc_self ht'').1 .hasDerivWithinAt)
351
+ (fun _ ht'' ↦ (hg _ <| hss <| Ico_subset_Icc_self ht'').2 ) heq
352
+ ⟨h, le_rfl⟩
353
+
354
+ /-- Local unqueness of ODE solutions. -/
355
+ theorem ODE_solution_unique_of_eventually
356
+ (hf : ∀ᶠ t in 𝓝 t₀, HasDerivAt f (v t (f t)) t ∧ f t ∈ s t)
357
+ (hg : ∀ᶠ t in 𝓝 t₀, HasDerivAt g (v t (g t)) t ∧ g t ∈ s t)
358
+ (heq : f t₀ = g t₀) : f =ᶠ[𝓝 t₀] g := by
359
+ obtain ⟨ε, hε, h⟩ := eventually_nhds_iff_ball.mp (hf.and hg)
360
+ rw [Filter.eventuallyEq_iff_exists_mem]
361
+ refine ⟨ball t₀ ε, ball_mem_nhds _ hε, ?_⟩
362
+ simp_rw [Real.ball_eq_Ioo] at *
363
+ apply ODE_solution_unique_of_mem_Ioo hv (Real.ball_eq_Ioo t₀ ε ▸ mem_ball_self hε)
364
+ (fun _ ht ↦ (h _ ht).1 ) (fun _ ht ↦ (h _ ht).2 ) heq
246
365
247
366
/-- There exists only one solution of an ODE \( \dot x=v(t, x)\) with
248
- a given initial value provided that RHS is Lipschitz continuous in `x`. -/
249
- theorem ODE_solution_unique {v : ℝ → E → E} {K : ℝ≥0 } (hv : ∀ t, LipschitzWith K (v t))
250
- {f g : ℝ → E} {a b : ℝ} (hf : ContinuousOn f (Icc a b))
251
- (hf' : ∀ t ∈ Ico a b, HasDerivWithinAt f (v t (f t)) (Ici t) t) (hg : ContinuousOn g (Icc a b))
252
- (hg' : ∀ t ∈ Ico a b, HasDerivWithinAt g (v t (g t)) (Ici t) t) (ha : f a = g a) :
367
+ a given initial value provided that the RHS is Lipschitz continuous in `x`. -/
368
+ theorem ODE_solution_unique
369
+ (hv : ∀ t, LipschitzWith K (v t))
370
+ (hf : ContinuousOn f (Icc a b))
371
+ (hf' : ∀ t ∈ Ico a b, HasDerivWithinAt f (v t (f t)) (Ici t) t)
372
+ (hg : ContinuousOn g (Icc a b))
373
+ (hg' : ∀ t ∈ Ico a b, HasDerivWithinAt g (v t (g t)) (Ici t) t)
374
+ (ha : f a = g a) :
253
375
EqOn f g (Icc a b) :=
254
376
have hfs : ∀ t ∈ Ico a b, f t ∈ @univ E := fun _ _ => trivial
255
- ODE_solution_unique_of_mem_set (fun t => (hv t).lipschitzOnWith _) hf hf' hfs hg hg'
377
+ ODE_solution_unique_of_mem_Icc_right (fun t => (hv t).lipschitzOnWith _) hf hf' hfs hg hg'
256
378
(fun _ _ => trivial) ha
257
379
set_option linter.uppercaseLean3 false in
258
380
#align ODE_solution_unique ODE_solution_unique
0 commit comments