Libration Point Analysis
This guide covers the analysis of libration points (Lagrange points) in the Circular Restricted Three-Body Problem, including their computation, stability analysis, and properties.
Accessing Libration Points
Once you have a system, you can access its libration points:
from hiten import System
system = System.from_bodies("earth", "moon")
# Get individual libration points
l1 = system.get_libration_point(1)
l2 = system.get_libration_point(2)
l3 = system.get_libration_point(3)
l4 = system.get_libration_point(4)
l5 = system.get_libration_point(5)
# Or access all at once
libration_points = system.libration_points
print(f"Available points: {list(libration_points.keys())}")
Libration Point Properties
Each libration point provides access to key properties:
# Position in rotating frame
print(f"L1 position: {l1.position}")
print(f"L2 position: {l2.position}")
# Energy and Jacobi constant
print(f"L1 energy: {l1.energy}")
print(f"L1 Jacobi constant: {l1.jacobi}")
# Stability analysis
print(f"L1 is stable: {l1.is_stable}")
print(f"L2 is stable: {l2.is_stable}")
Position Analysis
Libration point positions are computed automatically and cached:
# Collinear points (L1, L2, L3)
print(f"L1: {l1.position}") # Between primaries
print(f"L2: {l2.position}") # Beyond smaller primary
print(f"L3: {l3.position}") # Beyond larger primary
# Triangular points (L4, L5)
print(f"L4: {l4.position}") # Leading triangular point
print(f"L5: {l5.position}") # Trailing triangular point
Energy Analysis
Each libration point has associated energy and Jacobi constant:
# Energy (dimensionless)
print(f"L1 energy: {l1.energy}")
print(f"L2 energy: {l2.energy}")
# Jacobi constant (CJ = -2*E)
print(f"L1 Jacobi constant: {l1.jacobi}")
print(f"L2 Jacobi constant: {l2.jacobi}")
Stability Analysis
HITEN provides comprehensive stability analysis for libration points:
# Basic stability check
print(f"L1 stable: {l1.is_stable}")
print(f"L2 stable: {l2.is_stable}")
print(f"L3 stable: {l3.is_stable}")
print(f"L4 stable: {l4.is_stable}")
print(f"L5 stable: {l5.is_stable}")
Detailed Stability Information
For more detailed analysis, access eigenvalues and eigenvectors:
# Get stability eigenvalues
stable_vals, unstable_vals, center_vals = l1.eigenvalues
print(f"L1 stable eigenvalues: {stable_vals}")
print(f"L1 unstable eigenvalues: {unstable_vals}")
print(f"L1 center eigenvalues: {center_vals}")
# Get corresponding eigenvectors
stable_vecs, unstable_vecs, center_vecs = l1.eigenvectors
print(f"L1 stable eigenvectors shape: {stable_vecs.shape}")
print(f"L1 unstable eigenvectors shape: {unstable_vecs.shape}")
print(f"L1 center eigenvectors shape: {center_vecs.shape}")
Linear Data
For advanced analysis, access the linearized system data:
# Get linear data for normal form analysis
linear_data = l1.linear_data
print(f"Linear data type: {type(linear_data)}")
# Access specific linear invariants
if hasattr(linear_data, 'lambda1'):
print(f"Lambda1: {linear_data.lambda1}")
if hasattr(linear_data, 'omega1'):
print(f"Omega1: {linear_data.omega1}")
if hasattr(linear_data, 'omega2'):
print(f"Omega2: {linear_data.omega2}")
Collinear Points (L1, L2, L3)
Collinear points have special properties and methods:
# L1 point properties
print(f"L1 gamma: {l1.gamma}") # Distance ratio
# Linear modes
lambda1, omega1, omega2 = l1.linear_modes
print(f"L1 linear modes: lambda_1={lambda1}, omega_1={omega1}, omega_2={omega2}")
Triangular Points (L4, L5)
Triangular points have different stability characteristics:
# L4/L5 are typically stable for small mass ratios
print(f"L4 stable: {l4.is_stable}")
print(f"L5 stable: {l5.is_stable}")
# They form equilateral triangles with the primaries
print(f"L4 position: {l4.position}")
print(f"L5 position: {l5.position}")
Center Manifold Access
Libration points provide access to their center manifolds:
# Get center manifold for normal form analysis
center_manifold = l1.get_center_manifold(degree=6)
print(f"Center manifold degree: {center_manifold.degree}")
# Compute the center manifold
center_manifold.compute()
# Access computed coefficients
coefficients = center_manifold.coefficients()
print(f"Center manifold coefficients shape: {coefficients.shape}")
Orbit Creation
Libration points can create periodic orbits:
# Create different types of orbits
halo_orbit = l1.create_orbit("halo", amplitude_z=0.2, zenith="southern")
lyapunov_orbit = l1.create_orbit("lyapunov", amplitude_x=0.05)
vertical_orbit = l1.create_orbit("vertical", initial_state=[...])
print(f"Created halo orbit: {halo_orbit}")
print(f"Created Lyapunov orbit: {lyapunov_orbit}")
System Integration
Libration points are integrated with the system’s dynamical system:
# Access the underlying dynamical system
dynsys = l1.dynsys
print(f"Dynamical system: {dynsys}")
# Access variational equations system
var_dynsys = l1.var_dynsys
print(f"Variational system: {var_dynsys}")
Examples
Earth-Moon L1 Analysis
from hiten import System
# Earth-Moon system
system = System.from_bodies("earth", "moon")
l1 = system.get_libration_point(1)
print(f"Earth-Moon L1 position: {l1.position}")
print(f"Mass parameter: {system.mu}")
print(f"L1 stable: {l1.is_stable}")
print(f"L1 Jacobi constant: {l1.jacobi}")
Sun-Earth L2 Analysis
# Sun-Earth system
system = System.from_bodies("sun", "earth")
l2 = system.get_libration_point(2)
print(f"Sun-Earth L2 position: {l2.position}")
print(f"Mass parameter: {system.mu}")
print(f"L2 stable: {l2.is_stable}")
Custom System Analysis
# Custom mass parameter
system = System.from_mu(0.1) # 10% mass ratio
l1 = system.get_libration_point(1)
print(f"Custom L1 position: {l1.position}")
print(f"Custom L1 stable: {l1.is_stable}")
Next Steps
Once you understand libration points, you can:
Propagate orbits around them (see Basic Orbit Propagation)
Create periodic orbits (see Periodic Orbit Creation and Analysis)
Analyze center manifolds (see Center Manifold Analysis)
For more advanced libration point analysis, see Center Manifold Analysis.