MultiPendulumBeta
MultiPendulumBeta(
rods,
g=9.81,
var_name='multi_pendulum_beta',
state_variables=None,
diagnostic_variables=None,
*args,
**kwargs,
)Experimental N-rod chain pendulum solved via a Lagrangian mass matrix.
This beta model generalizes the double pendulum to an arbitrary chain of rigid, massless rods with point masses at their tips. At each timestep it assembles the symmetric mass matrix M(theta) and torque vector tau(theta, omega) and solves M @ alpha = tau for the angular accelerations.
State variables are interleaved as [theta1, omega1, theta2, omega2, ..., thetaN, omegaN]. Diagnostics are computed after integration and include total mechanical energy plus Cartesian bob positions x1, y1, ..., xN, yN.
Parameters
rods :-
Sequence of :class:
PendulumRodBetain pivot-to-tip order. Must contain at least two rods. g : = 9.81-
Gravitational acceleration in m/s^2. Must be > 0.
var_name : = 'multi_pendulum_beta'-
Human-readable label.
state_variables : = None-
Defaults to
['theta1', 'omega1', 'theta2', 'omega2', ...]. diagnostic_variables : = None-
Defaults to
['energy', 'x1', 'y1', 'x2', 'y2', ...].
Notes
This class is intentionally marked beta because it extends the existing pendulum family with a more general mass-matrix formulation that has less long-term usage history in ClimateCritters than the simple, driven, and closed-form double pendulum models.
Examples
import matplotlib.pyplot as plt
from climatecritters.model_critters.pendulum import (
MultiPendulumBeta,
PendulumRodBeta,
)
rods = [
PendulumRodBeta(m=1.0, L=1.0),
PendulumRodBeta(m=1.0, L=1.0, damping=0.2),
PendulumRodBeta(m=0.5, L=0.8),
]
model = MultiPendulumBeta(rods=rods, g=9.81)
output = model.integrate(
t_span=(0, 30),
y0=[0.5, 0.0, 0.5, 0.0, 0.3, 0.0],
method='RK45',
kwargs={'rtol': 1e-10, 'atol': 1e-12},
)
fig, ax = plt.subplots()
ax.plot(output.diagnostic_variables['x3'], output.diagnostic_variables['y3'])
ax.set_xlabel('x3')
ax.set_ylabel('y3')
ax.set_title('MultiPendulumBeta tip trajectory')
plt.savefig('docs/reference/figures/MultiPendulumBeta_example.png',
dpi=150, bbox_inches='tight')
Methods
| Name | Description |
|---|---|
| cartesian_positions | Return (x1, y1, x2, y2, ..., xN, yN) from the last run. |
cartesian_positions
MultiPendulumBeta.cartesian_positions()Return (x1, y1, x2, y2, ..., xN, yN) from the last run.