Classical Mechanics Basis¶
The Degeneracy Problem¶
Two classic pairs share SI dimensions:
| Pair | Shared Dimension | Hidden Qualifier |
|---|---|---|
| Torque vs Energy | ML²T⁻² | Angle (per radian) |
| Surface tension vs Spring constant | MT⁻² | Geometric character |
Torque vs Energy¶
The Degeneracy¶
| Quantity | SI Unit | SI Dimension |
|---|---|---|
| Energy | Joule (J) | ML²T⁻² |
| Torque | Newton-meter (N·m) | ML²T⁻² |
Same dimension. Yet: - Energy is a scalar (state function) - Torque is a pseudovector (force × lever arm × sin θ) - Torque is energy per unit angle: τ = dW/dθ
Extended Basis¶
from ucon.basis import Basis, BasisComponent, Vector
from ucon.core import Dimension, Unit
from fractions import Fraction
MECHANICS = Basis("Mechanics", [
BasisComponent("mass", "M"), # 0
BasisComponent("length", "L"), # 1
BasisComponent("time", "T"), # 2
BasisComponent("angle", "A"), # 3 — the hidden qualifier
])
Dimensional Vectors¶
| Quantity | Vector | Interpretation |
|---|---|---|
| Energy | M¹L²T⁻²A⁰ | Work done |
| Torque | M¹L²T⁻²A⁻¹ | Work per radian |
| Angle | M⁰L⁰T⁰A¹ | Rotation measure |
| Angular velocity | M⁰L⁰T⁻¹A¹ | Radians per second |
| Angular momentum | M¹L²T⁻¹A¹ | Rotational inertia × ω |
Implementation¶
# Dimensions
energy = Dimension(
vector=Vector(MECHANICS, (1, 2, -2, 0)),
name="energy"
) # M¹L²T⁻²A⁰
torque = Dimension(
vector=Vector(MECHANICS, (1, 2, -2, -1)),
name="torque"
) # M¹L²T⁻²A⁻¹
angle = Dimension(
vector=Vector(MECHANICS, (0, 0, 0, 1)),
name="angle"
) # A¹
# Units
joule = Unit(name="joule", shorthand="J", dimension=energy)
newton_meter = Unit(name="newton_meter", shorthand="N·m", dimension=torque)
radian = Unit(name="radian", shorthand="rad", dimension=angle)
Dimensional Algebra¶
Torque × Angle = Energy:
Energy / Angle = Torque:
Safety¶
joule(100) + newton_meter(50)
# raises: incompatible dimensions (A⁰ vs A⁻¹)
# Correct: convert torque to energy via angle
work = newton_meter(50) * radian(2) # → 100 J
Surface Tension vs Spring Constant¶
The Degeneracy¶
| Quantity | SI Unit | SI Dimension | Physical Meaning |
|---|---|---|---|
| Spring constant (k) | N/m | MT⁻² | Force per displacement (1D) |
| Surface tension (γ) | N/m | MT⁻² | Force per length along interface (2D) |
Both are N/m = kg/s², but: - Spring constant: restoring force per unit displacement - Surface tension: force per unit length of edge on a surface (or energy per area)
Alternative View¶
| Quantity | Alternative Form | Shows |
|---|---|---|
| Spring constant | N/m | Force / length (1D linear) |
| Surface tension | J/m² | Energy / area (2D interfacial) |
J/m² = (kg·m²/s²)/m² = kg/s² = N/m — same dimension.
Extended Basis¶
MECHANICS_EXTENDED = Basis("Mechanics-Extended", [
BasisComponent("mass", "M"),
BasisComponent("length", "L"),
BasisComponent("time", "T"),
BasisComponent("angle", "A"),
BasisComponent("interface", "I"), # interfacial/surface character
])
Dimensional Vectors¶
| Quantity | Vector | Interpretation |
|---|---|---|
| Spring constant | M¹L⁰T⁻²A⁰I⁰ | Linear restoring force |
| Surface tension | M¹L⁰T⁻²A⁰I¹ | Interfacial energy density |
| Interface factor | M⁰L⁰T⁰A⁰I¹ | Surface/interface qualifier |
Implementation¶
spring_constant_dim = Dimension(
vector=Vector(MECHANICS_EXTENDED, (1, 0, -2, 0, 0)),
name="spring_constant"
) # M¹T⁻²I⁰
surface_tension_dim = Dimension(
vector=Vector(MECHANICS_EXTENDED, (1, 0, -2, 0, 1)),
name="surface_tension"
) # M¹T⁻²I¹
# Units
newton_per_meter = Unit(
name="newton_per_meter",
shorthand="N/m",
dimension=spring_constant_dim
)
joule_per_m2 = Unit(
name="joule_per_square_meter",
shorthand="J/m²",
dimension=surface_tension_dim
)
Physical Context¶
Spring constant: - Hooke's law: F = -kx - k has units N/m - Describes 1D elastic deformation
Surface tension: - Capillary force: F = γL (force along edge of length L) - γ has units N/m or equivalently J/m² - Describes 2D interfacial energy - Examples: water-air (~72 mN/m), mercury-air (~486 mN/m)
Why It Matters¶
In multiphysics simulations (e.g., microfluidics), both appear:
# Droplet on a spring (hypothetical)
spring_force = k * displacement # N
surface_force = gamma * perimeter # N
# Without dimensional distinction:
total = k + gamma # Dimensionally valid in SI, physically nonsense
# With extended basis:
total = k + gamma # raises: incompatible (I⁰ vs I¹)
Stiffness Variants¶
The spring constant degeneracy extends to other stiffness measures:
| Quantity | SI Dimension | Physical Context |
|---|---|---|
| Spring constant | MT⁻² | Translational spring |
| Torsional stiffness | ML²T⁻²A⁻¹ | Rotational spring (torque per radian) |
| Bending stiffness (EI) | ML³T⁻² | Beam flexure |
| Surface tension | MT⁻² | Interface energy |
With the extended basis, all are distinct:
# Torsional stiffness: torque per angle
torsional_stiffness = Dimension(
vector=Vector(MECHANICS_EXTENDED, (1, 2, -2, -2, 0)),
name="torsional_stiffness"
) # M¹L²T⁻²A⁻² (N·m per radian)
Projection to SI¶
When you need SI compatibility:
MECHANICS_TO_SI = ConstantBoundBasisTransform(
source=MECHANICS,
target=SI,
matrix=(
(1, 0, 0, ...), # M → M
(0, 1, 0, ...), # L → L
(0, 0, 1, ...), # T → T
(0, 0, 0, ...), # A → dimensionless (dropped)
),
bindings=(
ConstantBinding(
source_component=MECHANICS["angle"],
target_expression=Vector(SI, (0, 0, 0, ...)), # dimensionless
constant_symbol="rad",
exponent=Fraction(1),
),
),
)
The binding records that angle was collapsed to dimensionless via the radian.
Summary¶
| Degeneracy | Hidden Dimension | Resolution |
|---|---|---|
| Torque vs Energy | Angle (A) | Torque is M¹L²T⁻²A⁻¹ |
| Surface tension vs Spring constant | Interface (I) | Surface tension is M¹T⁻²I¹ |
| Torsional vs Linear stiffness | Angle (A) | Torsional is M¹L²T⁻²A⁻² |
All three are instances of the same pattern: a geometric qualifier (angle, interface) is treated as dimensionless in SI but carries physical meaning that affects how quantities combine.