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 Physlib.StatisticalMechanics.CanonicalEnsemble.Lemmas

Finite Canonical Ensemble

This file specializes the general measure-theoretic framework of the canonical ensemble to systems with a finite number of discrete microstates. This is a common and important case in statistical mechanics to study models like spin systems (e.g., the Ising model) and other systems with a discrete quantum state space.

Main Definitions and Results

The specialization is achieved through the IsFinite class, which asserts that:

    The type of microstates ι is a Fintype.

    The measure μ on ι is the standard counting measure.

    The number of degrees of freedom dof is 0.

    The phaseSpaceunit is 1.

These assumptions correspond to systems where the state space is fundamentally discrete, and no semi-classical approximation from a continuous phase space is needed. Consequently, the dimensionless physical quantities are directly equivalent to their mathematical counterparts.

The main results proved in this file are:

    The abstract integral definitions for thermodynamic quantities (partition function, mean energy) are shown to reduce to the familiar finite sums found in introductory texts. For example, the partition function becomes Z = ∑ᵢ exp(-β Eᵢ).

    The abstract thermodynamicEntropy, defined generally for measure-theoretic systems, is proven to be equal to the standard shannonEntropy (S = -k_B ∑ᵢ pᵢ log pᵢ). The semi-classical correction terms from the general theory vanish under the IsFinite assumptions.

    The fluctuation-dissipation theorem in the form C_V = Var(E) / (k_B T²), which connects the heat capacity C_V to the variance of energy fluctuations, is formally proven for these systems.

This file also confirms that the IsFinite property is preserved under the composition of systems (addition, nsmul, and congr).

References

    L. D. Landau & E. M. Lifshitz, Statistical Physics, Part 1, §31.

    D. Tong, Lectures on Statistical Physics, §1.3.

@[expose] public section

A finite CanonicalEnsemble is one whose microstates form a finite type and whose measure is the counting measure. For such systems, the state space is inherently discrete and dimensionless, so we require dof = 0 and phaseSpaceUnit = 1.

class IsFinite (𝓒 : CanonicalEnsemble ι) [Fintype ι] : Prop where μ_eq_count : 𝓒.μ = Measure.count dof_eq_zero : 𝓒.dof = 0 phase_space_unit_eq_one : 𝓒.phaseSpaceunit = 1
ι:Typeinst✝⁷:Fintype ιinst✝⁶:MeasurableSpace ιinst✝⁵:MeasurableSingletonClass ι𝓒:CanonicalEnsemble ιι1:Typeinst✝⁴:Fintype ι1inst✝³:MeasurableSpace ι1inst✝²:MeasurableSingletonClass ι1𝓒1:CanonicalEnsemble ι1inst✝¹:𝓒.IsFiniteinst✝:𝓒1.IsFinites:Set ιt:Set ι1hs:MeasurableSet sht:MeasurableSet t(s ×ˢ t).encard = (s.encard * t.encard)ι:Typeinst✝⁷:Fintype ιinst✝⁶:MeasurableSpace ιinst✝⁵:MeasurableSingletonClass ι𝓒:CanonicalEnsemble ιι1:Typeinst✝⁴:Fintype ι1inst✝³:MeasurableSpace ι1inst✝²:MeasurableSingletonClass ι1𝓒1:CanonicalEnsemble ι1inst✝¹:𝓒.IsFiniteinst✝:𝓒1.IsFinites:Set ιt:Set ι1hs:MeasurableSet sht:MeasurableSet tMeasurableSet tι:Typeinst✝⁷:Fintype ιinst✝⁶:MeasurableSpace ιinst✝⁵:MeasurableSingletonClass ι𝓒:CanonicalEnsemble ιι1:Typeinst✝⁴:Fintype ι1inst✝³:MeasurableSpace ι1inst✝²:MeasurableSingletonClass ι1𝓒1:CanonicalEnsemble ι1inst✝¹:𝓒.IsFiniteinst✝:𝓒1.IsFinites:Set ιt:Set ι1hs:MeasurableSet sht:MeasurableSet tMeasurableSet sι:Typeinst✝⁷:Fintype ιinst✝⁶:MeasurableSpace ιinst✝⁵:MeasurableSingletonClass ι𝓒:CanonicalEnsemble ιι1:Typeinst✝⁴:Fintype ι1inst✝³:MeasurableSpace ι1inst✝²:MeasurableSingletonClass ι1𝓒1:CanonicalEnsemble ι1inst✝¹:𝓒.IsFiniteinst✝:𝓒1.IsFinites:Set ιt:Set ι1hs:MeasurableSet sht:MeasurableSet tMeasurableSet (s ×ˢ t) ι:Typeinst✝⁷:Fintype ιinst✝⁶:MeasurableSpace ιinst✝⁵:MeasurableSingletonClass ι𝓒:CanonicalEnsemble ιι1:Typeinst✝⁴:Fintype ι1inst✝³:MeasurableSpace ι1inst✝²:MeasurableSingletonClass ι1𝓒1:CanonicalEnsemble ι1inst✝¹:𝓒.IsFiniteinst✝:𝓒1.IsFinites:Set ιt:Set ι1hs:MeasurableSet sht:MeasurableSet t(s ×ˢ t).encard = s.encard * t.encardι:Typeinst✝⁷:Fintype ιinst✝⁶:MeasurableSpace ιinst✝⁵:MeasurableSingletonClass ι𝓒:CanonicalEnsemble ιι1:Typeinst✝⁴:Fintype ι1inst✝³:MeasurableSpace ι1inst✝²:MeasurableSingletonClass ι1𝓒1:CanonicalEnsemble ι1inst✝¹:𝓒.IsFiniteinst✝:𝓒1.IsFinites:Set ιt:Set ι1hs:MeasurableSet sht:MeasurableSet tMeasurableSet tι:Typeinst✝⁷:Fintype ιinst✝⁶:MeasurableSpace ιinst✝⁵:MeasurableSingletonClass ι𝓒:CanonicalEnsemble ιι1:Typeinst✝⁴:Fintype ι1inst✝³:MeasurableSpace ι1inst✝²:MeasurableSingletonClass ι1𝓒1:CanonicalEnsemble ι1inst✝¹:𝓒.IsFiniteinst✝:𝓒1.IsFinites:Set ιt:Set ι1hs:MeasurableSet sht:MeasurableSet tMeasurableSet sι:Typeinst✝⁷:Fintype ιinst✝⁶:MeasurableSpace ιinst✝⁵:MeasurableSingletonClass ι𝓒:CanonicalEnsemble ιι1:Typeinst✝⁴:Fintype ι1inst✝³:MeasurableSpace ι1inst✝²:MeasurableSingletonClass ι1𝓒1:CanonicalEnsemble ι1inst✝¹:𝓒.IsFiniteinst✝:𝓒1.IsFinites:Set ιt:Set ι1hs:MeasurableSet sht:MeasurableSet tMeasurableSet (s ×ˢ t) ι:Typeinst✝⁷:Fintype ιinst✝⁶:MeasurableSpace ιinst✝⁵:MeasurableSingletonClass ι𝓒:CanonicalEnsemble ιι1:Typeinst✝⁴:Fintype ι1inst✝³:MeasurableSpace ι1inst✝²:MeasurableSingletonClass ι1𝓒1:CanonicalEnsemble ι1inst✝¹:𝓒.IsFiniteinst✝:𝓒1.IsFinites:Set ιt:Set ι1hs:MeasurableSet sht:MeasurableSet tMeasurableSet tι:Typeinst✝⁷:Fintype ιinst✝⁶:MeasurableSpace ιinst✝⁵:MeasurableSingletonClass ι𝓒:CanonicalEnsemble ιι1:Typeinst✝⁴:Fintype ι1inst✝³:MeasurableSpace ι1inst✝²:MeasurableSingletonClass ι1𝓒1:CanonicalEnsemble ι1inst✝¹:𝓒.IsFiniteinst✝:𝓒1.IsFinites:Set ιt:Set ι1hs:MeasurableSet sht:MeasurableSet tMeasurableSet sι:Typeinst✝⁷:Fintype ιinst✝⁶:MeasurableSpace ιinst✝⁵:MeasurableSingletonClass ι𝓒:CanonicalEnsemble ιι1:Typeinst✝⁴:Fintype ι1inst✝³:MeasurableSpace ι1inst✝²:MeasurableSingletonClass ι1𝓒1:CanonicalEnsemble ι1inst✝¹:𝓒.IsFiniteinst✝:𝓒1.IsFinites:Set ιt:Set ι1hs:MeasurableSet sht:MeasurableSet tMeasurableSet (s ×ˢ t) ι:Typeinst✝⁷:Fintype ιinst✝⁶:MeasurableSpace ιinst✝⁵:MeasurableSingletonClass ι𝓒:CanonicalEnsemble ιι1:Typeinst✝⁴:Fintype ι1inst✝³:MeasurableSpace ι1inst✝²:MeasurableSingletonClass ι1𝓒1:CanonicalEnsemble ι1inst✝¹:𝓒.IsFiniteinst✝:𝓒1.IsFinites:Set ιt:Set ι1hs:MeasurableSet sht:MeasurableSet tMeasurableSet t All goals completed! 🐙 ι:Typeinst✝⁷:Fintype ιinst✝⁶:MeasurableSpace ιinst✝⁵:MeasurableSingletonClass ι𝓒:CanonicalEnsemble ιι1:Typeinst✝⁴:Fintype ι1inst✝³:MeasurableSpace ι1inst✝²:MeasurableSingletonClass ι1𝓒1:CanonicalEnsemble ι1inst✝¹:𝓒.IsFiniteinst✝:𝓒1.IsFinites:Set ιt:Set ι1hs:MeasurableSet sht:MeasurableSet tMeasurableSet s All goals completed! 🐙 ι:Typeinst✝⁷:Fintype ιinst✝⁶:MeasurableSpace ιinst✝⁵:MeasurableSingletonClass ι𝓒:CanonicalEnsemble ιι1:Typeinst✝⁴:Fintype ι1inst✝³:MeasurableSpace ι1inst✝²:MeasurableSingletonClass ι1𝓒1:CanonicalEnsemble ι1inst✝¹:𝓒.IsFiniteinst✝:𝓒1.IsFinites:Set ιt:Set ι1hs:MeasurableSet sht:MeasurableSet tMeasurableSet (s ×ˢ t) All goals completed! 🐙 dof_eq_zero := ι:Typeinst✝⁷:Fintype ιinst✝⁶:MeasurableSpace ιinst✝⁵:MeasurableSingletonClass ι𝓒:CanonicalEnsemble ιι1:Typeinst✝⁴:Fintype ι1inst✝³:MeasurableSpace ι1inst✝²:MeasurableSingletonClass ι1𝓒1:CanonicalEnsemble ι1inst✝¹:𝓒.IsFiniteinst✝:𝓒1.IsFinite(𝓒 + 𝓒1).dof = 0 All goals completed! 🐙 phase_space_unit_eq_one := ι:Typeinst✝⁷:Fintype ιinst✝⁶:MeasurableSpace ιinst✝⁵:MeasurableSingletonClass ι𝓒:CanonicalEnsemble ιι1:Typeinst✝⁴:Fintype ι1inst✝³:MeasurableSpace ι1inst✝²:MeasurableSingletonClass ι1𝓒1:CanonicalEnsemble ι1inst✝¹:𝓒.IsFiniteinst✝:𝓒1.IsFinite(𝓒 + 𝓒1).phaseSpaceunit = 1 All goals completed! 🐙ι:Typeinst✝⁶:Fintype ιinst✝⁵:MeasurableSpace ιinst✝⁴:MeasurableSingletonClass ι𝓒:CanonicalEnsemble ιι1:Typeinst✝³:Fintype ι1inst✝²:MeasurableSpace ι1inst✝¹:MeasurableSingletonClass ι1𝓒1:CanonicalEnsemble ι1inst✝:𝓒.IsFinitee:ι1 ≃ᵐ ιs:Set ι1hs:MeasurableSet ss.Finiteι:Typeinst✝⁶:Fintype ιinst✝⁵:MeasurableSpace ιinst✝⁴:MeasurableSingletonClass ι𝓒:CanonicalEnsemble ιι1:Typeinst✝³:Fintype ι1inst✝²:MeasurableSpace ι1inst✝¹:MeasurableSingletonClass ι1𝓒1:CanonicalEnsemble ι1inst✝:𝓒.IsFinitee:ι1 ≃ᵐ ιs:Set ι1hs:MeasurableSet s(e '' s).Finiteι:Typeinst✝⁶:Fintype ιinst✝⁵:MeasurableSpace ιinst✝⁴:MeasurableSingletonClass ι𝓒:CanonicalEnsemble ιι1:Typeinst✝³:Fintype ι1inst✝²:MeasurableSpace ι1inst✝¹:MeasurableSingletonClass ι1𝓒1:CanonicalEnsemble ι1inst✝:𝓒.IsFinitee:ι1 ≃ᵐ ιs:Set ι1hs:MeasurableSet sMeasurableSet sι:Typeinst✝⁶:Fintype ιinst✝⁵:MeasurableSpace ιinst✝⁴:MeasurableSingletonClass ι𝓒:CanonicalEnsemble ιι1:Typeinst✝³:Fintype ι1inst✝²:MeasurableSpace ι1inst✝¹:MeasurableSingletonClass ι1𝓒1:CanonicalEnsemble ι1inst✝:𝓒.IsFinitee:ι1 ≃ᵐ ιs:Set ι1hs:MeasurableSet sMeasurableSet (e.symm ⁻¹' s) ι:Typeinst✝⁶:Fintype ιinst✝⁵:MeasurableSpace ιinst✝⁴:MeasurableSingletonClass ι𝓒:CanonicalEnsemble ιι1:Typeinst✝³:Fintype ι1inst✝²:MeasurableSpace ι1inst✝¹:MeasurableSingletonClass ι1𝓒1:CanonicalEnsemble ι1inst✝:𝓒.IsFinitee:ι1 ≃ᵐ ιs:Set ι1hs:MeasurableSet ss.Finite All goals completed! 🐙 ι:Typeinst✝⁶:Fintype ιinst✝⁵:MeasurableSpace ιinst✝⁴:MeasurableSingletonClass ι𝓒:CanonicalEnsemble ιι1:Typeinst✝³:Fintype ι1inst✝²:MeasurableSpace ι1inst✝¹:MeasurableSingletonClass ι1𝓒1:CanonicalEnsemble ι1inst✝:𝓒.IsFinitee:ι1 ≃ᵐ ιs:Set ι1hs:MeasurableSet s(e '' s).Finite All goals completed! 🐙 ι:Typeinst✝⁶:Fintype ιinst✝⁵:MeasurableSpace ιinst✝⁴:MeasurableSingletonClass ι𝓒:CanonicalEnsemble ιι1:Typeinst✝³:Fintype ι1inst✝²:MeasurableSpace ι1inst✝¹:MeasurableSingletonClass ι1𝓒1:CanonicalEnsemble ι1inst✝:𝓒.IsFinitee:ι1 ≃ᵐ ιs:Set ι1hs:MeasurableSet sMeasurableSet s All goals completed! 🐙 ι:Typeinst✝⁶:Fintype ιinst✝⁵:MeasurableSpace ιinst✝⁴:MeasurableSingletonClass ι𝓒:CanonicalEnsemble ιι1:Typeinst✝³:Fintype ι1inst✝²:MeasurableSpace ι1inst✝¹:MeasurableSingletonClass ι1𝓒1:CanonicalEnsemble ι1inst✝:𝓒.IsFinitee:ι1 ≃ᵐ ιs:Set ι1hs:MeasurableSet sMeasurableSet (e.symm ⁻¹' s) All goals completed! 🐙 dof_eq_zero := ι:Typeinst✝⁶:Fintype ιinst✝⁵:MeasurableSpace ιinst✝⁴:MeasurableSingletonClass ι𝓒:CanonicalEnsemble ιι1:Typeinst✝³:Fintype ι1inst✝²:MeasurableSpace ι1inst✝¹:MeasurableSingletonClass ι1𝓒1:CanonicalEnsemble ι1inst✝:𝓒.IsFinitee:ι1 ≃ᵐ ι(𝓒.congr e).dof = 0 All goals completed! 🐙 phase_space_unit_eq_one := ι:Typeinst✝⁶:Fintype ιinst✝⁵:MeasurableSpace ιinst✝⁴:MeasurableSingletonClass ι𝓒:CanonicalEnsemble ιι1:Typeinst✝³:Fintype ι1inst✝²:MeasurableSpace ι1inst✝¹:MeasurableSingletonClass ι1𝓒1:CanonicalEnsemble ι1inst✝:𝓒.IsFinitee:ι1 ≃ᵐ ι(𝓒.congr e).phaseSpaceunit = 1 All goals completed! 🐙All goals completed! 🐙 dof_eq_zero := ι:Typeinst✝⁶:Fintype ιinst✝⁵:MeasurableSpace ιinst✝⁴:MeasurableSingletonClass ι𝓒:CanonicalEnsemble ιι1:Typeinst✝³:Fintype ι1inst✝²:MeasurableSpace ι1inst✝¹:MeasurableSingletonClass ι1𝓒1:CanonicalEnsemble ι1inst✝:𝓒.IsFiniten:(nsmul n 𝓒).dof = 0 All goals completed! 🐙 phase_space_unit_eq_one := ι:Typeinst✝⁶:Fintype ιinst✝⁵:MeasurableSpace ιinst✝⁴:MeasurableSingletonClass ι𝓒:CanonicalEnsemble ιι1:Typeinst✝³:Fintype ι1inst✝²:MeasurableSpace ι1inst✝¹:MeasurableSingletonClass ι1𝓒1:CanonicalEnsemble ι1inst✝:𝓒.IsFiniten:(nsmul n 𝓒).phaseSpaceunit = 1 All goals completed! 🐙ι:Typeinst✝⁶:Fintype ιinst✝⁵:MeasurableSpace ιinst✝⁴:MeasurableSingletonClass ι𝓒:CanonicalEnsemble ιι1:Typeinst✝³:Fintype ι1inst✝²:MeasurableSpace ι1inst✝¹:MeasurableSingletonClass ι1𝓒1:CanonicalEnsemble ι1inst✝:𝓒.IsFiniteIsFiniteMeasure Measure.count All goals completed! 🐙

In the finite (counting) case a nonempty index type gives a nonzero measure.

ι:Typeinst✝⁷:Fintype ιinst✝⁶:MeasurableSpace ιinst✝⁵:MeasurableSingletonClass ι𝓒:CanonicalEnsemble ιι1:Typeinst✝⁴:Fintype ι1inst✝³:MeasurableSpace ι1inst✝²:MeasurableSingletonClass ι1𝓒1:CanonicalEnsemble ι1inst✝¹:𝓒.IsFiniteinst✝:Nonempty ι:𝓒.μ = 0i₀:ιhone:𝓒.μ {i₀} = 1False All goals completed! 🐙
ι:Typeinst✝³:Fintype ιinst✝²:MeasurableSpace ιinst✝¹:MeasurableSingletonClass ι𝓒:CanonicalEnsemble ιinst✝:𝓒.IsFiniteT:TemperatureIntegrable (fun i => rexp (-T.β * 𝓒.energy i)) Measure.count All goals completed! 🐙lemma partitionFunction_of_fintype [IsFinite 𝓒] (T : Temperature) : 𝓒.partitionFunction T = i, exp (- T.β * 𝓒.energy i) := ι:Typeinst✝³:Fintype ιinst✝²:MeasurableSpace ιinst✝¹:MeasurableSingletonClass ι𝓒:CanonicalEnsemble ιinst✝:𝓒.IsFiniteT:Temperature𝓒.partitionFunction T = i, rexp (-T.β * 𝓒.energy i) All goals completed! 🐙ι:Typeinst✝³:Fintype ιinst✝²:MeasurableSpace ιinst✝¹:MeasurableSingletonClass ι𝓒:CanonicalEnsemble ιT:Temperatureinst✝:𝓒.IsFinitei:ι((𝓒.μ.withDensity fun i => ENNReal.ofReal (rexp (-(T.β * 𝓒.energy i)))) {i}).toReal = rexp (-(T.β * 𝓒.energy i)) ι:Typeinst✝³:Fintype ιinst✝²:MeasurableSpace ιinst✝¹:MeasurableSingletonClass ι𝓒:CanonicalEnsemble ιT:Temperatureinst✝:𝓒.IsFinitei:ι0 rexp (-(T.β * 𝓒.energy i)) All goals completed! 🐙ι:Typeinst✝⁶:Fintype ιinst✝⁵:MeasurableSpace ιinst✝⁴:MeasurableSingletonClass ι𝓒:CanonicalEnsemble ιι1:Typeinst✝³:Fintype ι1inst✝²:MeasurableSpace ι1inst✝¹:MeasurableSingletonClass ι1𝓒1:CanonicalEnsemble ι1T:Temperatureinst✝:𝓒.IsFiniteIsFiniteMeasure (𝓒.μ.withDensity fun i => ENNReal.ofReal (rexp (-T.β * 𝓒.energy i))) ι:Typeinst✝⁶:Fintype ιinst✝⁵:MeasurableSpace ιinst✝⁴:MeasurableSingletonClass ι𝓒:CanonicalEnsemble ιι1:Typeinst✝³:Fintype ι1inst✝²:MeasurableSpace ι1inst✝¹:MeasurableSingletonClass ι1𝓒1:CanonicalEnsemble ι1T:Temperatureinst✝:𝓒.IsFiniteHasFiniteIntegral (fun i => rexp (-T.β * 𝓒.energy i)) 𝓒.μ All goals completed! 🐙ι:Typeinst✝³:Fintype ιinst✝²:MeasurableSpace ιinst✝¹:MeasurableSingletonClass ι𝓒:CanonicalEnsemble ιT:Temperatureinst✝:𝓒.IsFinitei:ιrexp (-(T.β * 𝓒.energy i)) / ((𝓒.μBolt T) Set.univ).toReal = rexp (-(T.β * 𝓒.energy i)) / 𝓒.mathematicalPartitionFunction T All goals completed! 🐙ι:Typeinst✝³:Fintype ιinst✝²:MeasurableSpace ιinst✝¹:MeasurableSingletonClass ι𝓒:CanonicalEnsemble ιinst✝:𝓒.IsFiniteT:Temperature x, (𝓒.μProd T).real {x} 𝓒.energy x = i, 𝓒.energy i * 𝓒.probability T iι:Typeinst✝³:Fintype ιinst✝²:MeasurableSpace ιinst✝¹:MeasurableSingletonClass ι𝓒:CanonicalEnsemble ιinst✝:𝓒.IsFiniteT:TemperatureIntegrable 𝓒.energy (𝓒.μProd T) ι:Typeinst✝³:Fintype ιinst✝²:MeasurableSpace ιinst✝¹:MeasurableSingletonClass ι𝓒:CanonicalEnsemble ιinst✝:𝓒.IsFiniteT:TemperatureIntegrable 𝓒.energy (𝓒.μProd T) All goals completed! 🐙lemma entropy_of_fintype (T : Temperature) : 𝓒.shannonEntropy T = - kB * i, 𝓒.probability T i * log (𝓒.probability T i) := ι:Typeinst✝¹:Fintype ιinst✝:MeasurableSpace ι𝓒:CanonicalEnsemble ιT:Temperature𝓒.shannonEntropy T = -kB * i, 𝓒.probability T i * log (𝓒.probability T i) All goals completed! 🐙ι:Typeinst✝⁴:Fintype ιinst✝³:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝²:MeasurableSingletonClass ιinst✝¹:𝓒.IsFiniteinst✝:Nonempty ιT:Temperaturei:ιhZpos:0 < 𝓒.mathematicalPartitionFunction Trexp (-T.β * 𝓒.energy i) i, rexp (-T.β * 𝓒.energy i) All goals completed! 🐙

Finite specialization: strict positivity of the mathematical partition function.

lemma mathematicalPartitionFunction_pos_finite [MeasurableSingletonClass ι] [IsFinite 𝓒] [Nonempty ι] (T : Temperature) : 0 < 𝓒.mathematicalPartitionFunction T := ι:Typeinst✝⁴:Fintype ιinst✝³:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝²:MeasurableSingletonClass ιinst✝¹:𝓒.IsFiniteinst✝:Nonempty ιT:Temperature0 < 𝓒.mathematicalPartitionFunction T All goals completed! 🐙

Finite specialization: strict positivity of the (physical) partition function.

lemma partitionFunction_pos_finite [MeasurableSingletonClass ι] [IsFinite 𝓒] [Nonempty ι] (T : Temperature) : 0 < 𝓒.partitionFunction T := ι:Typeinst✝⁴:Fintype ιinst✝³:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝²:MeasurableSingletonClass ιinst✝¹:𝓒.IsFiniteinst✝:Nonempty ιT:Temperature0 < 𝓒.partitionFunction T All goals completed! 🐙

Finite specialization: non-negativity (indeed positivity) of probabilities.

lemma probability_nonneg_finite [MeasurableSingletonClass ι] [IsFinite 𝓒] [Nonempty ι] (T : Temperature) (i : ι) : 0 𝓒.probability T i := ι:Typeinst✝⁴:Fintype ιinst✝³:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝²:MeasurableSingletonClass ιinst✝¹:𝓒.IsFiniteinst✝:Nonempty ιT:Temperaturei:ι0 𝓒.probability T i ι:Typeinst✝⁴:Fintype ιinst✝³:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝²:MeasurableSingletonClass ιinst✝¹:𝓒.IsFiniteinst✝:Nonempty ιT:Temperaturei:ι0 rexp (-T.β * 𝓒.energy i) / 𝓒.mathematicalPartitionFunction T ι:Typeinst✝⁴:Fintype ιinst✝³:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝²:MeasurableSingletonClass ιinst✝¹:𝓒.IsFiniteinst✝:Nonempty ιT:Temperaturei:ιhZpos:0 < 𝓒.mathematicalPartitionFunction T0 rexp (-T.β * 𝓒.energy i) / 𝓒.mathematicalPartitionFunction T All goals completed! 🐙

The sum of probabilities over all microstates is 1.

lemma sum_probability_eq_one [MeasurableSingletonClass ι] [IsFinite 𝓒] [Nonempty ι] (T : Temperature) : i, 𝓒.probability T i = 1 := ι:Typeinst✝⁴:Fintype ιinst✝³:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝²:MeasurableSingletonClass ιinst✝¹:𝓒.IsFiniteinst✝:Nonempty ιT:Temperature i, 𝓒.probability T i = 1 ι:Typeinst✝⁴:Fintype ιinst✝³:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝²:MeasurableSingletonClass ιinst✝¹:𝓒.IsFiniteinst✝:Nonempty ιT:TemperaturehZne:𝓒.mathematicalPartitionFunction T 0 i, 𝓒.probability T i = 1 simp_rw ι:Typeinst✝⁴:Fintype ιinst✝³:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝²:MeasurableSingletonClass ιinst✝¹:𝓒.IsFiniteinst✝:Nonempty ιT:TemperaturehZne:𝓒.mathematicalPartitionFunction T 0 i, 𝓒.probability T i = 1ι:Typeinst✝⁴:Fintype ιinst✝³:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝²:MeasurableSingletonClass ιinst✝¹:𝓒.IsFiniteinst✝:Nonempty ιT:TemperaturehZne:𝓒.mathematicalPartitionFunction T 0 x, rexp (-T.β * 𝓒.energy x) / 𝓒.mathematicalPartitionFunction T = 1 ι:Typeinst✝⁴:Fintype ιinst✝³:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝²:MeasurableSingletonClass ιinst✝¹:𝓒.IsFiniteinst✝:Nonempty ιT:TemperaturehZne:𝓒.mathematicalPartitionFunction T 0(∑ i, rexp (-T.β * 𝓒.energy i)) / 𝓒.mathematicalPartitionFunction T = 1 ι:Typeinst✝⁴:Fintype ιinst✝³:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝²:MeasurableSingletonClass ιinst✝¹:𝓒.IsFiniteinst✝:Nonempty ιT:TemperaturehZne:𝓒.mathematicalPartitionFunction T 0𝓒.mathematicalPartitionFunction T / 𝓒.mathematicalPartitionFunction T = 1] All goals completed! 🐙

The entropy of a finite canonical ensemble (Shannon entropy) is non-negative.

ι:Typeinst✝⁴:Fintype ιinst✝³:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝²:MeasurableSingletonClass ιinst✝¹:𝓒.IsFiniteinst✝:Nonempty ιT:Temperaturehsum: i, 𝓒.probability T i * log (𝓒.probability T i) 0kB * i, 𝓒.probability T i * log (𝓒.probability T i) 0 All goals completed! 🐙
lemma shannonEntropy_eq_differentialEntropy [MeasurableSingletonClass ι] [IsFinite 𝓒] (T : Temperature) : 𝓒.shannonEntropy T = 𝓒.differentialEntropy T := ι:Typeinst✝³:Fintype ιinst✝²:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝¹:MeasurableSingletonClass ιinst✝:𝓒.IsFiniteT:Temperature𝓒.shannonEntropy T = 𝓒.differentialEntropy T All goals completed! 🐙

In the finite, nonempty case the thermodynamic and Shannon entropies coincide. All semi-classical correction factors vanish (dof = 0, phaseSpaceUnit = 1), so the absolute thermodynamic entropy reduces to the discrete Shannon form.

ι:Typeinst✝³:Fintype ιinst✝²:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝¹:MeasurableSingletonClass ιinst✝:𝓒.IsFiniteT:Temperatureh_thermo_eq_diff:𝓒.thermodynamicEntropy T = 𝓒.differentialEntropy T𝓒.thermodynamicEntropy T = 𝓒.shannonEntropy T ι:Typeinst✝³:Fintype ιinst✝²:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝¹:MeasurableSingletonClass ιinst✝:𝓒.IsFiniteT:Temperatureh_thermo_eq_diff:𝓒.thermodynamicEntropy T = 𝓒.differentialEntropy Th_shannon:𝓒.shannonEntropy T = 𝓒.differentialEntropy T𝓒.thermodynamicEntropy T = 𝓒.shannonEntropy T calc 𝓒.thermodynamicEntropy T = 𝓒.differentialEntropy T := h_thermo_eq_diff _ = 𝓒.shannonEntropy T := h_shannon.symm

Fluctuations in Finite Systems

ι:Typeinst✝³:Fintype ιinst✝²:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝¹:MeasurableSingletonClass ιinst✝:𝓒.IsFiniteT:Temperature x, (𝓒.μProd T).real {x} 𝓒.energy x ^ 2 = i, 𝓒.energy i ^ 2 * 𝓒.probability T iι:Typeinst✝³:Fintype ιinst✝²:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝¹:MeasurableSingletonClass ιinst✝:𝓒.IsFiniteT:TemperatureIntegrable (fun i => 𝓒.energy i ^ 2) (𝓒.μProd T) ι:Typeinst✝³:Fintype ιinst✝²:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝¹:MeasurableSingletonClass ιinst✝:𝓒.IsFiniteT:TemperatureIntegrable (fun i => 𝓒.energy i ^ 2) (𝓒.μProd T) All goals completed! 🐙All goals completed! 🐙

β-parameterization for finite systems

lemma mathematicalPartitionFunctionBetaReal_pos [Nonempty ι] (b : ) : 0 < 𝓒.mathematicalPartitionFunctionBetaReal b := ι:Typeinst✝²:Fintype ιinst✝¹:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝:Nonempty ιb:0 < 𝓒.mathematicalPartitionFunctionBetaReal b ι:Typeinst✝²:Fintype ιinst✝¹:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝:Nonempty ιb: i Finset.univ, 0 < rexp (-b * 𝓒.energy i)ι:Typeinst✝²:Fintype ιinst✝¹:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝:Nonempty ιb:Finset.univ.Nonempty ι:Typeinst✝²:Fintype ιinst✝¹:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝:Nonempty ιb: i Finset.univ, 0 < rexp (-b * 𝓒.energy i) ι:Typeinst✝²:Fintype ιinst✝¹:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝:Nonempty ιb:i:ιa✝:i Finset.univ0 < rexp (-b * 𝓒.energy i); All goals completed! 🐙 ι:Typeinst✝²:Fintype ιinst✝¹:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝:Nonempty ιb:Finset.univ.Nonempty All goals completed! 🐙ι:Typeinst✝³:Fintype ιinst✝²:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝¹:MeasurableSingletonClass ιinst✝:𝓒.IsFiniteb:hb:0 < bT:Temperature := ofβ b.toNNRealhT_beta:T.β = b i, 𝓒.energy i * 𝓒.probability T i = i, 𝓒.energy i * 𝓒.probabilityBetaReal b i ι:Typeinst✝³:Fintype ιinst✝²:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝¹:MeasurableSingletonClass ιinst✝:𝓒.IsFiniteb:hb:0 < bT:Temperature := ofβ b.toNNRealhT_beta:T.β = bi:ιx✝:i Finset.univ𝓒.energy i * 𝓒.probability T i = 𝓒.energy i * 𝓒.probabilityBetaReal b i All goals completed! 🐙lemma differentiable_meanEnergyBetaReal [Nonempty ι] : Differentiable 𝓒.meanEnergyBetaReal := ι:Typeinst✝²:Fintype ιinst✝¹:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝:Nonempty ιDifferentiable 𝓒.meanEnergyBetaReal ι:Typeinst✝²:Fintype ιinst✝¹:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝:Nonempty ιDifferentiable fun b => i, 𝓒.energy i * (rexp (-b * 𝓒.energy i) / i, rexp (-b * 𝓒.energy i)) refine Differentiable.fun_sum (ι:Typeinst✝²:Fintype ιinst✝¹:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝:Nonempty ι i Finset.univ, Differentiable fun b => 𝓒.energy i * (rexp (-b * 𝓒.energy i) / i, rexp (-b * 𝓒.energy i)) ι:Typeinst✝²:Fintype ιinst✝¹:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝:Nonempty ιi:ιa✝:i Finset.univDifferentiable fun b => 𝓒.energy i * (rexp (-b * 𝓒.energy i) / i, rexp (-b * 𝓒.energy i)) ι:Typeinst✝²:Fintype ιinst✝¹:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝:Nonempty ιi:ιa✝:i Finset.univDifferentiable fun b => rexp (-b * 𝓒.energy i)ι:Typeinst✝²:Fintype ιinst✝¹:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝:Nonempty ιi:ιa✝:i Finset.univDifferentiable fun b => i, rexp (-b * 𝓒.energy i)ι:Typeinst✝²:Fintype ιinst✝¹:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝:Nonempty ιi:ιa✝:i Finset.univ (x : ), i, rexp (-x * 𝓒.energy i) 0 ι:Typeinst✝²:Fintype ιinst✝¹:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝:Nonempty ιi:ιa✝:i Finset.univDifferentiable fun b => rexp (-b * 𝓒.energy i) ι:Typeinst✝²:Fintype ιinst✝¹:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝:Nonempty ιi:ιa✝:i Finset.univDifferentiable fun x => -x * 𝓒.energy i; All goals completed! 🐙 ι:Typeinst✝²:Fintype ιinst✝¹:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝:Nonempty ιi:ιa✝:i Finset.univDifferentiable fun b => i, rexp (-b * 𝓒.energy i) ι:Typeinst✝²:Fintype ιinst✝¹:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝:Nonempty ιi:ιa✝:i Finset.univ i Finset.univ, Differentiable fun b => rexp (-b * 𝓒.energy i); ι:Typeinst✝²:Fintype ιinst✝¹:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝:Nonempty ιi:ιa✝¹:i Finset.univj:ιa✝:j Finset.univDifferentiable fun b => rexp (-b * 𝓒.energy j); ι:Typeinst✝²:Fintype ιinst✝¹:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝:Nonempty ιi:ιa✝¹:i Finset.univj:ιa✝:j Finset.univDifferentiable fun x => -x * 𝓒.energy j; All goals completed! 🐙 ι:Typeinst✝²:Fintype ιinst✝¹:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝:Nonempty ιi:ιa✝:i Finset.univ (x : ), i, rexp (-x * 𝓒.energy i) 0 ι:Typeinst✝²:Fintype ιinst✝¹:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝:Nonempty ιi:ιa✝:i Finset.univx: i, rexp (-x * 𝓒.energy i) 0; All goals completed! 🐙)

Derivatives of Z and numerator

lemma differentiable_mathematicalPartitionFunctionBetaReal : Differentiable 𝓒.mathematicalPartitionFunctionBetaReal := ι:Typeinst✝¹:Fintype ιinst✝:MeasurableSpace ι𝓒:CanonicalEnsemble ιDifferentiable 𝓒.mathematicalPartitionFunctionBetaReal ι:Typeinst✝¹:Fintype ιinst✝:MeasurableSpace ι𝓒:CanonicalEnsemble ιDifferentiable fun b => i, rexp (-b * 𝓒.energy i) ι:Typeinst✝¹:Fintype ιinst✝:MeasurableSpace ι𝓒:CanonicalEnsemble ι i Finset.univ, Differentiable fun b => rexp (-b * 𝓒.energy i); ι:Typeinst✝¹:Fintype ιinst✝:MeasurableSpace ι𝓒:CanonicalEnsemble ιi:ιa✝:i Finset.univDifferentiable fun b => rexp (-b * 𝓒.energy i); All goals completed! 🐙lemma differentiable_meanEnergyNumerator : Differentiable 𝓒.meanEnergyNumerator := ι:Typeinst✝¹:Fintype ιinst✝:MeasurableSpace ι𝓒:CanonicalEnsemble ιDifferentiable 𝓒.meanEnergyNumerator ι:Typeinst✝¹:Fintype ιinst✝:MeasurableSpace ι𝓒:CanonicalEnsemble ιDifferentiable fun b => i, 𝓒.energy i * rexp (-b * 𝓒.energy i) ι:Typeinst✝¹:Fintype ιinst✝:MeasurableSpace ι𝓒:CanonicalEnsemble ι i Finset.univ, Differentiable fun b => 𝓒.energy i * rexp (-b * 𝓒.energy i); ι:Typeinst✝¹:Fintype ιinst✝:MeasurableSpace ι𝓒:CanonicalEnsemble ιi:ιa✝:i Finset.univDifferentiable fun b => 𝓒.energy i * rexp (-b * 𝓒.energy i); ι:Typeinst✝¹:Fintype ιinst✝:MeasurableSpace ι𝓒:CanonicalEnsemble ιi:ιa✝:i Finset.univDifferentiable fun y => rexp (-y * 𝓒.energy i); All goals completed! 🐙ι:Typeinst✝¹:Fintype ιinst✝:MeasurableSpace ι𝓒:CanonicalEnsemble ιb:hd: (c : ), HasDerivAt (fun x => rexp (-x * c)) (-c * rexp (-b * c)) bderiv (fun b => i, rexp (-b * 𝓒.energy i)) b = - i, 𝓒.energy i * rexp (-b * 𝓒.energy i) ι:Typeinst✝¹:Fintype ιinst✝:MeasurableSpace ι𝓒:CanonicalEnsemble ιb:hd: (c : ), HasDerivAt (fun x => rexp (-x * c)) (-c * rexp (-b * c)) bh_sum:HasDerivAt (fun x => i, rexp (-x * 𝓒.energy i)) (∑ i, -𝓒.energy i * rexp (-b * 𝓒.energy i)) bderiv (fun b => i, rexp (-b * 𝓒.energy i)) b = - i, 𝓒.energy i * rexp (-b * 𝓒.energy i) All goals completed! 🐙ι:Typeinst✝¹:Fintype ιinst✝:MeasurableSpace ι𝓒:CanonicalEnsemble ιb:hd: (c : ), HasDerivAt (fun x => rexp (-x * c)) (-c * rexp (-b * c)) bh_sum:HasDerivAt (fun x => i, 𝓒.energy i * rexp (-x * 𝓒.energy i)) (∑ i, -𝓒.energy i ^ 2 * rexp (-b * 𝓒.energy i)) bderiv (fun b => i, 𝓒.energy i * rexp (-b * 𝓒.energy i)) b = - i, 𝓒.energy i ^ 2 * rexp (-b * 𝓒.energy i) All goals completed! 🐙

Quotient rule: dU/db = U^2 - ⟨E^2⟩_β

ι:Typeinst✝²:Fintype ιinst✝¹:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝:Nonempty ιb:hN_diff:DifferentiableAt 𝓒.meanEnergyNumerator bhZ_diff:DifferentiableAt 𝓒.mathematicalPartitionFunctionBetaReal bhZ_ne:𝓒.mathematicalPartitionFunctionBetaReal b 0hU:𝓒.meanEnergyBetaReal = 𝓒.meanEnergyNumerator / 𝓒.mathematicalPartitionFunctionBetaRealhprob: i, 𝓒.energy i ^ 2 * 𝓒.probabilityBetaReal b i = (∑ i, 𝓒.energy i ^ 2 * rexp (-b * 𝓒.energy i)) / 𝓒.mathematicalPartitionFunctionBetaReal b((- i, 𝓒.energy i ^ 2 * rexp (-b * 𝓒.energy i)) * 𝓒.mathematicalPartitionFunctionBetaReal b - 𝓒.meanEnergyNumerator b * -𝓒.meanEnergyNumerator b) / 𝓒.mathematicalPartitionFunctionBetaReal b ^ 2 = (𝓒.meanEnergyNumerator b / 𝓒.mathematicalPartitionFunctionBetaReal b) ^ 2 - (∑ i, 𝓒.energy i ^ 2 * rexp (-b * 𝓒.energy i)) / 𝓒.mathematicalPartitionFunctionBetaReal b ι:Typeinst✝²:Fintype ιinst✝¹:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝:Nonempty ιb:hN_diff:DifferentiableAt 𝓒.meanEnergyNumerator bhZ_diff:DifferentiableAt 𝓒.mathematicalPartitionFunctionBetaReal bhZ_ne:𝓒.mathematicalPartitionFunctionBetaReal b 0hU:𝓒.meanEnergyBetaReal = 𝓒.meanEnergyNumerator / 𝓒.mathematicalPartitionFunctionBetaRealS2: := i, 𝓒.energy i ^ 2 * rexp (-b * 𝓒.energy i)hprob: i, 𝓒.energy i ^ 2 * 𝓒.probabilityBetaReal b i = S2 / 𝓒.mathematicalPartitionFunctionBetaReal b(-S2 * 𝓒.mathematicalPartitionFunctionBetaReal b - 𝓒.meanEnergyNumerator b * -𝓒.meanEnergyNumerator b) / 𝓒.mathematicalPartitionFunctionBetaReal b ^ 2 = (𝓒.meanEnergyNumerator b / 𝓒.mathematicalPartitionFunctionBetaReal b) ^ 2 - S2 / 𝓒.mathematicalPartitionFunctionBetaReal b ι:Typeinst✝²:Fintype ιinst✝¹:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝:Nonempty ιb:hN_diff:DifferentiableAt 𝓒.meanEnergyNumerator bhZ_diff:DifferentiableAt 𝓒.mathematicalPartitionFunctionBetaReal bhZ_ne:𝓒.mathematicalPartitionFunctionBetaReal b 0hU:𝓒.meanEnergyBetaReal = 𝓒.meanEnergyNumerator / 𝓒.mathematicalPartitionFunctionBetaRealS2: := i, 𝓒.energy i ^ 2 * rexp (-b * 𝓒.energy i)hprob: i, 𝓒.energy i ^ 2 * 𝓒.probabilityBetaReal b i = S2 / 𝓒.mathematicalPartitionFunctionBetaReal b-(S2 * 𝓒.mathematicalPartitionFunctionBetaReal b) - -𝓒.meanEnergyNumerator b ^ 2 = 𝓒.meanEnergyNumerator b ^ 2 - S2 * 𝓒.mathematicalPartitionFunctionBetaReal b All goals completed! 🐙

(∂U/∂β) = -Var(E) for finite systems.

ι:Typeinst✝⁴:Fintype ιinst✝³:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝²:Nonempty ιinst✝¹:MeasurableSingletonClass ιinst✝:𝓒.IsFiniteT:TemperaturehT_pos:0 < T.valβ₀: := T.βhβ₀_pos:0 < β₀h_eq_on:Set.EqOn 𝓒.meanEnergyBeta 𝓒.meanEnergyBetaReal (Set.Ioi 0)h_diff:DifferentiableAt 𝓒.meanEnergyBetaReal β₀h_U_eq:𝓒.meanEnergyBetaReal β₀ = 𝓒.meanEnergy Th_prob_eq: (i : ι), 𝓒.probabilityBetaReal β₀ i = 𝓒.probability T i𝓒.meanEnergy T ^ 2 - x, 𝓒.energy x ^ 2 * 𝓒.probability T x = -( i, 𝓒.energy i ^ 2 * 𝓒.probability T i - 𝓒.meanEnergy T ^ 2) All goals completed! 🐙

FDT for finite canonical ensembles: C_V = Var(E) / (k_B T²).

ι:Typeinst✝⁴:Fintype ιinst✝³:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝²:Nonempty ιinst✝¹:MeasurableSingletonClass ιinst✝:𝓒.IsFiniteT:TemperaturehT_pos:0 < T.valhβ₀_pos:0 < T.ββ₀: := T.βh_diff_U_beta:DifferentiableWithinAt 𝓒.meanEnergyBeta (Set.Ioi 0) β₀𝓒.heatCapacity T = 𝓒.energyVariance T / (kB * T.val ^ 2) ι:Typeinst✝⁴:Fintype ιinst✝³:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝²:Nonempty ιinst✝¹:MeasurableSingletonClass ιinst✝:𝓒.IsFiniteT:TemperaturehT_pos:0 < T.valhβ₀_pos:0 < T.ββ₀: := T.βh_diff_U_beta:DifferentiableWithinAt 𝓒.meanEnergyBeta (Set.Ioi 0) β₀h_Var_eq_neg_dUdβ:derivWithin 𝓒.meanEnergyBeta (Set.Ioi 0) T.β = -𝓒.energyVariance T𝓒.heatCapacity T = 𝓒.energyVariance T / (kB * T.val ^ 2) exact CanonicalEnsemble.fluctuation_dissipation_energy_parametric 𝓒 T hT_pos (ι:Typeinst✝⁴:Fintype ιinst✝³:MeasurableSpace ι𝓒:CanonicalEnsemble ιinst✝²:Nonempty ιinst✝¹:MeasurableSingletonClass ιinst✝:𝓒.IsFiniteT:TemperaturehT_pos:0 < T.valhβ₀_pos:0 < T.ββ₀: := T.βh_diff_U_beta:DifferentiableWithinAt 𝓒.meanEnergyBeta (Set.Ioi 0) β₀h_Var_eq_neg_dUdβ:derivWithin 𝓒.meanEnergyBeta (Set.Ioi 0) T.β = -𝓒.energyVariance T𝓒.energyVariance T = -derivWithin 𝓒.meanEnergyBeta (Set.Ioi 0) T.β All goals completed! 🐙) h_diff_U_beta