Center Manifold Analysis

This guide covers the creation and analysis of center manifolds in the Circular Restricted Three-Body Problem, including normal form theory, center manifold reduction, and Poincare maps.

Center Manifold Theory

Center manifolds are invariant manifolds associated with the center directions of libration points. They provide a powerful framework for understanding the local dynamics and finding periodic orbits.

Creating Center Manifolds

Center manifolds are created from libration points:

from hiten import System

# Create system and libration point
system = System.from_bodies("earth", "moon")
l1 = system.get_libration_point(1)

# Create center manifold
center_manifold = l1.get_center_manifold(degree=6)

# Compute the center manifold
center_manifold.compute()

print(f"Center manifold degree: {center_manifold.degree}")
print(f"Center manifold computed: {center_manifold.is_computed}")

Center Manifold Degrees

Control the degree of the center manifold expansion:

# Low degree (faster, less accurate)
cm_low = l1.get_center_manifold(degree=3)
cm_low.compute()

# Medium degree (balanced)
cm_med = l1.get_center_manifold(degree=6)
cm_med.compute()

# High degree (slower, more accurate)
cm_high = l1.get_center_manifold(degree=10)
cm_high.compute()

Center Manifold Properties

Access center manifold properties and data:

Basic Properties

# Basic properties
print(f"Degree: {center_manifold.degree}")
print(f"Libration point: {center_manifold.libration_point}")
print(f"Mass parameter: {center_manifold.mu}")
print(f"Position: {center_manifold.position}")

Coefficients

Access the computed coefficients:

# Get coefficients
coefficients = center_manifold.coefficients()
print(f"Coefficients shape: {coefficients.shape}")

# Access specific coefficients
print(f"First few coefficients: {coefficients[:10]}")

Normal Form Data

Access normal form transformation data:

# Get normal form data
normal_form = center_manifold.normal_form
print(f"Normal form type: {type(normal_form)}")

# Access transformation matrices
if hasattr(normal_form, 'C'):
    print(f"Transformation matrix C shape: {normal_form.C.shape}")
if hasattr(normal_form, 'Cinv'):
    print(f"Inverse transformation matrix shape: {normal_form.Cinv.shape}")

Center Manifold Coordinates

Work with center manifold coordinates:

Coordinate Transformations

# Transform from center manifold to physical coordinates
cm_coords = np.array([0.1, 0.05, 0.0, 0.0])  # [q1, q2, p1, p2]
physical_coords = center_manifold.to_synodic(cm_coords)
print(f"Physical coordinates: {physical_coords}")

# Transform from physical to center manifold coordinates
physical_state = np.array([0.8, 0.0, 0.1, 0.0, 0.15, 0.0])  # [x, y, z, vx, vy, vz]
cm_state = center_manifold.cm(physical_state)
print(f"Center manifold coordinates: {cm_state}")

Initial Conditions

Generate initial conditions for periodic orbits:

# Generate initial conditions
ic = center_manifold.to_synodic([0.0, 0.0], 0.6, "q3")
print(f"Initial conditions: {ic}")

# Different coordinate choices
ic_q1 = center_manifold.to_synodic([0.1, 0.0], 0.6, "q1")
ic_q2 = center_manifold.to_synodic([0.0, 0.1], 0.6, "q2")
ic_p1 = center_manifold.to_synodic([0.0, 0.0], 0.6, "p1")
ic_p2 = center_manifold.to_synodic([0.0, 0.0], 0.6, "p2")

Poincare Maps

Create Poincare maps from center manifolds:

Basic Poincare Maps

# Create Poincare map
poincare_map = center_manifold.poincare_map(energy=0.7)

# Compute with configuration
overrides = {
    "n_seeds": 50,
    "n_iter": 100,
    "seed_strategy": "axis_aligned",
}
poincare_map.compute(section_coord="p3", overrides=overrides)

print(f"Poincare map computed")

Poincare Map Configuration

Control Poincare map parameters:

# High resolution map
poincare_map = center_manifold.poincare_map(energy=0.7)
overrides = {
    "n_seeds": 100,
    "n_iter": 200,
    "seed_strategy": "axis_aligned",
}
poincare_map.compute(section_coord="p3", overrides=overrides)

# Different section coordinates
poincare_map_q1 = center_manifold.poincare_map(energy=0.7)
overrides_q1 = {
    "n_seeds": 50,
    "n_iter": 100,
}
poincare_map_q1.compute(section_coord="q1", overrides=overrides_q1)

poincare_map_q2 = center_manifold.poincare_map(energy=0.7)
overrides_q2 = {
    "n_seeds": 50,
    "n_iter": 100,
}
poincare_map_q2.compute(section_coord="q2", overrides=overrides_q2)

Poincare Map Analysis

Analyze computed Poincare maps:

Map Properties

# Plot the computed map
poincare_map.plot(axes=("p2", "q3"))

Map Data

# Plot the map with custom axes
poincare_map.plot(axes=("p2", "q3"))

Map Visualization

# Plot Poincare map
poincare_map.plot(axes=("p2", "q3"))

Finding Orbits in Center Manifold

Use center manifolds to find periodic orbits:

Analytical Initial Conditions

# Generate initial conditions for different orbit types

# Halo orbit
halo_ic = center_manifold.to_synodic([0.0, 0.0], 0.6, "q3")
print(f"Halo initial conditions: {halo_ic}")

# Lyapunov orbit
lyapunov_ic = center_manifold.to_synodic([0.1, 0.0], 0.6, "q1")
print(f"Lyapunov initial conditions: {lyapunov_ic}")

# Vertical orbit
vertical_ic = center_manifold.to_synodic([0.0, 0.0], 0.6, "p2")
print(f"Vertical initial conditions: {vertical_ic}")

Orbit Creation from Center Manifold

# Create orbits using center manifold initial conditions

# Halo orbit
halo = l1.create_orbit("halo", initial_state=halo_ic)
halo.correct()
halo.propagate()

# Lyapunov orbit
lyapunov = l1.create_orbit("lyapunov", initial_state=lyapunov_ic)
lyapunov.correct()
lyapunov.propagate()

# Vertical orbit
vertical = l1.create_orbit("vertical", initial_state=vertical_ic)
vertical.correct()
vertical.propagate()

Practical Examples

Earth-Moon L1 Center Manifold

from hiten import System

# Create system
system = System.from_bodies("earth", "moon")
l1 = system.get_libration_point(1)

# Create center manifold
center_manifold = l1.get_center_manifold(degree=6)
center_manifold.compute()

# Create and compute Poincare map
poincare_map = center_manifold.poincare_map(energy=0.7)
overrides = {
    "n_seeds": 50,
    "n_iter": 100,
    "seed_strategy": "axis_aligned",
}
poincare_map.compute(section_coord="p3", overrides=overrides)

# Plot map
poincare_map.plot(axes=("p2", "q3"))

# Generate orbits
halo_ic = center_manifold.to_synodic([0.0, 0.0], 0.6, "q3")
halo = l1.create_orbit("halo", initial_state=halo_ic)
halo.correct()
halo.propagate()
halo.plot()

Sun-Earth L2 Center Manifold

# Sun-Earth system
system = System.from_bodies("sun", "earth")
l2 = system.get_libration_point(2)

# Create center manifold
center_manifold = l2.get_center_manifold(degree=8)
center_manifold.compute()

# Create and compute Poincare map
poincare_map = center_manifold.poincare_map(energy=0.5)
overrides = {
    "n_seeds": 100,
    "n_iter": 200,
    "seed_strategy": "axis_aligned",
}
poincare_map.compute(section_coord="q1", overrides=overrides)

# Plot map
poincare_map.plot(axes=("q2", "p1"))

# Generate orbits
lyapunov_ic = center_manifold.to_synodic([0.05, 0.0], 0.5, "q1")
lyapunov = l2.create_orbit("lyapunov", initial_state=lyapunov_ic)
lyapunov.correct()
lyapunov.propagate()
lyapunov.plot()

Custom Center Manifold Analysis

# Custom mass parameter
system = System.from_mu(0.1)  # 10% mass ratio
l1 = system.get_libration_point(1)

# Create center manifold
center_manifold = l1.get_center_manifold(degree=5)
center_manifold.compute()

# Generate multiple orbits
energies = np.linspace(0.3, 0.7, 5)

for energy in energies:
    ic = center_manifold.to_synodic([0.0, 0.0], energy, "q3")
    orbit = l1.create_orbit("halo", initial_state=ic)
    orbit.correct()
    orbit.propagate()

    print(f"Energy {energy:.2f}: Period {orbit.period:.3f}")

Next Steps

Once you understand center manifolds, you can:

For more advanced center manifold analysis, see Polynomial Methods and Algebra.