Imports
/- Copyright (c) 2026 Giuseppe Sorge. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Giuseppe Sorge -/ module public import Physlib.ClassicalMechanics.RigidBody.AngularMomentum public import Physlib.ClassicalMechanics.RigidBody.AngularVelocity public import Physlib.Mathematics.OrthogonalMatrix

Kinetic energy of a rigid body

For a rigid body rotating with angular velocity ω about its reference point the point at position r has velocity ω × r, so its kinetic energy is T = ½ ∫ |ω × r|² dm. Since |ω × r|² = ω · (r × (ω × r)) and the angular momentum is L = ∫ r × (ω × r) dm = I ω, the kinetic energy is the quadratic form T = ½ ω · L = ½ ω · I ω in the inertia tensor.

For a rigid body in motion the total kinetic energy is the mass integral of half the squared speed of its points, T = ½ ∫ ⟪v, v⟫ dm. König's theorem splits it into the kinetic energy of the centre of mass plus the rotational energy about the centre of mass, T = ½ M ⟪V, V⟫ + ½ ∫ |Ṙ (y − c)|² dm: the cross term vanishes because the first moment of the mass distribution about its centre of mass is zero. In three dimensions the rotational term is ½ ∫ |ω × r|² dm, with ω the angular velocity vector and r the position of the body point relative to the centre of mass.

The total kinetic energy is defined with the point velocity taken in the closed form Ṙ(t) (y − c) + V(t) (velocityClosedForm), which is polynomial in the body point and hence smooth for any motion; for differentiable motions it agrees with the honest point velocity ∂ₜ (displacement · y), recovering T = ½ ∫ ⟪v, v⟫ dm (kineticEnergy_eq_integral_velocity).

References

    Landau and Lifshitz, Mechanics, Section 32.

@[expose] public sectionattribute [local instance] Matrix.linftyOpNormedAddCommGroup Matrix.linftyOpNormedSpace Matrix.linftyOpNormedRing Matrix.linftyOpNormedAlgebra

The rotational kinetic energy is half the contraction of the angular velocity with the angular momentum: T = ½ ω · L.

All goals completed! 🐙

The rotational kinetic energy equals the mass integral of the local rotational speed squared: T = ½ ∫ |ω × r|² dm.

R:RigidBody 3ω:Fin 3 x:Space c, ContMDiffMap.coeFnAddMonoidHom (ω c fun x => (crossProduct (x.val 3)) ((crossProduct ω) (x.val 3)) c, ) x = fun x => x_1, (crossProduct ω) (x.val 3) x_1 (crossProduct ω) (x.val 3) x_1, x R:RigidBody 3ω:Fin 3 x:Space x_1, ω x_1 * (crossProduct (x.val 3)) ((crossProduct ω) (x.val 3)) x_1 = x_1, (crossProduct ω) (x.val 3) x_1 * (crossProduct ω) (x.val 3) x_1 All goals completed! 🐙

For a differentiable motion the integrand of kineticEnergy is the squared speed of the honest point velocity: T = ½ ∫ ⟪v, v⟫ dm with v = ∂ₜ (displacement · y).

d:M:RigidBodyMotion dt:TimehR:Differentiable fun s => (M.orientation s)hX:Differentiable M.comTrajectory1 / 2 * M.ρ (cmap (fun y => M.velocityClosedForm t y, M.velocityClosedForm t y⟫_) ) = 1 / 2 * M.ρ (cmap (fun y => M.velocity y t, M.velocity y t⟫_) ) d:M:RigidBodyMotion dt:TimehR:Differentiable fun s => (M.orientation s)hX:Differentiable M.comTrajectorycmap (fun y => M.velocityClosedForm t y, M.velocityClosedForm t y⟫_) = cmap (fun y => M.velocity y t, M.velocity y t⟫_) d:M:RigidBodyMotion dt:TimehR:Differentiable fun s => (M.orientation s)hX:Differentiable M.comTrajectoryy:Space d(cmap (fun y => M.velocityClosedForm t y, M.velocityClosedForm t y⟫_) ) y = (cmap (fun y => M.velocity y t, M.velocity y t⟫_) ) y All goals completed! 🐙

The squared-speed integrand of kineticEnergy splits into the squared rotational speed |Ṙ (y − c)|², a term linear in the body-frame coordinate y − c, and the constant squared centre-of-mass speed ⟪V, V⟫.

d:M:RigidBodyMotion dt:Timey:Space d(((∂ₜ (fun s => (M.orientation s)) t *ᵥ fun j => y.val j - M.centerOfMass.val j) ⬝ᵥ ∂ₜ (fun s => (M.orientation s)) t *ᵥ fun j => y.val j - M.centerOfMass.val j) + (M.centerOfMassVelocity t).val ᵥ* ∂ₜ (fun s => (M.orientation s)) t ⬝ᵥ fun j => y.val j - M.centerOfMass.val j) + (((M.centerOfMassVelocity t).val ᵥ* ∂ₜ (fun s => (M.orientation s)) t ⬝ᵥ fun j => y.val j - M.centerOfMass.val j) + (M.centerOfMassVelocity t).val ⬝ᵥ (M.centerOfMassVelocity t).val) = ((∂ₜ (fun s => (M.orientation s)) t *ᵥ fun j => y.val j - M.centerOfMass.val j) ⬝ᵥ ∂ₜ (fun s => (M.orientation s)) t *ᵥ fun j => y.val j - M.centerOfMass.val j) + x, 2 * ((M.centerOfMassVelocity t).val ᵥ* ∂ₜ (fun s => (M.orientation s)) t) x * (y.val x - M.centerOfMass.val x) + (M.centerOfMassVelocity t).val ⬝ᵥ (M.centerOfMassVelocity t).val d:M:RigidBodyMotion dt:Timey:Space d i, (∂ₜ (fun s => (M.orientation s)) t *ᵥ fun j => y.val j - M.centerOfMass.val j) i * (∂ₜ (fun s => (M.orientation s)) t *ᵥ fun j => y.val j - M.centerOfMass.val j) i + x, ((M.centerOfMassVelocity t).val ᵥ* ∂ₜ (fun s => (M.orientation s)) t) x * (y.val x - M.centerOfMass.val x) + ( x, ((M.centerOfMassVelocity t).val ᵥ* ∂ₜ (fun s => (M.orientation s)) t) x * (y.val x - M.centerOfMass.val x) + i, (M.centerOfMassVelocity t).val i * (M.centerOfMassVelocity t).val i) = i, (∂ₜ (fun s => (M.orientation s)) t *ᵥ fun j => y.val j - M.centerOfMass.val j) i * (∂ₜ (fun s => (M.orientation s)) t *ᵥ fun j => y.val j - M.centerOfMass.val j) i + ( x, ((M.centerOfMassVelocity t).val ᵥ* ∂ₜ (fun s => (M.orientation s)) t) x * (y.val x - M.centerOfMass.val x) + x, ((M.centerOfMassVelocity t).val ᵥ* ∂ₜ (fun s => (M.orientation s)) t) x * (y.val x - M.centerOfMass.val x)) + i, (M.centerOfMassVelocity t).val i * (M.centerOfMassVelocity t).val i All goals completed! 🐙

König's theorem, general form: the total kinetic energy of a rigid body in motion splits into the kinetic energy of the centre of mass plus the rotational energy about the centre of mass, T = ½ M ⟪V, V⟫ + ½ ∫ |Ṙ (y − c)|² dm.

d:M:RigidBodyMotion dt:Timeh:M.mass 01 / 2 * (M.ρ (cmap (fun y => (∂ₜ (fun s => (M.orientation s)) t *ᵥ fun j => y.val j - M.centerOfMass.val j) ⬝ᵥ ∂ₜ (fun s => (M.orientation s)) t *ᵥ fun j => y.val j - M.centerOfMass.val j) ) + x, M.ρ ((2 * ((M.centerOfMassVelocity t).val ᵥ* ∂ₜ (fun s => (M.orientation s)) t) x) cmap (fun y => y.val x - M.centerOfMass.val x) ) + M.ρ (M.centerOfMassVelocity t, M.centerOfMassVelocity t⟫_ 1)) = 1 / 2 * M.mass * M.centerOfMassVelocity t, M.centerOfMassVelocity t⟫_ + 1 / 2 * M.ρ (cmap (fun y => (∂ₜ (fun s => (M.orientation s)) t *ᵥ fun j => y.val j - M.centerOfMass.val j) ⬝ᵥ ∂ₜ (fun s => (M.orientation s)) t *ᵥ fun j => y.val j - M.centerOfMass.val j) ) d:M:RigidBodyMotion dt:Timeh:M.mass 01 / 2 * (M.ρ (cmap (fun y => (∂ₜ (fun s => (M.orientation s)) t *ᵥ fun j => y.val j - M.centerOfMass.val j) ⬝ᵥ ∂ₜ (fun s => (M.orientation s)) t *ᵥ fun j => y.val j - M.centerOfMass.val j) ) + M.centerOfMassVelocity t, M.centerOfMassVelocity t⟫_ * M.mass) = 1 / 2 * M.mass * M.centerOfMassVelocity t, M.centerOfMassVelocity t⟫_ + 1 / 2 * M.ρ (cmap (fun y => (∂ₜ (fun s => (M.orientation s)) t *ᵥ fun j => y.val j - M.centerOfMass.val j) ⬝ᵥ ∂ₜ (fun s => (M.orientation s)) t *ᵥ fun j => y.val j - M.centerOfMass.val j) ) All goals completed! 🐙

König's theorem in three dimensions: the total kinetic energy of a rigid body in motion splits as T = ½ M ⟪V, V⟫ + ½ ∫ |ω × r|² dm, with ω the angular velocity vector and r = displacement − comTrajectory the position of the body point relative to the centre of mass.

M:RigidBodyMotion 3t:Timeh:M.mass 0hR:DifferentiableAt (fun s => (M.orientation s)) t1 / 2 * M.mass * M.centerOfMassVelocity t, M.centerOfMassVelocity t⟫_ + 1 / 2 * M.ρ (cmap (fun y => (∂ₜ (fun s => (M.orientation s)) t *ᵥ fun j => y.val 3 j - M.centerOfMass.val 3 j) ⬝ᵥ ∂ₜ (fun s => (M.orientation s)) t *ᵥ fun j => y.val 3 j - M.centerOfMass.val 3 j) ) = 1 / 2 * M.mass * M.centerOfMassVelocity t, M.centerOfMassVelocity t⟫_ + 1 / 2 * M.ρ (cmap (fun y => ((crossProduct (M.angularVelocity t)) fun j => (M.displacement t y).val 3 j - (M.comTrajectory t).val 3 j) ⬝ᵥ (crossProduct (M.angularVelocity t)) fun j => (M.displacement t y).val 3 j - (M.comTrajectory t).val 3 j) ) M:RigidBodyMotion 3t:Timeh:M.mass 0hR:DifferentiableAt (fun s => (M.orientation s)) t1 / 2 * M.ρ (cmap (fun y => (∂ₜ (fun s => (M.orientation s)) t *ᵥ fun j => y.val 3 j - M.centerOfMass.val 3 j) ⬝ᵥ ∂ₜ (fun s => (M.orientation s)) t *ᵥ fun j => y.val 3 j - M.centerOfMass.val 3 j) ) = 1 / 2 * M.ρ (cmap (fun y => ((crossProduct (M.angularVelocity t)) fun j => (M.displacement t y).val 3 j - (M.comTrajectory t).val 3 j) ⬝ᵥ (crossProduct (M.angularVelocity t)) fun j => (M.displacement t y).val 3 j - (M.comTrajectory t).val 3 j) ) M:RigidBodyMotion 3t:Timeh:M.mass 0hR:DifferentiableAt (fun s => (M.orientation s)) tcmap (fun y => (∂ₜ (fun s => (M.orientation s)) t *ᵥ fun j => y.val 3 j - M.centerOfMass.val 3 j) ⬝ᵥ ∂ₜ (fun s => (M.orientation s)) t *ᵥ fun j => y.val 3 j - M.centerOfMass.val 3 j) = cmap (fun y => ((crossProduct (M.angularVelocity t)) fun j => (M.displacement t y).val 3 j - (M.comTrajectory t).val 3 j) ⬝ᵥ (crossProduct (M.angularVelocity t)) fun j => (M.displacement t y).val 3 j - (M.comTrajectory t).val 3 j) M:RigidBodyMotion 3t:Timeh:M.mass 0hR:DifferentiableAt (fun s => (M.orientation s)) ty:Space(cmap (fun y => (∂ₜ (fun s => (M.orientation s)) t *ᵥ fun j => y.val 3 j - M.centerOfMass.val 3 j) ⬝ᵥ ∂ₜ (fun s => (M.orientation s)) t *ᵥ fun j => y.val 3 j - M.centerOfMass.val 3 j) ) y = (cmap (fun y => ((crossProduct (M.angularVelocity t)) fun j => (M.displacement t y).val 3 j - (M.comTrajectory t).val 3 j) ⬝ᵥ (crossProduct (M.angularVelocity t)) fun j => (M.displacement t y).val 3 j - (M.comTrajectory t).val 3 j) ) y All goals completed! 🐙

König's theorem in the body frame. The total kinetic energy M.kineticEnergy t, formed from the lab-frame point velocities, splits at the centre of mass (centerOfMass = 0) as T = ½ M ⟪V, V⟫ + rotationalKineticEnergy ω_body. The rotational energy is a frame-independent scalar, so it is evaluated here from the body-frame angular velocity ω_body: the spatial form |Ṙ (y − c)|² and the body form |ω_body × (y − c)|² agree because Ṙ (y − c) = R (ω_body × (y − c)) and R, being orthogonal, preserves the norm.

All goals completed! 🐙