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

Proof steps:
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 ⟨L, s, hs, hlip⟩ := hv.exists_lipschitzOnWith
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₁, hball⟩ := Metric.mem_nhds_iff.mp hs
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: 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.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: 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
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: 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₀‖
ε : ℝ := 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: 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₀‖)
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: 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 < ε
⊢ IsPicardLindelof (fun x => v) (t₀ - ε) t₀ (t₀ + ε) x₀ L (min R₁ R₂ / 2) (1 + ‖v x₀‖)
state_after: no goals
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 _ }