延拓法

延拓法从一条已知轨道出发,沿某个轨道族参数方向逐步生成相邻轨道。

基本原理

给定一条已收敛的周期轨道(种子),延拓法沿某个参数方向(如 Jacobi 常数、振幅) 逐步微调初始条件,每步用微分修正重新收敛,生成一族连续变化的轨道。

自然延拓

自然延拓沿单一参数方向逐步推进,每步以当前解为初值:

from e2m2e.algorithm.solver import DifferentialCorrection, Continuation

corrector = DifferentialCorrection(dynamics)
corrector.setup_2D_symmetric_x_fixed_x0(x0=initial_state[0])

continuation = Continuation(corrector=corrector)
result = continuation.natural_continuation(
    seed_orbit=seed_dro,       # 种子轨道
    param_range=(0.14, 0.9),   # 参数扫描范围
    step_size=0.005,           # 步长
)

print(f"生成 {len(result.family.orbits)} 条轨道")

参数说明:

  • seed_orbit — 种子轨道(已收敛的周期轨道)

  • param_range — 参数扫描范围(如 x0 范围)

  • step_size — 每步步长

伪弧长延拓

伪弧长延拓在自然延拓的基础上增加弧长约束,能处理转向点(turning point), 适合参数-振幅关系非单调的轨道族(如 Halo 轨道的振幅-周期曲线)。

family = continuation.pseudo_arclength_continuation(
    seed_orbit=seed_orbit,
    n_orbits=50,              # 本支生成的新轨道条数
    step_size=0.005,          # 伪弧长步长 ΔS
    direction="positive",     # 延拓方向;双侧延拓调用两次
)

Halo 轨道延拓

Halo 轨道有专用的延拓编排,结合 Richardson 三阶解析近似和延拓法:

# 1. 先生成种子轨道(Richardson 近似在小振幅下精度高,种子宜取小振幅,
#    再由延拓逐步放大)
seed_orbit = continuation.generate_halo_seed_orbit(
    libration_point=1,
    amplitude_z=0.001,
    halo_class=0,        # 0=北族,1=南族
)

# 2. 从种子出发做自然参数延拓,返回 Orbit 列表
family = continuation.generate_halo_family(
    seed_orbit,
    n_orbits=50,
    z_range=(0.001, 0.15),   # z 振幅范围
)

延拓失败处理

延拓过程中,某一步微分修正不收敛时,延拓器会缩减步长重试; 步长缩减到下限(min_step_size)仍不收敛时,终止该方向的延拓。 轨道族中只追加收敛的轨道,失败步不会进入结果。

延拓结束后,可通过 Continuation 实例上的两个属性诊断:

  • continuation.termination_reason — 终止原因(如“步长过小,延拓终止”)

  • continuation.continuation_stats — 成功/失败步数等统计信息