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

tactic: obtain ⟨L, s, hs, hlip⟩ := hv.exists_lipschitzOnWith
state_before: E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
v : E → E
t₀ : ℝ
x₀ : E
hv : ContDiffAt ℝ 1 v x₀
⊢ ∃ ε > 0, ∃ L R C, IsPicardLindelof (fun x => v) (t₀ - ε) t₀ (t₀ + ε) x₀ L R C
state_after: case intro.intro.intro
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
v : E → E
t₀ : ℝ
x₀ : E
hv : ContDiffAt ℝ 1 v 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: obtain ⟨R₁, hR₁ : 0 < R₁, hball⟩ := Metric.mem_nhds_iff.mp hs
state_before: case intro.intro.intro
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
v : E → E
t₀ : ℝ
x₀ : E
hv : ContDiffAt ℝ 1 v 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
state_after: case intro.intro.intro.intro.intro
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
v : E → E
t₀ : ℝ
x₀ : E
hv : ContDiffAt ℝ 1 v x₀
L : ℝ≥0
s : Set E
hs : s ∈ 𝓝 x₀
hlip : LipschitzOnWith L v s
R₁ : ℝ
hR₁ : 0 < R₁
hball : ball x₀ R₁ ⊆ s
⊢ ∃ ε > 0, ∃ L R C, IsPicardLindelof (fun x => v) (t₀ - ε) t₀ (t₀ + ε) x₀ L R C

tactic: obtain ⟨R₂, hR₂ : 0 < R₂, hbdd⟩ := Metric.continuousAt_iff.mp hv.continuousAt.norm 1 zero_lt_one
state_before: case intro.intro.intro.intro.intro
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
v : E → E
t₀ : ℝ
x₀ : E
hv : ContDiffAt ℝ 1 v x₀
L : ℝ≥0
s : Set E
hs : s ∈ 𝓝 x₀
hlip : LipschitzOnWith L v s
R₁ : ℝ
hR₁ : 0 < R₁
hball : ball x₀ R₁ ⊆ s
⊢ ∃ ε > 0, ∃ L R C, IsPicardLindelof (fun x => v) (t₀ - ε) t₀ (t₀ + ε) x₀ L R C
state_after: case intro.intro.intro.intro.intro.intro.intro
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
v : E → E
t₀ : ℝ
x₀ : E
hv : ContDiffAt ℝ 1 v x₀
L : ℝ≥0
s : Set E
hs : s ∈ 𝓝 x₀
hlip : LipschitzOnWith L v s
R₁ : ℝ
hR₁ : 0 < R₁
hball : ball x₀ R₁ ⊆ s
R₂ : ℝ
hR₂ : 0 < R₂
hbdd : ∀ {x : E}, dist x x₀ < R₂ → dist ‖v x‖ ‖v x₀‖ < 1
⊢ ∃ ε > 0, ∃ L R C, IsPicardLindelof (fun x => v) (t₀ - ε) t₀ (t₀ + ε) x₀ L R C

tactic: have hbdd' : ∀ x ∈ Metric.ball x₀ R₂, ‖v x‖ ≤ 1 + ‖v x₀‖ := fun _ hx =>
  sub_le_iff_le_add.mp <| le_of_lt <| lt_of_abs_lt <| Real.dist_eq _ _ ▸ hbdd hx
state_before: case intro.intro.intro.intro.intro.intro.intro
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
v : E → E
t₀ : ℝ
x₀ : E
hv : ContDiffAt ℝ 1 v x₀
L : ℝ≥0
s : Set E
hs : s ∈ 𝓝 x₀
hlip : LipschitzOnWith L v s
R₁ : ℝ
hR₁ : 0 < R₁
hball : ball x₀ R₁ ⊆ s
R₂ : ℝ
hR₂ : 0 < R₂
hbdd : ∀ {x : E}, dist x x₀ < R₂ → dist ‖v x‖ ‖v x₀‖ < 1
⊢ ∃ ε > 0, ∃ L R C, IsPicardLindelof (fun x => v) (t₀ - ε) t₀ (t₀ + ε) x₀ L R C
state_after: case intro.intro.intro.intro.intro.intro.intro
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
v : E → E
t₀ : ℝ
x₀ : E
hv : ContDiffAt ℝ 1 v x₀
L : ℝ≥0
s : Set E
hs : s ∈ 𝓝 x₀
hlip : LipschitzOnWith L v s
R₁ : ℝ
hR₁ : 0 < R₁
hball : ball x₀ R₁ ⊆ s
R₂ : ℝ
hR₂ : 0 < R₂
hbdd : ∀ {x : E}, dist x x₀ < R₂ → dist ‖v x‖ ‖v x₀‖ < 1
hbdd' : ∀ x ∈ ball x₀ R₂, ‖v x‖ ≤ 1 + ‖v x₀‖
⊢ ∃ ε > 0, ∃ L R C, IsPicardLindelof (fun x => v) (t₀ - ε) t₀ (t₀ + ε) x₀ L R C

tactic: set ε := min R₁ R₂ / 2 / (1 + ‖v x₀‖) with hε
state_before: case intro.intro.intro.intro.intro.intro.intro
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
v : E → E
t₀ : ℝ
x₀ : E
hv : ContDiffAt ℝ 1 v x₀
L : ℝ≥0
s : Set E
hs : s ∈ 𝓝 x₀
hlip : LipschitzOnWith L v s
R₁ : ℝ
hR₁ : 0 < R₁
hball : ball x₀ R₁ ⊆ s
R₂ : ℝ
hR₂ : 0 < R₂
hbdd : ∀ {x : E}, dist x x₀ < R₂ → dist ‖v x‖ ‖v x₀‖ < 1
hbdd' : ∀ x ∈ ball x₀ R₂, ‖v x‖ ≤ 1 + ‖v x₀‖
⊢ ∃ ε > 0, ∃ L R C, IsPicardLindelof (fun x => v) (t₀ - ε) t₀ (t₀ + ε) x₀ L R C
state_after: case intro.intro.intro.intro.intro.intro.intro
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
v : E → E
t₀ : ℝ
x₀ : E
hv : ContDiffAt ℝ 1 v x₀
L : ℝ≥0
s : Set E
hs : s ∈ 𝓝 x₀
hlip : LipschitzOnWith L v s
R₁ : ℝ
hR₁ : 0 < R₁
hball : ball x₀ R₁ ⊆ s
R₂ : ℝ
hR₂ : 0 < R₂
hbdd : ∀ {x : E}, dist x x₀ < R₂ → dist ‖v x‖ ‖v x₀‖ < 1
hbdd' : ∀ x ∈ ball x₀ R₂, ‖v x‖ ≤ 1 + ‖v x₀‖
ε : ℝ := min R₁ R₂ / 2 / (1 + ‖v x₀‖)
hε : ε = min R₁ R₂ / 2 / (1 + ‖v x₀‖)
⊢ ∃ ε > 0, ∃ L R C, IsPicardLindelof (fun x => v) (t₀ - ε) t₀ (t₀ + ε) x₀ L R C

tactic: have hε0 : 0 < ε := hε ▸ div_pos (half_pos <| lt_min hR₁ hR₂)
  (add_pos_of_pos_of_nonneg zero_lt_one (norm_nonneg _))
state_before: case intro.intro.intro.intro.intro.intro.intro
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
v : E → E
t₀ : ℝ
x₀ : E
hv : ContDiffAt ℝ 1 v x₀
L : ℝ≥0
s : Set E
hs : s ∈ 𝓝 x₀
hlip : LipschitzOnWith L v s
R₁ : ℝ
hR₁ : 0 < R₁
hball : ball x₀ R₁ ⊆ s
R₂ : ℝ
hR₂ : 0 < R₂
hbdd : ∀ {x : E}, dist x x₀ < R₂ → dist ‖v x‖ ‖v x₀‖ < 1
hbdd' : ∀ x ∈ ball x₀ R₂, ‖v x‖ ≤ 1 + ‖v x₀‖
ε : ℝ := min R₁ R₂ / 2 / (1 + ‖v x₀‖)
hε : ε = min R₁ R₂ / 2 / (1 + ‖v x₀‖)
⊢ ∃ ε > 0, ∃ L R C, IsPicardLindelof (fun x => v) (t₀ - ε) t₀ (t₀ + ε) x₀ L R C
state_after: case intro.intro.intro.intro.intro.intro.intro
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
v : E → E
t₀ : ℝ
x₀ : E
hv : ContDiffAt ℝ 1 v x₀
L : ℝ≥0
s : Set E
hs : s ∈ 𝓝 x₀
hlip : LipschitzOnWith L v s
R₁ : ℝ
hR₁ : 0 < R₁
hball : ball x₀ R₁ ⊆ s
R₂ : ℝ
hR₂ : 0 < R₂
hbdd : ∀ {x : E}, dist x x₀ < R₂ → dist ‖v x‖ ‖v x₀‖ < 1
hbdd' : ∀ x ∈ ball x₀ R₂, ‖v x‖ ≤ 1 + ‖v x₀‖
ε : ℝ := min R₁ R₂ / 2 / (1 + ‖v x₀‖)
hε : ε = min R₁ R₂ / 2 / (1 + ‖v x₀‖)
hε0 : 0 < ε
⊢ ∃ ε > 0, ∃ L R C, IsPicardLindelof (fun x => v) (t₀ - ε) t₀ (t₀ + ε) x₀ L R C

tactic: refine ⟨ε, hε0, L, min R₁ R₂ / 2, 1 + ‖v x₀‖, ?_⟩
state_before: case intro.intro.intro.intro.intro.intro.intro
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
v : E → E
t₀ : ℝ
x₀ : E
hv : ContDiffAt ℝ 1 v x₀
L : ℝ≥0
s : Set E
hs : s ∈ 𝓝 x₀
hlip : LipschitzOnWith L v s
R₁ : ℝ
hR₁ : 0 < R₁
hball : ball x₀ R₁ ⊆ s
R₂ : ℝ
hR₂ : 0 < R₂
hbdd : ∀ {x : E}, dist x x₀ < R₂ → dist ‖v x‖ ‖v x₀‖ < 1
hbdd' : ∀ x ∈ ball x₀ R₂, ‖v x‖ ≤ 1 + ‖v x₀‖
ε : ℝ := min R₁ R₂ / 2 / (1 + ‖v x₀‖)
hε : ε = min R₁ R₂ / 2 / (1 + ‖v x₀‖)
hε0 : 0 < ε
⊢ ∃ ε > 0, ∃ L R C, IsPicardLindelof (fun x => v) (t₀ - ε) t₀ (t₀ + ε) x₀ L R C
state_after: case intro.intro.intro.intro.intro.intro.intro
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
v : E → E
t₀ : ℝ
x₀ : E
hv : ContDiffAt ℝ 1 v x₀
L : ℝ≥0
s : Set E
hs : s ∈ 𝓝 x₀
hlip : LipschitzOnWith L v s
R₁ : ℝ
hR₁ : 0 < R₁
hball : ball x₀ R₁ ⊆ s
R₂ : ℝ
hR₂ : 0 < R₂
hbdd : ∀ {x : E}, dist x x₀ < R₂ → dist ‖v x‖ ‖v x₀‖ < 1
hbdd' : ∀ x ∈ ball x₀ R₂, ‖v x‖ ≤ 1 + ‖v x₀‖
ε : ℝ := min R₁ R₂ / 2 / (1 + ‖v x₀‖)
hε : ε = min R₁ R₂ / 2 / (1 + ‖v x₀‖)
hε0 : 0 < ε
⊢ IsPicardLindelof (fun x => v) (t₀ - ε) t₀ (t₀ + ε) x₀ L (min R₁ R₂ / 2) (1 + ‖v x₀‖)

tactic: exact
  { ht₀ := Real.closedBall_eq_Icc ▸ mem_closedBall_self hε0.le
    hR := by positivity
    lipschitz := fun _ _ => hlip.mono <|
      (closedBall_subset_ball <| half_lt_self <| lt_min hR₁ hR₂).trans <|
      (Metric.ball_subset_ball <| min_le_left _ _).trans hball
    cont := fun _ _ => continuousOn_const
    norm_le := fun _ _ x hx => hbdd' x <| mem_of_mem_of_subset hx <|
      (closedBall_subset_ball <| half_lt_self <| lt_min hR₁ hR₂).trans <|
      (Metric.ball_subset_ball <| min_le_right _ _).trans (subset_refl _)
    C_mul_le_R := by
      rw [add_sub_cancel_left, sub_sub_cancel, max_self, hε, mul_div_left_comm, div_self, mul_one]
      exact ne_of_gt <| add_pos_of_pos_of_nonneg zero_lt_one <| norm_nonneg _ }
state_before: case intro.intro.intro.intro.intro.intro.intro
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
v : E → E
t₀ : ℝ
x₀ : E
hv : ContDiffAt ℝ 1 v x₀
L : ℝ≥0
s : Set E
hs : s ∈ 𝓝 x₀
hlip : LipschitzOnWith L v s
R₁ : ℝ
hR₁ : 0 < R₁
hball : ball x₀ R₁ ⊆ s
R₂ : ℝ
hR₂ : 0 < R₂
hbdd : ∀ {x : E}, dist x x₀ < R₂ → dist ‖v x‖ ‖v x₀‖ < 1
hbdd' : ∀ x ∈ ball x₀ R₂, ‖v x‖ ≤ 1 + ‖v x₀‖
ε : ℝ := min R₁ R₂ / 2 / (1 + ‖v x₀‖)
hε : ε = min R₁ R₂ / 2 / (1 + ‖v x₀‖)
hε0 : 0 < ε
⊢ IsPicardLindelof (fun x => v) (t₀ - ε) t₀ (t₀ + ε) x₀ L (min R₁ R₂ / 2) (1 + ‖v x₀‖)
state_after: no goals

tactic: positivity
state_before: E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
v : E → E
t₀ : ℝ
x₀ : E
hv : ContDiffAt ℝ 1 v x₀
L : ℝ≥0
s : Set E
hs : s ∈ 𝓝 x₀
hlip : LipschitzOnWith L v s
R₁ : ℝ
hR₁ : 0 < R₁
hball : ball x₀ R₁ ⊆ s
R₂ : ℝ
hR₂ : 0 < R₂
hbdd : ∀ {x : E}, dist x x₀ < R₂ → dist ‖v x‖ ‖v x₀‖ < 1
hbdd' : ∀ x ∈ ball x₀ R₂, ‖v x‖ ≤ 1 + ‖v x₀‖
ε : ℝ := min R₁ R₂ / 2 / (1 + ‖v x₀‖)
hε : ε = min R₁ R₂ / 2 / (1 + ‖v x₀‖)
hε0 : 0 < ε
⊢ 0 ≤ min R₁ R₂ / 2
state_after: no goals

tactic: rw [add_sub_cancel_left, sub_sub_cancel, max_self, hε, mul_div_left_comm, div_self, mul_one]
state_before: E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
v : E → E
t₀ : ℝ
x₀ : E
hv : ContDiffAt ℝ 1 v x₀
L : ℝ≥0
s : Set E
hs : s ∈ 𝓝 x₀
hlip : LipschitzOnWith L v s
R₁ : ℝ
hR₁ : 0 < R₁
hball : ball x₀ R₁ ⊆ s
R₂ : ℝ
hR₂ : 0 < R₂
hbdd : ∀ {x : E}, dist x x₀ < R₂ → dist ‖v x‖ ‖v x₀‖ < 1
hbdd' : ∀ x ∈ ball x₀ R₂, ‖v x‖ ≤ 1 + ‖v x₀‖
ε : ℝ := min R₁ R₂ / 2 / (1 + ‖v x₀‖)
hε : ε = min R₁ R₂ / 2 / (1 + ‖v x₀‖)
hε0 : 0 < ε
⊢ (1 + ‖v x₀‖) * max (t₀ + ε - t₀) (t₀ - (t₀ - ε)) ≤ min R₁ R₂ / 2
state_after: E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
v : E → E
t₀ : ℝ
x₀ : E
hv : ContDiffAt ℝ 1 v x₀
L : ℝ≥0
s : Set E
hs : s ∈ 𝓝 x₀
hlip : LipschitzOnWith L v s
R₁ : ℝ
hR₁ : 0 < R₁
hball : ball x₀ R₁ ⊆ s
R₂ : ℝ
hR₂ : 0 < R₂
hbdd : ∀ {x : E}, dist x x₀ < R₂ → dist ‖v x‖ ‖v x₀‖ < 1
hbdd' : ∀ x ∈ ball x₀ R₂, ‖v x‖ ≤ 1 + ‖v x₀‖
ε : ℝ := min R₁ R₂ / 2 / (1 + ‖v x₀‖)
hε : ε = min R₁ R₂ / 2 / (1 + ‖v x₀‖)
hε0 : 0 < ε
⊢ 1 + ‖v x₀‖ ≠ 0

tactic: exact ne_of_gt <| add_pos_of_pos_of_nonneg zero_lt_one <| norm_nonneg _
state_before: E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
v : E → E
t₀ : ℝ
x₀ : E
hv : ContDiffAt ℝ 1 v x₀
L : ℝ≥0
s : Set E
hs : s ∈ 𝓝 x₀
hlip : LipschitzOnWith L v s
R₁ : ℝ
hR₁ : 0 < R₁
hball : ball x₀ R₁ ⊆ s
R₂ : ℝ
hR₂ : 0 < R₂
hbdd : ∀ {x : E}, dist x x₀ < R₂ → dist ‖v x‖ ‖v x₀‖ < 1
hbdd' : ∀ x ∈ ball x₀ R₂, ‖v x‖ ≤ 1 + ‖v x₀‖
ε : ℝ := min R₁ R₂ / 2 / (1 + ‖v x₀‖)
hε : ε = min R₁ R₂ / 2 / (1 + ‖v x₀‖)
hε0 : 0 < ε
⊢ 1 + ‖v x₀‖ ≠ 0
state_after: no goals