Imports
/-
Copyright (c) 2025 Joseph Tooby-Smith. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Matteo Cipollina, Joseph Tooby-Smith
-/
module
public import Mathlib.Analysis.Calculus.Deriv.Inv
public import Mathlib.Analysis.InnerProductSpace.Basic
public import Physlib.StatisticalMechanics.BoltzmannConstantTemperature
In this module we define the type Temperature, corresponding to the temperature in a given
(but arbitrary) set of units which have absolute zero at zero.
This is the version of temperature most often used in undergraduate and non-mathematical physics.
The choice of units can be made on a case-by-case basis, as long as they are done consistently.
@[expose] public section
The type Temperature represents the temperature in a given (but arbitrary) set of units
(preserving zero). It currently wraps ℝ≥0, i.e., absolute temperature in nonnegative reals.
The nonnegative real value of the temperature.
structure Temperature where val : ℝ≥0
Coercion to ℝ≥0.
instance : Coe Temperature ℝ≥0 := ⟨fun T => T.val⟩
Topology on Temperature induced from ℝ≥0.
instance : TopologicalSpace Temperature :=
TopologicalSpace.induced (fun T : Temperature => (T.val : ℝ≥0)) inferInstanceinstance : Zero Temperature := ⟨⟨0⟩⟩@[ext] lemma ext {T₁ T₂ : Temperature} (h : T₁.val = T₂.val) : T₁ = T₂ := T₁:TemperatureT₂:Temperatureh:T₁.val = T₂.val⊢ T₁ = T₂
T₂:Temperatureval✝:ℝ≥0h:{ val := val✝ }.val = T₂.val⊢ { val := val✝ } = T₂; val✝¹:ℝ≥0val✝:ℝ≥0h:{ val := val✝¹ }.val = { val := val✝ }.val⊢ { val := val✝¹ } = { val := val✝ }; val✝:ℝ≥0⊢ { val := val✝ } = { val := val✝ }; All goals completed! 🐙lemma β_toReal (T : Temperature) : (β T : ℝ) = 1 / (kB * (T : ℝ)) := rfllemma ofβ_eq : ofβ = fun β => ⟨⟨1 / (kB * β), β:ℝ≥0⊢ 0 ≤ 1 / (kB * ↑β)
β:ℝ≥0⊢ 0 ≤ 1β:ℝ≥0⊢ 0 ≤ kB * ↑β
β:ℝ≥0⊢ 0 ≤ 1 All goals completed! 🐙
β:ℝ≥0⊢ 0 ≤ kB * ↑β β:ℝ≥0⊢ 0 ≤ kBβ:ℝ≥0⊢ 0 ≤ ↑β
β:ℝ≥0⊢ 0 ≤ kB All goals completed! 🐙
β:ℝ≥0⊢ 0 ≤ ↑β All goals completed! 🐙⟩⟩ := ⊢ ofβ = fun β => { val := ⟨1 / (kB * ↑β), ⋯⟩ }
All goals completed! 🐙All goals completed! 🐙lemma ofβ_toReal (β : ℝ≥0) : (ofβ β).toReal = 1 / (kB * (β : ℝ)) := rfl
@[simp]
lemma ofβ_β (T : Temperature) : ofβ (β T) = T := by T:Temperature⊢ ofβ T.β = T
apply Temperature.ext T:Temperature⊢ (ofβ T.β).val = T.val
apply NNReal.coe_injective T:Temperature⊢ ↑(ofβ T.β).val = ↑T.val
show 1 / (kB * (1 / (kB * (T : ℝ)))) = (T : ℝ) T:Temperature⊢ 1 / (kB * (1 / (kB * T.toReal))) = T.toReal
rw [mul_one_div, T:Temperature⊢ 1 / (kB / (kB * T.toReal)) = T.toReal All goals completed! 🐙 one_div_div, T:Temperature⊢ kB * T.toReal / kB = T.toReal All goals completed! 🐙 mul_div_cancel_left₀ _ kB_ne_zero T:Temperature⊢ T.toReal = T.toReal All goals completed! 🐙] All goals completed! 🐙
Positivity of β from positivity of temperature.
lemma beta_pos (T : Temperature) (hT_pos : 0 < T.val) : 0 < (T.β : ℝ) := by T:TemperaturehT_pos:0 < T.val⊢ 0 < ↑T.β
rw [β_toReal T:TemperaturehT_pos:0 < T.val⊢ 0 < 1 / (kB * T.toReal) T:TemperaturehT_pos:0 < T.val⊢ 0 < 1 / (kB * T.toReal)] T:TemperaturehT_pos:0 < T.val⊢ 0 < 1 / (kB * T.toReal)
exact one_div_pos.mpr (mul_pos kB_pos (by T:TemperaturehT_pos:0 < T.val⊢ 0 < T.toReal exact_mod_cast hT_pos All goals completed! 🐙))
Regularity of ofβ
lemma ofβ_continuousOn : ContinuousOn (ofβ : ℝ≥0 → Temperature) (Set.Ioi 0) := by ⊢ ContinuousOn ofβ (Set.Ioi 0)
have hg : ContinuousOn (fun b : ℝ≥0 => (1 : ℝ) / (kB * (b : ℝ))) (Set.Ioi 0) := by
apply ContinuousOn.div continuousOn_const (by ⊢ ContinuousOn (fun b => kB * ↑b) (Set.Ioi 0) hg:ContinuousOn (fun b => 1 / (kB * ↑b)) (Set.Ioi 0)⊢ ContinuousOn ofβ (Set.Ioi 0) fun_prop All goals completed! 🐙 hg:ContinuousOn (fun b => 1 / (kB * ↑b)) (Set.Ioi 0)⊢ ContinuousOn ofβ (Set.Ioi 0))
intro b hb b:ℝ≥0hb:b ∈ Set.Ioi 0⊢ kB * ↑b ≠ 0 hg:ContinuousOn (fun b => 1 / (kB * ↑b)) (Set.Ioi 0)⊢ ContinuousOn ofβ (Set.Ioi 0)
exact ne_of_gt (mul_pos kB_pos (by b:ℝ≥0hb:b ∈ Set.Ioi 0⊢ 0 < ↑b hg:ContinuousOn (fun b => 1 / (kB * ↑b)) (Set.Ioi 0)⊢ ContinuousOn ofβ (Set.Ioi 0) exact_mod_cast hb All goals completed! 🐙 hg:ContinuousOn (fun b => 1 / (kB * ↑b)) (Set.Ioi 0)⊢ ContinuousOn ofβ (Set.Ioi 0))) hg:ContinuousOn (fun b => 1 / (kB * ↑b)) (Set.Ioi 0)⊢ ContinuousOn ofβ (Set.Ioi 0)
have hind : Topology.IsInducing (fun T : Temperature => (T.val : ℝ≥0)) := ⟨rfl⟩ hg:ContinuousOn (fun b => 1 / (kB * ↑b)) (Set.Ioi 0)hind:IsInducing fun T => T.val⊢ ContinuousOn ofβ (Set.Ioi 0)
rw [hind.continuousOn_iff hg:ContinuousOn (fun b => 1 / (kB * ↑b)) (Set.Ioi 0)hind:IsInducing fun T => T.val⊢ ContinuousOn ((fun T => T.val) ∘ ofβ) (Set.Ioi 0) hg:ContinuousOn (fun b => 1 / (kB * ↑b)) (Set.Ioi 0)hind:IsInducing fun T => T.val⊢ ContinuousOn ((fun T => T.val) ∘ ofβ) (Set.Ioi 0)] hg:ContinuousOn (fun b => 1 / (kB * ↑b)) (Set.Ioi 0)hind:IsInducing fun T => T.val⊢ ContinuousOn ((fun T => T.val) ∘ ofβ) (Set.Ioi 0)
refine (continuous_real_toNNReal.comp_continuousOn hg).congr ?_ hg:ContinuousOn (fun b => 1 / (kB * ↑b)) (Set.Ioi 0)hind:IsInducing fun T => T.val⊢ Set.EqOn ((fun T => T.val) ∘ ofβ) (Real.toNNReal ∘ fun b => 1 / (kB * ↑b)) (Set.Ioi 0)
intro b hb hg:ContinuousOn (fun b => 1 / (kB * ↑b)) (Set.Ioi 0)hind:IsInducing fun T => T.valb:ℝ≥0hb:b ∈ Set.Ioi 0⊢ ((fun T => T.val) ∘ ofβ) b = (Real.toNNReal ∘ fun b => 1 / (kB * ↑b)) b
exact (Real.toNNReal_of_nonneg (div_nonneg zero_le_one (mul_nonneg kB_nonneg b.2))).symm All goals completed! 🐙
lemma ofβ_differentiableOn :
DifferentiableOn ℝ (fun (x : ℝ) => ((ofβ (Real.toNNReal x)).val : ℝ)) (Set.Ioi 0) := by ⊢ DifferentiableOn ℝ (fun x => ↑(ofβ x.toNNReal).val) (Set.Ioi 0)
refine DifferentiableOn.congr (f := fun x => 1 / (kB * x)) ?_ ?_ refine_1 ⊢ DifferentiableOn ℝ (fun x => 1 / (kB * x)) (Set.Ioi 0)refine_2 ⊢ ∀ x ∈ Set.Ioi 0, ↑(ofβ x.toNNReal).val = 1 / (kB * x)
· refine_1 ⊢ DifferentiableOn ℝ (fun x => 1 / (kB * x)) (Set.Ioi 0) refine DifferentiableOn.fun_div ?_ ?_ ?_ refine_1.refine_1 ⊢ DifferentiableOn ℝ (fun x => 1) (Set.Ioi 0)refine_1.refine_2 ⊢ DifferentiableOn ℝ (HMul.hMul kB) (Set.Ioi 0)refine_1.refine_3 ⊢ ∀ x ∈ Set.Ioi 0, kB * x ≠ 0
· refine_1.refine_1 ⊢ DifferentiableOn ℝ (fun x => 1) (Set.Ioi 0) fun_prop All goals completed! 🐙
· refine_1.refine_2 ⊢ DifferentiableOn ℝ (HMul.hMul kB) (Set.Ioi 0) fun_prop All goals completed! 🐙
· refine_1.refine_3 ⊢ ∀ x ∈ Set.Ioi 0, kB * x ≠ 0 intro x hx refine_1.refine_3 x:ℝhx:x ∈ Set.Ioi 0⊢ kB * x ≠ 0
exact mul_ne_zero kB_ne_zero (ne_of_gt hx) All goals completed! 🐙
· refine_2 ⊢ ∀ x ∈ Set.Ioi 0, ↑(ofβ x.toNNReal).val = 1 / (kB * x) intro x hx refine_2 x:ℝhx:x ∈ Set.Ioi 0⊢ ↑(ofβ x.toNNReal).val = 1 / (kB * x)
rw [show ((ofβ (Real.toNNReal x)).val : ℝ) = (ofβ (Real.toNNReal x)).toReal from rfl, refine_2 x:ℝhx:x ∈ Set.Ioi 0⊢ (ofβ x.toNNReal).toReal = 1 / (kB * x) All goals completed! 🐙
ofβ_toReal, refine_2 x:ℝhx:x ∈ Set.Ioi 0⊢ 1 / (kB * ↑x.toNNReal) = 1 / (kB * x) All goals completed! 🐙 Real.coe_toNNReal x hx.le refine_2 x:ℝhx:x ∈ Set.Ioi 0⊢ 1 / (kB * x) = 1 / (kB * x) All goals completed! 🐙] All goals completed! 🐙Convergence
Eventually, ofβ β is positive as β → ∞`.
lemma eventually_pos_ofβ : ∀ᶠ b : ℝ≥0 in atTop, ((Temperature.ofβ b : Temperature) : ℝ) > 0 := by ⊢ ∀ᶠ (b : ℝ≥0) in atTop, (ofβ b).toReal > 0
filter_upwards [eventually_gt_atTop 0] with b hb b:ℝ≥0hb:0 < b⊢ (ofβ b).toReal > 0
have : 0 < (1 : ℝ) / (kB * (b : ℝ)) := one_div_pos.mpr (mul_pos kB_pos (by b:ℝ≥0hb:0 < b⊢ 0 < ↑b b:ℝ≥0hb:0 < bthis:0 < 1 / (kB * ↑b)⊢ (ofβ b).toReal > 0 exact_mod_cast hb All goals completed! 🐙 b:ℝ≥0hb:0 < bthis:0 < 1 / (kB * ↑b)⊢ (ofβ b).toReal > 0)) b:ℝ≥0hb:0 < bthis:0 < 1 / (kB * ↑b)⊢ (ofβ b).toReal > 0
simpa [ofβ_toReal] using this All goals completed! 🐙
General helper: for any a > 0, we have 1 / (a * b) → 0 as b → ∞ in ℝ≥0.
private lemma tendsto_const_inv_mul_atTop (a : ℝ) (ha : 0 < a) :
Tendsto (fun b : ℝ≥0 => (1 : ℝ) / (a * (b : ℝ))) atTop (𝓝 (0 : ℝ)) := by a:ℝha:0 < a⊢ Tendsto (fun b => 1 / (a * ↑b)) atTop (𝓝 0)
have h : Tendsto (fun b : ℝ≥0 => a * (b : ℝ)) atTop atTop :=
(NNReal.tendsto_coe_atTop.2 tendsto_id).const_mul_atTop ha a:ℝha:0 < ah:Tendsto (fun b => a * ↑b) atTop atTop⊢ Tendsto (fun b => 1 / (a * ↑b)) atTop (𝓝 0)
simp only [one_div] a:ℝha:0 < ah:Tendsto (fun b => a * ↑b) atTop atTop⊢ Tendsto (fun b => (a * ↑b)⁻¹) atTop (𝓝 0)
exact h.inv_tendsto_atTop All goals completed! 🐙
Core convergence: as β → ∞, toReal (ofβ β) → 0 in ℝ.
lemma tendsto_toReal_ofβ_atTop :
Tendsto (fun b : ℝ≥0 => (Temperature.ofβ b : ℝ))
atTop (𝓝 (0 : ℝ)) :=
tendsto_const_inv_mul_atTop kB kB_posAs β → ∞, T = ofβ β → 0+ in ℝ (within Ioi 0).
lemma tendsto_ofβ_atTop :
Tendsto (fun b : ℝ≥0 => (Temperature.ofβ b : ℝ))
atTop (nhdsWithin 0 (Set.Ioi 0)) := by ⊢ Tendsto (fun b => (ofβ b).toReal) atTop (𝓝[>] 0)
refine tendsto_nhdsWithin_iff.2 ⟨tendsto_toReal_ofβ_atTop, ?_⟩ ⊢ ∀ᶠ (n : ℝ≥0) in atTop, (ofβ n).toReal ∈ Set.Ioi 0
simpa using eventually_pos_ofβ All goals completed! 🐙
Conversion to and from ℝ≥0
Build a Temperature directly from a nonnegative real.
@[simp] def ofNNReal (t : ℝ≥0) : Temperature := ⟨t⟩@[simp]
lemma ofNNReal_val (t : ℝ≥0) : (ofNNReal t).val = t := rfl@[simp]
lemma coe_ofNNReal_coe (t : ℝ≥0) : ((ofNNReal t : Temperature) : ℝ≥0) = t := rfl@[simp]
lemma coe_ofNNReal_real (t : ℝ≥0) : ((⟨t⟩ : Temperature) : ℝ) = t := rflConvenience: build a temperature from a real together with a proof of nonnegativity.
@[simp]
noncomputable def ofRealNonneg (t : ℝ) (ht : 0 ≤ t) : Temperature :=
ofNNReal ⟨t, ht⟩@[simp]
lemma ofRealNonneg_val {t : ℝ} (ht : 0 ≤ t) :
(ofRealNonneg t ht).val = ⟨t, ht⟩ := rflCalculus relating T and β
Explicit closed-form for Beta_fun_T t when t > 0.
lemma beta_fun_T_formula (t : ℝ) (ht : 0 < t) :
betaFromReal t = 1 / (kB * t) := by t:ℝht:0 < t⊢ betaFromReal t = 1 / (kB * t)
simp only [betaFromReal, β_toReal, Temperature.toReal, ofNNReal_val, Real.coe_toNNReal t ht.le] All goals completed! 🐙
On Ioi 0, Beta_fun_T t equals 1 / (kB * t).
lemma beta_fun_T_eq_on_Ioi :
EqOn betaFromReal (fun t : ℝ => 1 / (kB * t)) (Set.Ioi 0) := by ⊢ EqOn betaFromReal (fun t => 1 / (kB * t)) (Ioi 0)
intro t ht t:ℝht:t ∈ Ioi 0⊢ betaFromReal t = (fun t => 1 / (kB * t)) t
exact beta_fun_T_formula t ht All goals completed! 🐙
lemma deriv_beta_wrt_T (T : Temperature) (hT_pos : 0 < T.val) :
HasDerivWithinAt betaFromReal (-1 / (kB * (T.val : ℝ)^2)) (Set.Ioi 0) (T.val : ℝ) := by T:TemperaturehT_pos:0 < T.val⊢ HasDerivWithinAt betaFromReal (-1 / (kB * ↑T.val ^ 2)) (Ioi 0) ↑T.val
have hTne : (T.val : ℝ) ≠ 0 := ne_of_gt hT_pos T:TemperaturehT_pos:0 < T.valhTne:↑T.val ≠ 0⊢ HasDerivWithinAt betaFromReal (-1 / (kB * ↑T.val ^ 2)) (Ioi 0) ↑T.val
have hg : HasDerivAt (fun t : ℝ => kB * t) kB (T.val : ℝ) := by
simpa using (hasDerivAt_id (T.val : ℝ)).const_mul kB T:TemperaturehT_pos:0 < T.valhTne:↑T.val ≠ 0hg:HasDerivAt (fun t => kB * t) kB ↑T.val⊢ HasDerivWithinAt betaFromReal (-1 / (kB * ↑T.val ^ 2)) (Ioi 0) ↑T.val T:TemperaturehT_pos:0 < T.valhTne:↑T.val ≠ 0hg:HasDerivAt (fun t => kB * t) kB ↑T.val⊢ HasDerivWithinAt betaFromReal (-1 / (kB * ↑T.val ^ 2)) (Ioi 0) ↑T.val
have h_deriv : HasDerivAt (fun t : ℝ => 1 / (kB * t))
(-1 / (kB * (T.val : ℝ) ^ 2)) (T.val : ℝ) := by
have h := (hasDerivAt_const (T.val : ℝ) (1 : ℝ)).div hg (mul_ne_zero kB_ne_zero hTne) T:TemperaturehT_pos:0 < T.valhTne:↑T.val ≠ 0hg:HasDerivAt (fun t => kB * t) kB ↑T.valh:HasDerivAt ((fun x => 1) / fun t => kB * t) ((0 * (kB * ↑T.val) - 1 * kB) / (kB * ↑T.val) ^ 2) ↑T.val⊢ HasDerivAt (fun t => 1 / (kB * t)) (-1 / (kB * ↑T.val ^ 2)) ↑T.val T:TemperaturehT_pos:0 < T.valhTne:↑T.val ≠ 0hg:HasDerivAt (fun t => kB * t) kB ↑T.valh_deriv:HasDerivAt (fun t => 1 / (kB * t)) (-1 / (kB * ↑T.val ^ 2)) ↑T.val⊢ HasDerivWithinAt betaFromReal (-1 / (kB * ↑T.val ^ 2)) (Ioi 0) ↑T.val
have hval : (-1 : ℝ) / (kB * (T.val : ℝ) ^ 2)
= (0 * (kB * (T.val : ℝ)) - 1 * kB) / (kB * (T.val : ℝ)) ^ 2 := by T:TemperaturehT_pos:0 < T.val⊢ HasDerivWithinAt betaFromReal (-1 / (kB * ↑T.val ^ 2)) (Ioi 0) ↑T.val T:TemperaturehT_pos:0 < T.valhTne:↑T.val ≠ 0hg:HasDerivAt (fun t => kB * t) kB ↑T.valh:HasDerivAt ((fun x => 1) / fun t => kB * t) ((0 * (kB * ↑T.val) - 1 * kB) / (kB * ↑T.val) ^ 2) ↑T.valhval:-1 / (kB * ↑T.val ^ 2) = (0 * (kB * ↑T.val) - 1 * kB) / (kB * ↑T.val) ^ 2⊢ HasDerivAt (fun t => 1 / (kB * t)) (-1 / (kB * ↑T.val ^ 2)) ↑T.val T:TemperaturehT_pos:0 < T.valhTne:↑T.val ≠ 0hg:HasDerivAt (fun t => kB * t) kB ↑T.valh_deriv:HasDerivAt (fun t => 1 / (kB * t)) (-1 / (kB * ↑T.val ^ 2)) ↑T.val⊢ HasDerivWithinAt betaFromReal (-1 / (kB * ↑T.val ^ 2)) (Ioi 0) ↑T.val
rw [mul_pow T:TemperaturehT_pos:0 < T.valhTne:↑T.val ≠ 0hg:HasDerivAt (fun t => kB * t) kB ↑T.valh:HasDerivAt ((fun x => 1) / fun t => kB * t) ((0 * (kB * ↑T.val) - 1 * kB) / (kB * ↑T.val) ^ 2) ↑T.val⊢ -1 / (kB * ↑T.val ^ 2) = (0 * (kB * ↑T.val) - 1 * kB) / (kB ^ 2 * ↑T.val ^ 2) T:TemperaturehT_pos:0 < T.valhTne:↑T.val ≠ 0hg:HasDerivAt (fun t => kB * t) kB ↑T.valh:HasDerivAt ((fun x => 1) / fun t => kB * t) ((0 * (kB * ↑T.val) - 1 * kB) / (kB * ↑T.val) ^ 2) ↑T.val⊢ -1 / (kB * ↑T.val ^ 2) = (0 * (kB * ↑T.val) - 1 * kB) / (kB ^ 2 * ↑T.val ^ 2) T:TemperaturehT_pos:0 < T.valhTne:↑T.val ≠ 0hg:HasDerivAt (fun t => kB * t) kB ↑T.valh:HasDerivAt ((fun x => 1) / fun t => kB * t) ((0 * (kB * ↑T.val) - 1 * kB) / (kB * ↑T.val) ^ 2) ↑T.valhval:-1 / (kB * ↑T.val ^ 2) = (0 * (kB * ↑T.val) - 1 * kB) / (kB * ↑T.val) ^ 2⊢ HasDerivAt (fun t => 1 / (kB * t)) (-1 / (kB * ↑T.val ^ 2)) ↑T.val T:TemperaturehT_pos:0 < T.valhTne:↑T.val ≠ 0hg:HasDerivAt (fun t => kB * t) kB ↑T.valh_deriv:HasDerivAt (fun t => 1 / (kB * t)) (-1 / (kB * ↑T.val ^ 2)) ↑T.val⊢ HasDerivWithinAt betaFromReal (-1 / (kB * ↑T.val ^ 2)) (Ioi 0) ↑T.val] T:TemperaturehT_pos:0 < T.valhTne:↑T.val ≠ 0hg:HasDerivAt (fun t => kB * t) kB ↑T.valh:HasDerivAt ((fun x => 1) / fun t => kB * t) ((0 * (kB * ↑T.val) - 1 * kB) / (kB * ↑T.val) ^ 2) ↑T.val⊢ -1 / (kB * ↑T.val ^ 2) = (0 * (kB * ↑T.val) - 1 * kB) / (kB ^ 2 * ↑T.val ^ 2) T:TemperaturehT_pos:0 < T.valhTne:↑T.val ≠ 0hg:HasDerivAt (fun t => kB * t) kB ↑T.valh:HasDerivAt ((fun x => 1) / fun t => kB * t) ((0 * (kB * ↑T.val) - 1 * kB) / (kB * ↑T.val) ^ 2) ↑T.valhval:-1 / (kB * ↑T.val ^ 2) = (0 * (kB * ↑T.val) - 1 * kB) / (kB * ↑T.val) ^ 2⊢ HasDerivAt (fun t => 1 / (kB * t)) (-1 / (kB * ↑T.val ^ 2)) ↑T.val T:TemperaturehT_pos:0 < T.valhTne:↑T.val ≠ 0hg:HasDerivAt (fun t => kB * t) kB ↑T.valh_deriv:HasDerivAt (fun t => 1 / (kB * t)) (-1 / (kB * ↑T.val ^ 2)) ↑T.val⊢ HasDerivWithinAt betaFromReal (-1 / (kB * ↑T.val ^ 2)) (Ioi 0) ↑T.val
field_simp T:TemperaturehT_pos:0 < T.valhTne:↑T.val ≠ 0hg:HasDerivAt (fun t => kB * t) kB ↑T.valh:HasDerivAt ((fun x => 1) / fun t => kB * t) ((0 * (kB * ↑T.val) - 1 * kB) / (kB * ↑T.val) ^ 2) ↑T.val⊢ -(1 / kB) = (↑T.val * 0 - 1) / kB T:TemperaturehT_pos:0 < T.valhTne:↑T.val ≠ 0hg:HasDerivAt (fun t => kB * t) kB ↑T.valh:HasDerivAt ((fun x => 1) / fun t => kB * t) ((0 * (kB * ↑T.val) - 1 * kB) / (kB * ↑T.val) ^ 2) ↑T.valhval:-1 / (kB * ↑T.val ^ 2) = (0 * (kB * ↑T.val) - 1 * kB) / (kB * ↑T.val) ^ 2⊢ HasDerivAt (fun t => 1 / (kB * t)) (-1 / (kB * ↑T.val ^ 2)) ↑T.val T:TemperaturehT_pos:0 < T.valhTne:↑T.val ≠ 0hg:HasDerivAt (fun t => kB * t) kB ↑T.valh_deriv:HasDerivAt (fun t => 1 / (kB * t)) (-1 / (kB * ↑T.val ^ 2)) ↑T.val⊢ HasDerivWithinAt betaFromReal (-1 / (kB * ↑T.val ^ 2)) (Ioi 0) ↑T.val
ring T:TemperaturehT_pos:0 < T.valhTne:↑T.val ≠ 0hg:HasDerivAt (fun t => kB * t) kB ↑T.valh:HasDerivAt ((fun x => 1) / fun t => kB * t) ((0 * (kB * ↑T.val) - 1 * kB) / (kB * ↑T.val) ^ 2) ↑T.valhval:-1 / (kB * ↑T.val ^ 2) = (0 * (kB * ↑T.val) - 1 * kB) / (kB * ↑T.val) ^ 2⊢ HasDerivAt (fun t => 1 / (kB * t)) (-1 / (kB * ↑T.val ^ 2)) ↑T.val T:TemperaturehT_pos:0 < T.valhTne:↑T.val ≠ 0hg:HasDerivAt (fun t => kB * t) kB ↑T.valh_deriv:HasDerivAt (fun t => 1 / (kB * t)) (-1 / (kB * ↑T.val ^ 2)) ↑T.val⊢ HasDerivWithinAt betaFromReal (-1 / (kB * ↑T.val ^ 2)) (Ioi 0) ↑T.val T:TemperaturehT_pos:0 < T.valhTne:↑T.val ≠ 0hg:HasDerivAt (fun t => kB * t) kB ↑T.valh:HasDerivAt ((fun x => 1) / fun t => kB * t) ((0 * (kB * ↑T.val) - 1 * kB) / (kB * ↑T.val) ^ 2) ↑T.valhval:-1 / (kB * ↑T.val ^ 2) = (0 * (kB * ↑T.val) - 1 * kB) / (kB * ↑T.val) ^ 2⊢ HasDerivAt (fun t => 1 / (kB * t)) (-1 / (kB * ↑T.val ^ 2)) ↑T.val T:TemperaturehT_pos:0 < T.valhTne:↑T.val ≠ 0hg:HasDerivAt (fun t => kB * t) kB ↑T.valh_deriv:HasDerivAt (fun t => 1 / (kB * t)) (-1 / (kB * ↑T.val ^ 2)) ↑T.val⊢ HasDerivWithinAt betaFromReal (-1 / (kB * ↑T.val ^ 2)) (Ioi 0) ↑T.val
rw [hval T:TemperaturehT_pos:0 < T.valhTne:↑T.val ≠ 0hg:HasDerivAt (fun t => kB * t) kB ↑T.valh:HasDerivAt ((fun x => 1) / fun t => kB * t) ((0 * (kB * ↑T.val) - 1 * kB) / (kB * ↑T.val) ^ 2) ↑T.valhval:-1 / (kB * ↑T.val ^ 2) = (0 * (kB * ↑T.val) - 1 * kB) / (kB * ↑T.val) ^ 2⊢ HasDerivAt (fun t => 1 / (kB * t)) ((0 * (kB * ↑T.val) - 1 * kB) / (kB * ↑T.val) ^ 2) ↑T.val T:TemperaturehT_pos:0 < T.valhTne:↑T.val ≠ 0hg:HasDerivAt (fun t => kB * t) kB ↑T.valh:HasDerivAt ((fun x => 1) / fun t => kB * t) ((0 * (kB * ↑T.val) - 1 * kB) / (kB * ↑T.val) ^ 2) ↑T.valhval:-1 / (kB * ↑T.val ^ 2) = (0 * (kB * ↑T.val) - 1 * kB) / (kB * ↑T.val) ^ 2⊢ HasDerivAt (fun t => 1 / (kB * t)) ((0 * (kB * ↑T.val) - 1 * kB) / (kB * ↑T.val) ^ 2) ↑T.val T:TemperaturehT_pos:0 < T.valhTne:↑T.val ≠ 0hg:HasDerivAt (fun t => kB * t) kB ↑T.valh_deriv:HasDerivAt (fun t => 1 / (kB * t)) (-1 / (kB * ↑T.val ^ 2)) ↑T.val⊢ HasDerivWithinAt betaFromReal (-1 / (kB * ↑T.val ^ 2)) (Ioi 0) ↑T.val] T:TemperaturehT_pos:0 < T.valhTne:↑T.val ≠ 0hg:HasDerivAt (fun t => kB * t) kB ↑T.valh:HasDerivAt ((fun x => 1) / fun t => kB * t) ((0 * (kB * ↑T.val) - 1 * kB) / (kB * ↑T.val) ^ 2) ↑T.valhval:-1 / (kB * ↑T.val ^ 2) = (0 * (kB * ↑T.val) - 1 * kB) / (kB * ↑T.val) ^ 2⊢ HasDerivAt (fun t => 1 / (kB * t)) ((0 * (kB * ↑T.val) - 1 * kB) / (kB * ↑T.val) ^ 2) ↑T.val T:TemperaturehT_pos:0 < T.valhTne:↑T.val ≠ 0hg:HasDerivAt (fun t => kB * t) kB ↑T.valh_deriv:HasDerivAt (fun t => 1 / (kB * t)) (-1 / (kB * ↑T.val ^ 2)) ↑T.val⊢ HasDerivWithinAt betaFromReal (-1 / (kB * ↑T.val ^ 2)) (Ioi 0) ↑T.val
exact h T:TemperaturehT_pos:0 < T.valhTne:↑T.val ≠ 0hg:HasDerivAt (fun t => kB * t) kB ↑T.valh_deriv:HasDerivAt (fun t => 1 / (kB * t)) (-1 / (kB * ↑T.val ^ 2)) ↑T.val⊢ HasDerivWithinAt betaFromReal (-1 / (kB * ↑T.val ^ 2)) (Ioi 0) ↑T.val T:TemperaturehT_pos:0 < T.valhTne:↑T.val ≠ 0hg:HasDerivAt (fun t => kB * t) kB ↑T.valh_deriv:HasDerivAt (fun t => 1 / (kB * t)) (-1 / (kB * ↑T.val ^ 2)) ↑T.val⊢ HasDerivWithinAt betaFromReal (-1 / (kB * ↑T.val ^ 2)) (Ioi 0) ↑T.val
exact (h_deriv.hasDerivWithinAt).congr beta_fun_T_eq_on_Ioi (beta_fun_T_eq_on_Ioi hT_pos) All goals completed! 🐙
Chain rule for β(T) : d/dT F(β(T)) = F'(β(T)) * (-1 / (kB * T^2)), within Ioi 0.
lemma chain_rule_T_beta {F : ℝ → ℝ} {F' : ℝ}
(T : Temperature) (hT_pos : 0 < T.val)
(hF_deriv : HasDerivWithinAt F F' (Set.Ioi 0) (T.β : ℝ)) :
HasDerivWithinAt (fun t : ℝ => F (betaFromReal t))
(F' * (-1 / (kB * (T.val : ℝ)^2))) (Set.Ioi 0) (T.val : ℝ) := by F:ℝ → ℝF':ℝT:TemperaturehT_pos:0 < T.valhF_deriv:HasDerivWithinAt F F' (Ioi 0) ↑T.β⊢ HasDerivWithinAt (fun t => F (betaFromReal t)) (F' * (-1 / (kB * ↑T.val ^ 2))) (Ioi 0) ↑T.val
have h_map : Set.MapsTo betaFromReal (Set.Ioi 0) (Set.Ioi 0) := by
intro t ht F:ℝ → ℝF':ℝT:TemperaturehT_pos:0 < T.valhF_deriv:HasDerivWithinAt F F' (Ioi 0) ↑T.βt:ℝht:t ∈ Ioi 0⊢ betaFromReal t ∈ Ioi 0 F:ℝ → ℝF':ℝT:TemperaturehT_pos:0 < T.valhF_deriv:HasDerivWithinAt F F' (Ioi 0) ↑T.βh_map:MapsTo betaFromReal (Ioi 0) (Ioi 0)⊢ HasDerivWithinAt (fun t => F (betaFromReal t)) (F' * (-1 / (kB * ↑T.val ^ 2))) (Ioi 0) ↑T.val
show 0 < betaFromReal t F:ℝ → ℝF':ℝT:TemperaturehT_pos:0 < T.valhF_deriv:HasDerivWithinAt F F' (Ioi 0) ↑T.βt:ℝht:t ∈ Ioi 0⊢ 0 < betaFromReal t F:ℝ → ℝF':ℝT:TemperaturehT_pos:0 < T.valhF_deriv:HasDerivWithinAt F F' (Ioi 0) ↑T.βh_map:MapsTo betaFromReal (Ioi 0) (Ioi 0)⊢ HasDerivWithinAt (fun t => F (betaFromReal t)) (F' * (-1 / (kB * ↑T.val ^ 2))) (Ioi 0) ↑T.val
rw [beta_fun_T_eq_on_Ioi ht F:ℝ → ℝF':ℝT:TemperaturehT_pos:0 < T.valhF_deriv:HasDerivWithinAt F F' (Ioi 0) ↑T.βt:ℝht:t ∈ Ioi 0⊢ 0 < (fun t => 1 / (kB * t)) t F:ℝ → ℝF':ℝT:TemperaturehT_pos:0 < T.valhF_deriv:HasDerivWithinAt F F' (Ioi 0) ↑T.βt:ℝht:t ∈ Ioi 0⊢ 0 < (fun t => 1 / (kB * t)) t F:ℝ → ℝF':ℝT:TemperaturehT_pos:0 < T.valhF_deriv:HasDerivWithinAt F F' (Ioi 0) ↑T.βh_map:MapsTo betaFromReal (Ioi 0) (Ioi 0)⊢ HasDerivWithinAt (fun t => F (betaFromReal t)) (F' * (-1 / (kB * ↑T.val ^ 2))) (Ioi 0) ↑T.val] F:ℝ → ℝF':ℝT:TemperaturehT_pos:0 < T.valhF_deriv:HasDerivWithinAt F F' (Ioi 0) ↑T.βt:ℝht:t ∈ Ioi 0⊢ 0 < (fun t => 1 / (kB * t)) t F:ℝ → ℝF':ℝT:TemperaturehT_pos:0 < T.valhF_deriv:HasDerivWithinAt F F' (Ioi 0) ↑T.βh_map:MapsTo betaFromReal (Ioi 0) (Ioi 0)⊢ HasDerivWithinAt (fun t => F (betaFromReal t)) (F' * (-1 / (kB * ↑T.val ^ 2))) (Ioi 0) ↑T.val
exact one_div_pos.mpr (mul_pos kB_pos ht) F:ℝ → ℝF':ℝT:TemperaturehT_pos:0 < T.valhF_deriv:HasDerivWithinAt F F' (Ioi 0) ↑T.βh_map:MapsTo betaFromReal (Ioi 0) (Ioi 0)⊢ HasDerivWithinAt (fun t => F (betaFromReal t)) (F' * (-1 / (kB * ↑T.val ^ 2))) (Ioi 0) ↑T.val F:ℝ → ℝF':ℝT:TemperaturehT_pos:0 < T.valhF_deriv:HasDerivWithinAt F F' (Ioi 0) ↑T.βh_map:MapsTo betaFromReal (Ioi 0) (Ioi 0)⊢ HasDerivWithinAt (fun t => F (betaFromReal t)) (F' * (-1 / (kB * ↑T.val ^ 2))) (Ioi 0) ↑T.val
have h_beta_at_T : betaFromReal (T.val : ℝ) = (T.β : ℝ) := by
rw [beta_fun_T_eq_on_Ioi (show (T.val : ℝ) ∈ Set.Ioi 0 from hT_pos), F:ℝ → ℝF':ℝT:TemperaturehT_pos:0 < T.valhF_deriv:HasDerivWithinAt F F' (Ioi 0) ↑T.βh_map:MapsTo betaFromReal (Ioi 0) (Ioi 0)⊢ (fun t => 1 / (kB * t)) ↑T.val = ↑T.β F:ℝ → ℝF':ℝT:TemperaturehT_pos:0 < T.valhF_deriv:HasDerivWithinAt F F' (Ioi 0) ↑T.βh_map:MapsTo betaFromReal (Ioi 0) (Ioi 0)⊢ (fun t => 1 / (kB * t)) ↑T.val = 1 / (kB * T.toReal) F:ℝ → ℝF':ℝT:TemperaturehT_pos:0 < T.valhF_deriv:HasDerivWithinAt F F' (Ioi 0) ↑T.βh_map:MapsTo betaFromReal (Ioi 0) (Ioi 0)h_beta_at_T:betaFromReal ↑T.val = ↑T.β⊢ HasDerivWithinAt (fun t => F (betaFromReal t)) (F' * (-1 / (kB * ↑T.val ^ 2))) (Ioi 0) ↑T.val β_toReal F:ℝ → ℝF':ℝT:TemperaturehT_pos:0 < T.valhF_deriv:HasDerivWithinAt F F' (Ioi 0) ↑T.βh_map:MapsTo betaFromReal (Ioi 0) (Ioi 0)⊢ (fun t => 1 / (kB * t)) ↑T.val = 1 / (kB * T.toReal) F:ℝ → ℝF':ℝT:TemperaturehT_pos:0 < T.valhF_deriv:HasDerivWithinAt F F' (Ioi 0) ↑T.βh_map:MapsTo betaFromReal (Ioi 0) (Ioi 0)⊢ (fun t => 1 / (kB * t)) ↑T.val = 1 / (kB * T.toReal) F:ℝ → ℝF':ℝT:TemperaturehT_pos:0 < T.valhF_deriv:HasDerivWithinAt F F' (Ioi 0) ↑T.βh_map:MapsTo betaFromReal (Ioi 0) (Ioi 0)h_beta_at_T:betaFromReal ↑T.val = ↑T.β⊢ HasDerivWithinAt (fun t => F (betaFromReal t)) (F' * (-1 / (kB * ↑T.val ^ 2))) (Ioi 0) ↑T.val] F:ℝ → ℝF':ℝT:TemperaturehT_pos:0 < T.valhF_deriv:HasDerivWithinAt F F' (Ioi 0) ↑T.βh_map:MapsTo betaFromReal (Ioi 0) (Ioi 0)⊢ (fun t => 1 / (kB * t)) ↑T.val = 1 / (kB * T.toReal) F:ℝ → ℝF':ℝT:TemperaturehT_pos:0 < T.valhF_deriv:HasDerivWithinAt F F' (Ioi 0) ↑T.βh_map:MapsTo betaFromReal (Ioi 0) (Ioi 0)h_beta_at_T:betaFromReal ↑T.val = ↑T.β⊢ HasDerivWithinAt (fun t => F (betaFromReal t)) (F' * (-1 / (kB * ↑T.val ^ 2))) (Ioi 0) ↑T.val
rfl F:ℝ → ℝF':ℝT:TemperaturehT_pos:0 < T.valhF_deriv:HasDerivWithinAt F F' (Ioi 0) ↑T.βh_map:MapsTo betaFromReal (Ioi 0) (Ioi 0)h_beta_at_T:betaFromReal ↑T.val = ↑T.β⊢ HasDerivWithinAt (fun t => F (betaFromReal t)) (F' * (-1 / (kB * ↑T.val ^ 2))) (Ioi 0) ↑T.val F:ℝ → ℝF':ℝT:TemperaturehT_pos:0 < T.valhF_deriv:HasDerivWithinAt F F' (Ioi 0) ↑T.βh_map:MapsTo betaFromReal (Ioi 0) (Ioi 0)h_beta_at_T:betaFromReal ↑T.val = ↑T.β⊢ HasDerivWithinAt (fun t => F (betaFromReal t)) (F' * (-1 / (kB * ↑T.val ^ 2))) (Ioi 0) ↑T.val
have hF_deriv' : HasDerivWithinAt F F' (Set.Ioi 0) (betaFromReal (T.val : ℝ)) := by
rw [h_beta_at_T F:ℝ → ℝF':ℝT:TemperaturehT_pos:0 < T.valhF_deriv:HasDerivWithinAt F F' (Ioi 0) ↑T.βh_map:MapsTo betaFromReal (Ioi 0) (Ioi 0)h_beta_at_T:betaFromReal ↑T.val = ↑T.β⊢ HasDerivWithinAt F F' (Ioi 0) ↑T.β F:ℝ → ℝF':ℝT:TemperaturehT_pos:0 < T.valhF_deriv:HasDerivWithinAt F F' (Ioi 0) ↑T.βh_map:MapsTo betaFromReal (Ioi 0) (Ioi 0)h_beta_at_T:betaFromReal ↑T.val = ↑T.β⊢ HasDerivWithinAt F F' (Ioi 0) ↑T.β F:ℝ → ℝF':ℝT:TemperaturehT_pos:0 < T.valhF_deriv:HasDerivWithinAt F F' (Ioi 0) ↑T.βh_map:MapsTo betaFromReal (Ioi 0) (Ioi 0)h_beta_at_T:betaFromReal ↑T.val = ↑T.βhF_deriv':HasDerivWithinAt F F' (Ioi 0) (betaFromReal ↑T.val)⊢ HasDerivWithinAt (fun t => F (betaFromReal t)) (F' * (-1 / (kB * ↑T.val ^ 2))) (Ioi 0) ↑T.val] F:ℝ → ℝF':ℝT:TemperaturehT_pos:0 < T.valhF_deriv:HasDerivWithinAt F F' (Ioi 0) ↑T.βh_map:MapsTo betaFromReal (Ioi 0) (Ioi 0)h_beta_at_T:betaFromReal ↑T.val = ↑T.β⊢ HasDerivWithinAt F F' (Ioi 0) ↑T.β F:ℝ → ℝF':ℝT:TemperaturehT_pos:0 < T.valhF_deriv:HasDerivWithinAt F F' (Ioi 0) ↑T.βh_map:MapsTo betaFromReal (Ioi 0) (Ioi 0)h_beta_at_T:betaFromReal ↑T.val = ↑T.βhF_deriv':HasDerivWithinAt F F' (Ioi 0) (betaFromReal ↑T.val)⊢ HasDerivWithinAt (fun t => F (betaFromReal t)) (F' * (-1 / (kB * ↑T.val ^ 2))) (Ioi 0) ↑T.val
exact hF_deriv F:ℝ → ℝF':ℝT:TemperaturehT_pos:0 < T.valhF_deriv:HasDerivWithinAt F F' (Ioi 0) ↑T.βh_map:MapsTo betaFromReal (Ioi 0) (Ioi 0)h_beta_at_T:betaFromReal ↑T.val = ↑T.βhF_deriv':HasDerivWithinAt F F' (Ioi 0) (betaFromReal ↑T.val)⊢ HasDerivWithinAt (fun t => F (betaFromReal t)) (F' * (-1 / (kB * ↑T.val ^ 2))) (Ioi 0) ↑T.val F:ℝ → ℝF':ℝT:TemperaturehT_pos:0 < T.valhF_deriv:HasDerivWithinAt F F' (Ioi 0) ↑T.βh_map:MapsTo betaFromReal (Ioi 0) (Ioi 0)h_beta_at_T:betaFromReal ↑T.val = ↑T.βhF_deriv':HasDerivWithinAt F F' (Ioi 0) (betaFromReal ↑T.val)⊢ HasDerivWithinAt (fun t => F (betaFromReal t)) (F' * (-1 / (kB * ↑T.val ^ 2))) (Ioi 0) ↑T.val
exact hF_deriv'.comp (T.val : ℝ) (deriv_beta_wrt_T (T := T) hT_pos) h_map All goals completed! 🐙