pygeoinf.data_assimilation.pendulum.double package

Submodules

pygeoinf.data_assimilation.pendulum.double.physics module

physics.py

Hamiltonian dynamics, coordinate transformations, and linearised models specifically for the Double Pendulum (4D state space).

State vector: y = [theta1, theta2, p1, p2] Convention: 0 is vertically DOWN. Rotation is Counter-Clockwise.

pygeoinf.data_assimilation.pendulum.double.physics.eom(t: float, y: ndarray, L1: float = 1.0, L2: float = 1.0, m1: float = 1.0, m2: float = 1.0, g: float = 1.0) List[float][source]

Hamilton’s Equations of Motion for the Double Pendulum. Compatible with core.solve_trajectory.

pygeoinf.data_assimilation.pendulum.double.physics.eom_linear(t: float, y: ndarray, A: ndarray) ndarray[source]

Linearised EOM given pre-computed A matrix.

pygeoinf.data_assimilation.pendulum.double.physics.eom_tangent_linear(t: float, state_aug: ndarray, L1: float = 1.0, L2: float = 1.0, m1: float = 1.0, m2: float = 1.0, g: float = 1.0) ndarray[source]

Coupled ODE for Reference (Non-linear) + Perturbation (Linear). State vector (8D): [y (4D), delta_y (4D)]

pygeoinf.data_assimilation.pendulum.double.physics.get_coords(th1: float | ndarray, th2: float | ndarray, L1: float = 1.0, L2: float = 1.0) Tuple[float | ndarray, ...][source]

Converts angles to Cartesian coordinates for both bobs. Convention: (0,0) is the pivot, +y is Up, +x is Right.

pygeoinf.data_assimilation.pendulum.double.physics.get_jacobian(y: ndarray, L1: float = 1.0, L2: float = 1.0, m1: float = 1.0, m2: float = 1.0, g: float = 1.0) ndarray[source]

Computes the Exact Analytic Jacobian Matrix J(y) = df/dy (4x4). Crucial for Extended Kalman Filters (EKF).

pygeoinf.data_assimilation.pendulum.double.physics.get_linear_matrix(L1: float = 1.0, L2: float = 1.0, m1: float = 1.0, m2: float = 1.0, g: float = 1.0) ndarray[source]

Returns the linearised system matrix A for the equilibrium state (0,0,0,0). d/dt(y) = A * y

pygeoinf.data_assimilation.pendulum.double.physics.get_linear_propagator(dt: float, L1: float = 1.0, L2: float = 1.0, m1: float = 1.0, m2: float = 1.0, g: float = 1.0) ndarray[source]

Returns the discrete-time propagator P = exp(A * dt).

pygeoinf.data_assimilation.pendulum.double.visualisation module

visualisation.py

Visualisation tools for the Double Pendulum. Focuses on Chaotic Sensitivity (Divergence) and Ensemble particle clouds.

pygeoinf.data_assimilation.pendulum.double.visualisation.animate_ensemble_phase_space(t_points: ndarray, ensemble_trajectories: ndarray) FuncAnimation[source]

Animates the ensemble of particles moving in the two phase planes: (Theta1 vs P1) and (Theta2 vs P2).

Parameters:
  • t_points – Time array.

  • ensemble_trajectories – Array of shape (N_samples, 4, N_time).

pygeoinf.data_assimilation.pendulum.double.visualisation.animate_pendulum(t_points: ndarray, solution: ndarray, L1: float = 1.0, L2: float = 1.0, trail_len: int = 50) FuncAnimation[source]

Physical space animation for the Double Pendulum. Includes a fading trail for the second bob to visualize chaotic paths.

pygeoinf.data_assimilation.pendulum.double.visualisation.plot_ensemble_phase_space(ensemble_trajectories: ndarray, t_points: ndarray, time_idx: int = -1) None[source]

Plots the ensemble particles projected onto (th1, p1) and (th2, p2) planes. Uses generic core scatter tools but configured for the 4D Double Pendulum.

Parameters:
  • ensemble_trajectories – Shape (N_samples, 4, N_time).

  • t_points – Time array.

  • time_idx – Index of time to plot.

pygeoinf.data_assimilation.pendulum.double.visualisation.plot_sensitivity_divergence(t_points: ndarray, traj_ref: ndarray, traj_pert: ndarray, title: str = 'Sensitivity to Initial Conditions') None[source]

Plots the divergence between two trajectories to demonstrate chaos. Top panel: Time series comparison of Theta 1 & 2. Bottom panel: Log-scale Euclidean distance between states.

Parameters:
  • t_points – Time array.

  • traj_ref – Reference trajectory (4, N_time).

  • traj_pert – Perturbed trajectory (4, N_time).

Module contents

Double Pendulum Submodule.

Focuses on chaotic dynamics, phase space visualisation, and Ensemble (particle) experiments.

pygeoinf.data_assimilation.pendulum.double.animate_ensemble_phase_space(t_points: ndarray, ensemble_trajectories: ndarray) FuncAnimation[source]

Animates the ensemble of particles moving in the two phase planes: (Theta1 vs P1) and (Theta2 vs P2).

Parameters:
  • t_points – Time array.

  • ensemble_trajectories – Array of shape (N_samples, 4, N_time).

pygeoinf.data_assimilation.pendulum.double.animate_pendulum(t_points: ndarray, solution: ndarray, L1: float = 1.0, L2: float = 1.0, trail_len: int = 50) FuncAnimation[source]

Physical space animation for the Double Pendulum. Includes a fading trail for the second bob to visualize chaotic paths.

pygeoinf.data_assimilation.pendulum.double.eom(t: float, y: ndarray, L1: float = 1.0, L2: float = 1.0, m1: float = 1.0, m2: float = 1.0, g: float = 1.0) List[float][source]

Hamilton’s Equations of Motion for the Double Pendulum. Compatible with core.solve_trajectory.

pygeoinf.data_assimilation.pendulum.double.eom_linear(t: float, y: ndarray, A: ndarray) ndarray[source]

Linearised EOM given pre-computed A matrix.

pygeoinf.data_assimilation.pendulum.double.eom_tangent_linear(t: float, state_aug: ndarray, L1: float = 1.0, L2: float = 1.0, m1: float = 1.0, m2: float = 1.0, g: float = 1.0) ndarray[source]

Coupled ODE for Reference (Non-linear) + Perturbation (Linear). State vector (8D): [y (4D), delta_y (4D)]

pygeoinf.data_assimilation.pendulum.double.get_coords(th1: float | ndarray, th2: float | ndarray, L1: float = 1.0, L2: float = 1.0) Tuple[float | ndarray, ...][source]

Converts angles to Cartesian coordinates for both bobs. Convention: (0,0) is the pivot, +y is Up, +x is Right.

pygeoinf.data_assimilation.pendulum.double.get_jacobian(y: ndarray, L1: float = 1.0, L2: float = 1.0, m1: float = 1.0, m2: float = 1.0, g: float = 1.0) ndarray[source]

Computes the Exact Analytic Jacobian Matrix J(y) = df/dy (4x4). Crucial for Extended Kalman Filters (EKF).

pygeoinf.data_assimilation.pendulum.double.get_linear_matrix(L1: float = 1.0, L2: float = 1.0, m1: float = 1.0, m2: float = 1.0, g: float = 1.0) ndarray[source]

Returns the linearised system matrix A for the equilibrium state (0,0,0,0). d/dt(y) = A * y

pygeoinf.data_assimilation.pendulum.double.get_linear_propagator(dt: float, L1: float = 1.0, L2: float = 1.0, m1: float = 1.0, m2: float = 1.0, g: float = 1.0) ndarray[source]

Returns the discrete-time propagator P = exp(A * dt).

pygeoinf.data_assimilation.pendulum.double.plot_ensemble_phase_space(ensemble_trajectories: ndarray, t_points: ndarray, time_idx: int = -1) None[source]

Plots the ensemble particles projected onto (th1, p1) and (th2, p2) planes. Uses generic core scatter tools but configured for the 4D Double Pendulum.

Parameters:
  • ensemble_trajectories – Shape (N_samples, 4, N_time).

  • t_points – Time array.

  • time_idx – Index of time to plot.

pygeoinf.data_assimilation.pendulum.double.plot_sensitivity_divergence(t_points: ndarray, traj_ref: ndarray, traj_pert: ndarray, title: str = 'Sensitivity to Initial Conditions') None[source]

Plots the divergence between two trajectories to demonstrate chaos. Top panel: Time series comparison of Theta 1 & 2. Bottom panel: Log-scale Euclidean distance between states.

Parameters:
  • t_points – Time array.

  • traj_ref – Reference trajectory (4, N_time).

  • traj_pert – Perturbed trajectory (4, N_time).