Theorem: exists_isPicardLindelof_const_of_contDiffOn_nhds
File: Mathlib/Analysis/ODE/PicardLindelof.lean

tactic: obtain ⟨L, s', hs', hlip⟩ :=
  ContDiffAt.exists_lipschitzOnWith ((hv.contDiffWithinAt (mem_of_mem_nhds hs)).contDiffAt hs)
state_before: E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : ProperSpace E
v : E → E
t₀ : ℝ
x₀ : E
s : Set E
hv : ContDiffOn ℝ 1 v s
hs : s ∈ 𝓝 x₀
⊢ ∃ ε, ε > 0 ∧ ∃ L R C, IsPicardLindelof (fun x => v) (t₀ - ε) t₀ (t₀ + ε) x₀ L R C

tactic: obtain ⟨r, hr : 0 < r, hball⟩ := Metric.mem_nhds_iff.mp (inter_sets (𝓝 x₀) hs hs')
state_before: case intro.intro.intro
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : ProperSpace E
v : E → E
t₀ : ℝ
x₀ : E
s : Set E
hv : ContDiffOn ℝ 1 v s
hs : s ∈ 𝓝 x₀
L : ℝ≥0
s' : Set E
hs' : s' ∈ 𝓝 x₀
hlip : LipschitzOnWith L v s'
⊢ ∃ ε, ε > 0 ∧ ∃ L R C, IsPicardLindelof (fun x => v) (t₀ - ε) t₀ (t₀ + ε) x₀ L R C

tactic: have hr' := (half_pos hr).le
state_before: case intro.intro.intro.intro.intro
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : ProperSpace E
v : E → E
t₀ : ℝ
x₀ : E
s : Set E
hv : ContDiffOn ℝ 1 v s
hs : s ∈ 𝓝 x₀
L : ℝ≥0
s' : Set E
hs' : s' ∈ 𝓝 x₀
hlip : LipschitzOnWith L v s'
r : ℝ
hr : 0 < r
hball : ball x₀ r ⊆ s ∩ s'
⊢ ∃ ε, ε > 0 ∧ ∃ L R C, IsPicardLindelof (fun x => v) (t₀ - ε) t₀ (t₀ + ε) x₀ L R C

tactic: obtain ⟨C, hC⟩ := (isCompact_closedBall x₀ (r / 2)).bddAbove_image <| hv.continuousOn.norm.mono
  (subset_inter_iff.mp ((closedBall_subset_ball (half_lt_self hr)).trans hball)).left
state_before: case intro.intro.intro.intro.intro
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : ProperSpace E
v : E → E
t₀ : ℝ
x₀ : E
s : Set E
hv : ContDiffOn ℝ 1 v s
hs : s ∈ 𝓝 x₀
L : ℝ≥0
s' : Set E
hs' : s' ∈ 𝓝 x₀
hlip : LipschitzOnWith L v s'
r : ℝ
hr : 0 < r
hball : ball x₀ r ⊆ s ∩ s'
hr' : 0 ≤ r / 2
⊢ ∃ ε, ε > 0 ∧ ∃ L R C, IsPicardLindelof (fun x => v) (t₀ - ε) t₀ (t₀ + ε) x₀ L R C

tactic: have hC' : 0 ≤ C := by
  apply (norm_nonneg (v x₀)).trans
  apply hC
  exact ⟨x₀, ⟨mem_closedBall_self hr', rfl⟩⟩
state_before: case intro.intro.intro.intro.intro.intro
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : ProperSpace E
v : E → E
t₀ : ℝ
x₀ : E
s : Set E
hv : ContDiffOn ℝ 1 v s
hs : s ∈ 𝓝 x₀
L : ℝ≥0
s' : Set E
hs' : s' ∈ 𝓝 x₀
hlip : LipschitzOnWith L v s'
r : ℝ
hr : 0 < r
hball : ball x₀ r ⊆ s ∩ s'
hr' : 0 ≤ r / 2
C : ℝ
hC : C ∈ upperBounds ((fun x => ‖v x‖) '' closedBall x₀ (r / 2))
⊢ ∃ ε, ε > 0 ∧ ∃ L R C, IsPicardLindelof (fun x => v) (t₀ - ε) t₀ (t₀ + ε) x₀ L R C

tactic: set ε := if C = 0 then 1 else r / 2 / C with hε
state_before: case intro.intro.intro.intro.intro.intro
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : ProperSpace E
v : E → E
t₀ : ℝ
x₀ : E
s : Set E
hv : ContDiffOn ℝ 1 v s
hs : s ∈ 𝓝 x₀
L : ℝ≥0
s' : Set E
hs' : s' ∈ 𝓝 x₀
hlip : LipschitzOnWith L v s'
r : ℝ
hr : 0 < r
hball : ball x₀ r ⊆ s ∩ s'
hr' : 0 ≤ r / 2
C : ℝ
hC : C ∈ upperBounds ((fun x => ‖v x‖) '' closedBall x₀ (r / 2))
hC' : 0 ≤ C
⊢ ∃ ε, ε > 0 ∧ ∃ L R C, IsPicardLindelof (fun x => v) (t₀ - ε) t₀ (t₀ + ε) x₀ L R C

tactic: refine' ⟨ε, hε0, L, r / 2, C, _⟩
state_before: case intro.intro.intro.intro.intro.intro
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : ProperSpace E
v : E → E
t₀ : ℝ
x₀ : E
s : Set E
hv : ContDiffOn ℝ 1 v s
hs : s ∈ 𝓝 x₀
L : ℝ≥0
s' : Set E
hs' : s' ∈ 𝓝 x₀
hlip : LipschitzOnWith L v s'
r : ℝ
hr : 0 < r
hball : ball x₀ r ⊆ s ∩ s'
hr' : 0 ≤ r / 2
C : ℝ
hC : C ∈ upperBounds ((fun x => ‖v x‖) '' closedBall x₀ (r / 2))
hC' : 0 ≤ C
ε : ℝ := if C = 0 then 1 else r / 2 / C
hε : ε = if C = 0 then 1 else r / 2 / C
hε0 : 0 < ε
⊢ ∃ ε, ε > 0 ∧ ∃ L R C, IsPicardLindelof (fun x => v) (t₀ - ε) t₀ (t₀ + ε) x₀ L R C

tactic: apply (norm_nonneg (v x₀)).trans
state_before: E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : ProperSpace E
v : E → E
t₀ : ℝ
x₀ : E
s : Set E
hv : ContDiffOn ℝ 1 v s
hs : s ∈ 𝓝 x₀
L : ℝ≥0
s' : Set E
hs' : s' ∈ 𝓝 x₀
hlip : LipschitzOnWith L v s'
r : ℝ
hr : 0 < r
hball : ball x₀ r ⊆ s ∩ s'
hr' : 0 ≤ r / 2
C : ℝ
hC : C ∈ upperBounds ((fun x => ‖v x‖) '' closedBall x₀ (r / 2))
⊢ 0 ≤ C

tactic: apply hC
state_before: E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : ProperSpace E
v : E → E
t₀ : ℝ
x₀ : E
s : Set E
hv : ContDiffOn ℝ 1 v s
hs : s ∈ 𝓝 x₀
L : ℝ≥0
s' : Set E
hs' : s' ∈ 𝓝 x₀
hlip : LipschitzOnWith L v s'
r : ℝ
hr : 0 < r
hball : ball x₀ r ⊆ s ∩ s'
hr' : 0 ≤ r / 2
C : ℝ
hC : C ∈ upperBounds ((fun x => ‖v x‖) '' closedBall x₀ (r / 2))
⊢ ‖v x₀‖ ≤ C

tactic: exact ⟨x₀, ⟨mem_closedBall_self hr', rfl⟩⟩
state_before: case a
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : ProperSpace E
v : E → E
t₀ : ℝ
x₀ : E
s : Set E
hv : ContDiffOn ℝ 1 v s
hs : s ∈ 𝓝 x₀
L : ℝ≥0
s' : Set E
hs' : s' ∈ 𝓝 x₀
hlip : LipschitzOnWith L v s'
r : ℝ
hr : 0 < r
hball : ball x₀ r ⊆ s ∩ s'
hr' : 0 ≤ r / 2
C : ℝ
hC : C ∈ upperBounds ((fun x => ‖v x‖) '' closedBall x₀ (r / 2))
⊢ ‖v x₀‖ ∈ (fun x => ‖v x‖) '' closedBall x₀ (r / 2)

tactic: rw [hε]
state_before: E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : ProperSpace E
v : E → E
t₀ : ℝ
x₀ : E
s : Set E
hv : ContDiffOn ℝ 1 v s
hs : s ∈ 𝓝 x₀
L : ℝ≥0
s' : Set E
hs' : s' ∈ 𝓝 x₀
hlip : LipschitzOnWith L v s'
r : ℝ
hr : 0 < r
hball : ball x₀ r ⊆ s ∩ s'
hr' : 0 ≤ r / 2
C : ℝ
hC : C ∈ upperBounds ((fun x => ‖v x‖) '' closedBall x₀ (r / 2))
hC' : 0 ≤ C
ε : ℝ := if C = 0 then 1 else r / 2 / C
hε : ε = if C = 0 then 1 else r / 2 / C
⊢ 0 < ε

tactic: split_ifs with h
state_before: E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : ProperSpace E
v : E → E
t₀ : ℝ
x₀ : E
s : Set E
hv : ContDiffOn ℝ 1 v s
hs : s ∈ 𝓝 x₀
L : ℝ≥0
s' : Set E
hs' : s' ∈ 𝓝 x₀
hlip : LipschitzOnWith L v s'
r : ℝ
hr : 0 < r
hball : ball x₀ r ⊆ s ∩ s'
hr' : 0 ≤ r / 2
C : ℝ
hC : C ∈ upperBounds ((fun x => ‖v x‖) '' closedBall x₀ (r / 2))
hC' : 0 ≤ C
ε : ℝ := if C = 0 then 1 else r / 2 / C
hε : ε = if C = 0 then 1 else r / 2 / C
⊢ 0 < if C = 0 then 1 else r / 2 / C

tactic: exact zero_lt_one
state_before: case inl
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : ProperSpace E
v : E → E
t₀ : ℝ
x₀ : E
s : Set E
hv : ContDiffOn ℝ 1 v s
hs : s ∈ 𝓝 x₀
L : ℝ≥0
s' : Set E
hs' : s' ∈ 𝓝 x₀
hlip : LipschitzOnWith L v s'
r : ℝ
hr : 0 < r
hball : ball x₀ r ⊆ s ∩ s'
hr' : 0 ≤ r / 2
C : ℝ
hC : C ∈ upperBounds ((fun x => ‖v x‖) '' closedBall x₀ (r / 2))
hC' : 0 ≤ C
ε : ℝ := if C = 0 then 1 else r / 2 / C
hε : ε = if C = 0 then 1 else r / 2 / C
h : C = 0
⊢ 0 < 1

tactic: exact div_pos (half_pos hr) (lt_of_le_of_ne hC' (Ne.symm h))
state_before: case inr
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : ProperSpace E
v : E → E
t₀ : ℝ
x₀ : E
s : Set E
hv : ContDiffOn ℝ 1 v s
hs : s ∈ 𝓝 x₀
L : ℝ≥0
s' : Set E
hs' : s' ∈ 𝓝 x₀
hlip : LipschitzOnWith L v s'
r : ℝ
hr : 0 < r
hball : ball x₀ r ⊆ s ∩ s'
hr' : 0 ≤ r / 2
C : ℝ
hC : C ∈ upperBounds ((fun x => ‖v x‖) '' closedBall x₀ (r / 2))
hC' : 0 ≤ C
ε : ℝ := if C = 0 then 1 else r / 2 / C
hε : ε = if C = 0 then 1 else r / 2 / C
h : ¬C = 0
⊢ 0 < r / 2 / C

tactic: rw [← Real.closedBall_eq_Icc]
state_before: E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : ProperSpace E
v : E → E
t₀ : ℝ
x₀ : E
s : Set E
hv : ContDiffOn ℝ 1 v s
hs : s ∈ 𝓝 x₀
L : ℝ≥0
s' : Set E
hs' : s' ∈ 𝓝 x₀
hlip : LipschitzOnWith L v s'
r : ℝ
hr : 0 < r
hball : ball x₀ r ⊆ s ∩ s'
hr' : 0 ≤ r / 2
C : ℝ
hC : C ∈ upperBounds ((fun x => ‖v x‖) '' closedBall x₀ (r / 2))
hC' : 0 ≤ C
ε : ℝ := if C = 0 then 1 else r / 2 / C
hε : ε = if C = 0 then 1 else r / 2 / C
hε0 : 0 < ε
⊢ t₀ ∈ Icc (t₀ - ε) (t₀ + ε)

tactic: exact mem_closedBall_self hε0.le
state_before: E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : ProperSpace E
v : E → E
t₀ : ℝ
x₀ : E
s : Set E
hv : ContDiffOn ℝ 1 v s
hs : s ∈ 𝓝 x₀
L : ℝ≥0
s' : Set E
hs' : s' ∈ 𝓝 x₀
hlip : LipschitzOnWith L v s'
r : ℝ
hr : 0 < r
hball : ball x₀ r ⊆ s ∩ s'
hr' : 0 ≤ r / 2
C : ℝ
hC : C ∈ upperBounds ((fun x => ‖v x‖) '' closedBall x₀ (r / 2))
hC' : 0 ≤ C
ε : ℝ := if C = 0 then 1 else r / 2 / C
hε : ε = if C = 0 then 1 else r / 2 / C
hε0 : 0 < ε
⊢ t₀ ∈ closedBall t₀ ε

tactic: rw [add_sub_cancel', sub_sub_cancel, max_self, mul_ite, mul_one]
state_before: E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : ProperSpace E
v : E → E
t₀ : ℝ
x₀ : E
s : Set E
hv : ContDiffOn ℝ 1 v s
hs : s ∈ 𝓝 x₀
L : ℝ≥0
s' : Set E
hs' : s' ∈ 𝓝 x₀
hlip : LipschitzOnWith L v s'
r : ℝ
hr : 0 < r
hball : ball x₀ r ⊆ s ∩ s'
hr' : 0 ≤ r / 2
C : ℝ
hC : C ∈ upperBounds ((fun x => ‖v x‖) '' closedBall x₀ (r / 2))
hC' : 0 ≤ C
ε : ℝ := if C = 0 then 1 else r / 2 / C
hε : ε = if C = 0 then 1 else r / 2 / C
hε0 : 0 < ε
⊢ C * max (t₀ + ε - t₀) (t₀ - (t₀ - ε)) ≤ r / 2

tactic: split_ifs with h
state_before: E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : ProperSpace E
v : E → E
t₀ : ℝ
x₀ : E
s : Set E
hv : ContDiffOn ℝ 1 v s
hs : s ∈ 𝓝 x₀
L : ℝ≥0
s' : Set E
hs' : s' ∈ 𝓝 x₀
hlip : LipschitzOnWith L v s'
r : ℝ
hr : 0 < r
hball : ball x₀ r ⊆ s ∩ s'
hr' : 0 ≤ r / 2
C : ℝ
hC : C ∈ upperBounds ((fun x => ‖v x‖) '' closedBall x₀ (r / 2))
hC' : 0 ≤ C
ε : ℝ := if C = 0 then 1 else r / 2 / C
hε : ε = if C = 0 then 1 else r / 2 / C
hε0 : 0 < ε
⊢ (if C = 0 then C else C * (r / 2 / C)) ≤ r / 2

tactic: rwa [← h] at hr'
state_before: case inl
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : ProperSpace E
v : E → E
t₀ : ℝ
x₀ : E
s : Set E
hv : ContDiffOn ℝ 1 v s
hs : s ∈ 𝓝 x₀
L : ℝ≥0
s' : Set E
hs' : s' ∈ 𝓝 x₀
hlip : LipschitzOnWith L v s'
r : ℝ
hr : 0 < r
hball : ball x₀ r ⊆ s ∩ s'
hr' : 0 ≤ r / 2
C : ℝ
hC : C ∈ upperBounds ((fun x => ‖v x‖) '' closedBall x₀ (r / 2))
hC' : 0 ≤ C
ε : ℝ := if C = 0 then 1 else r / 2 / C
hε : ε = if C = 0 then 1 else r / 2 / C
hε0 : 0 < ε
h : C = 0
⊢ C ≤ r / 2

tactic: exact (mul_div_cancel' (r / 2) h).le
state_before: case inr
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : ProperSpace E
v : E → E
t₀ : ℝ
x₀ : E
s : Set E
hv : ContDiffOn ℝ 1 v s
hs : s ∈ 𝓝 x₀
L : ℝ≥0
s' : Set E
hs' : s' ∈ 𝓝 x₀
hlip : LipschitzOnWith L v s'
r : ℝ
hr : 0 < r
hball : ball x₀ r ⊆ s ∩ s'
hr' : 0 ≤ r / 2
C : ℝ
hC : C ∈ upperBounds ((fun x => ‖v x‖) '' closedBall x₀ (r / 2))
hC' : 0 ≤ C
ε : ℝ := if C = 0 then 1 else r / 2 / C
hε : ε = if C = 0 then 1 else r / 2 / C
hε0 : 0 < ε
h : ¬C = 0
⊢ C * (r / 2 / C) ≤ r / 2