feat(ClassicalMechanics): add the total kinetic energy and prove the König decomposition#1401
Conversation
…König decomposition Adds `RigidBodyMotion.kineticEnergy`, the total kinetic energy T = ½ ∫ v ⬝ᵥ v dm of a rigid body in motion, and proves König's theorem: the kinetic energy splits into the translational energy of the centre of mass plus the rotational energy about it. - KineticEnergy.lean: `velocityClosedForm` (the closed form Ṙ(y − c) + V of the point velocity, polynomial in y for any motion) with `velocityClosedForm_eq_velocity` (agrees with the honest point velocity ∂ₜ(displacement · y) for differentiable motions) and `contDiff_velocityClosedForm_dotProduct`; `kineticEnergy` (T = ½ ∫ of the closed-form squared speed); `kineticEnergy_eq_integral_velocity` (honest-velocity form of the integrand); `kineticEnergy_eq_translational_add_rotational` (König in any dimension, T = ½ M V·V + ½ ∫ |Ṙ(y − c)|² dm, cross term killed by the vanishing first moment, mass ≠ 0); `kineticEnergy_eq_translational_add_angularVelocity` (König in three dimensions, T = ½ M V·V + ½ ∫ |ω × r|² dm with r the position relative to the centre of mass). - Basic.lean: new `RigidBody.rho_one` (ρ 1 = mass, @[simp]); `cmap`, `cmap_apply` and `rho_coord_sub_centerOfMass` moved here from Motion.lean (their subject is `RigidBody`, and they are now needed by KineticEnergy.lean); the `informal_definition kineticEnergy` stub (MEYBM) removed, now formalized. - Motion.lean: new `orientation_mulVec_sub_centerOfMass` (R(t)(y − c) = displacement − comTrajectory), extracted from `velocity_eq_angularVelocity`. - AngularVelocity.lean: new `deriv_orientation_mulVec_eq_angularVelocity_cross` (Ṙ(t)(y − c) = ω × r, under DifferentiableAt), extracted from and reused by `velocity_eq_angularVelocity`, whose proof shrinks to two lines. - API-map.yaml: mark the kinetic-energy requirement done and extend the Overview. Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
|
Thank you for this PR, which will now be reviewed. If submitting to ./Physlib or ./QuantumInfo, please see our review guidelines if you are not familiar with the process. You should expect a back and forth with a reviewer before your PR is merged. See also that link for how to add appropriate labels to your PR. The PR will also go through a number of automated checks. You can learn more about these here, including how to run them locally. If you are submitting to ./PhyslibAlpha there will be a lighter review process, though your PR must still pass the automated checks. If you want to bring attention to this PR, please write a message on this thread of the Lean Zulip. Important: If a reviewer adds an |
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.