feat(ClassicalMechanics): add the total kinetic energy and prove the König decomposition - #1401
Merged
jstoobysmith merged 4 commits intoJul 10, 2026
Conversation
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds the total kinetic energy of a rigid body in motion and proves the König decomposition
T = ½M V·V + ½∫|ω × r|² dm(Landau–Lifshitz, Mechanics, §32). Follow-up to #1377 in the rigid-body API (#893).New declarations
Physlib/ClassicalMechanics/RigidBody/KineticEnergy.lean(new section forRigidBodyMotion):RigidBodyMotion.velocityClosedForm— the closed formṘ(t)(y − c) + V(t)of the velocity of the body pointy. It is polynomial iny, hence smooth for any motion (contDiff_velocityClosedForm_dotProduct), whereas the honest point velocity∂ₜ(displacement · y)is not bundleable unconditionally (for non-differentiable motions its junk values need not be smooth iny). For differentiable motions the two agree:velocityClosedForm_eq_velocity.RigidBodyMotion.kineticEnergy— the total kinetic energyT = ½ ∫ v ⬝ᵥ v dmat timet, withv = velocityClosedForm.kineticEnergy_eq_integral_velocity— for differentiable motions the integrand is the honest point velocity:T = ½ ∫ velocity ⬝ᵥ velocity dm. This is the definitional-honesty lemma.kineticEnergy_eq_translational_add_rotational— König's theorem in any dimension:T = ½ M (V ⬝ᵥ V) + ½ ∫ |Ṙ(y − c)|² dmformass ≠ 0, with no differentiability hypotheses. The cross term∫ V ⬝ᵥ Ṙ(y − c) dmvanishes because the first moment of the mass distribution about its centre of mass is zero (rho_coord_sub_centerOfMass).kineticEnergy_eq_translational_add_angularVelocity— König's theorem in three dimensions:T = ½ M (V ⬝ᵥ V) + ½ ∫ |ω × r|² dm, withωthe angular velocity vector andr = displacement − comTrajectorythe position relative to the centre of mass, spelled exactly as invelocity_eq_angularVelocity(feat(ClassicalMechanics): prove the velocity decomposition v = V + ω × r #1376). Needs onlyDifferentiableAtatt.Supporting lemmas extracted so they are stated once (previously inline or private):
Basic.lean:RigidBody.rho_one(ρ 1 = mass,@[simp]) replaces three identical inlinehave ... := rfl;cmap,cmap_apply,rho_coord_sub_centerOfMassmove here fromMotion.lean— their subject isRigidBody, so dot notation now works andKineticEnergy.leancan use them.Motion.lean:orientation_mulVec_sub_centerOfMass—R(t)(y − c) = displacement t y − comTrajectory t.AngularVelocity.lean:deriv_orientation_mulVec_eq_angularVelocity_cross—Ṙ(t)(y − c) = ω(t) × runderDifferentiableAt;velocity_eq_angularVelocitynow reuses it and its proof shrinks to two lines.Other changes
Basic.lean: removed theinformal_definition kineticEnergystub (tag MEYBM), now formalized. Theinformal_lemma kinetic_energy_decomposition(LL32-TK) is kept: its½ ω · I_CM ωform needs the body-frame angular velocity / rotated inertia tensor, planned as a follow-up.API-map.yaml: kinetic-energy requirement marked done; Overview extended.Reading order
Basic.lean(rho_one + relocations) →Motion.lean(orientation_mulVec_sub_centerOfMass) →AngularVelocity.lean(deriv_orientation_mulVec_eq_angularVelocity_cross) →KineticEnergy.leanfromnamespace RigidBodyMotion.Verification
lake build Physlibclean; fresh compile of the touched files with zero warnings.#print axiomson all new declarations: only[propext, Classical.choice, Quot.sound].lake exe runLinter— no issues in the touched files;./scripts/lint-style.shclean.