Stability Analysis
The stability module provides tools for analyzing equilibrium points and system stability in mechanical systems.
Overview
Stability analysis determines whether small perturbations from equilibrium grow or decay over time. The module implements:
Equilibrium Finding: Locate fixed points where \(\partial V/\partial q = 0\)
Linearization: Taylor expand about equilibrium to get linear dynamics
Eigenvalue Analysis: Determine stability from eigenvalues of linearized system
Stability Classification: Classify as stable, unstable, saddle, or center
Theory
Equilibrium Points
For a potential \(V(q)\), equilibrium points satisfy:
Linearization
Near an equilibrium \(q_0\), the equations of motion become:
where \(M\) is the mass matrix and \(K_{ij} = \partial^2 V/\partial q_i \partial q_j\) is the stiffness matrix (Hessian).
Stability Criteria
For the linearized system, stability depends on eigenvalues \(\lambda\) of \(M^{-1}K\):
Stable: All eigenvalues positive (oscillatory motion)
Unstable: Any eigenvalue negative (exponential growth)
Saddle: Mixed positive/negative eigenvalues
Center: All eigenvalues zero (marginal stability)
Usage Examples
Finding Equilibria
from mechanics_dsl.domains.classical import StabilityAnalyzer, find_equilibria
import sympy as sp
# Define potential
x = sp.Symbol('x', real=True)
k = sp.Symbol('k', positive=True)
# Harmonic oscillator potential
V = sp.Rational(1, 2) * k * x**2
# Find equilibrium
equilibria = find_equilibria(V, ['x'])
# Returns: [EquilibriumPoint(coordinates={'x': 0})]
Stability Analysis
from mechanics_dsl.domains.classical import StabilityAnalyzer
import sympy as sp
analyzer = StabilityAnalyzer()
# Pendulum potential: V = mgl(1 - cos(θ))
theta = analyzer.get_symbol('theta')
m, g, l = sp.symbols('m g l', positive=True)
V = m * g * l * (1 - sp.cos(theta))
# Analyze stability at θ = 0 (hanging down)
result = analyzer.analyze_equilibrium(V, {'theta': 0}, {'m': 1, 'g': 10, 'l': 1})
print(result.stability_type) # StabilityType.STABLE
print(result.eigenvalues) # [10.0] (positive = stable)
# Analyze stability at θ = π (inverted)
result_inv = analyzer.analyze_equilibrium(V, {'theta': sp.pi}, {'m': 1, 'g': 10, 'l': 1})
print(result_inv.stability_type) # StabilityType.UNSTABLE
print(result_inv.eigenvalues) # [-10.0] (negative = unstable)
Double Well Potential
from mechanics_dsl.domains.classical import StabilityAnalyzer
import sympy as sp
analyzer = StabilityAnalyzer()
x = analyzer.get_symbol('x')
# Double well: V = x^4 - 2*x^2
V = x**4 - 2*x**2
# Find all equilibria
equilibria = analyzer.find_equilibria(V, ['x'])
# Returns: x = -1, 0, +1
for eq in equilibria:
result = analyzer.analyze_equilibrium(V, eq.coordinates, {})
print(f"x = {eq.coordinates['x']}: {result.stability_type}")
# Output:
# x = -1: STABLE (local minimum)
# x = 0: UNSTABLE (local maximum)
# x = +1: STABLE (local minimum)
Computing Normal Frequencies
from mechanics_dsl.domains.classical import StabilityAnalyzer
import sympy as sp
import numpy as np
analyzer = StabilityAnalyzer()
# For stable equilibrium, eigenvalues give ω²
# Natural frequency: ω = √(eigenvalue)
x = analyzer.get_symbol('x')
m, k = sp.symbols('m k', positive=True)
T = sp.Rational(1, 2) * m * analyzer.get_symbol('x_dot')**2
V = sp.Rational(1, 2) * k * x**2
result = analyzer.analyze_stability(T, V, ['x'], {'m': 1.0, 'k': 4.0})
omega = np.sqrt(result.eigenvalues[0])
print(f"Natural frequency: ω = {omega}") # ω = 2.0
API Reference
Classes
- class StabilityAnalyzer
Analyzer for equilibrium stability.
- find_equilibria(potential, coordinates)
Find equilibrium points where ∂V/∂q = 0.
- linearize(lagrangian, equilibrium, coordinates)
Linearize system about equilibrium point.
- analyze_equilibrium(potential, equilibrium, parameters)
Analyze stability at given equilibrium.
- analyze_stability(kinetic, potential, coordinates, parameters)
Full stability analysis with mass and stiffness matrices.
Enums
- class StabilityType
STABLE: All eigenvalues positiveUNSTABLE: At least one negative eigenvalueSADDLE: Mixed positive/negativeCENTER: All eigenvalues zero
See Also
Normal Modes & Oscillations - Normal mode analysis
Dissipation & Non-Conservative Forces - Damped stability analysis