DampedSpring
DampedSpring(
var_name='damped_spring',
m=1.0,
k=1.0,
c=0.1,
F=0.0,
state_variables=None,
diagnostic_variables=None,
*args,
**kwargs,
)Damped (and optionally driven) spring-mass oscillator.
Parameters
var_name : = 'damped_spring'-
Human-readable label for the model.
m : = 1.0-
Mass in kg. Must be > 0.
k : = 1.0-
Spring constant in N/m. Must be > 0.
c : = 0.1-
Linear damping coefficient in N·s/m.
c=0gives undamped SHM;c < 2*sqrt(k*m)gives underdamped (oscillatory) decay. F : float or callable orcc.Forcing= 0.0-
External driving force (N). Default 0.0 (undriven). For a time-varying drive use
model.register_forcing('F', forcing_obj). state_variables : = None-
Names for the two integrated state variables (position, velocity).
diagnostic_variables : = None-
Names for post-integration diagnostics.
Notes
State variables are x (position) and v (velocity) in that order. Diagnostic variables energy and omega_0 are computed after integration.
Examples
import numpy as np
import matplotlib.pyplot as plt
import climatecritters as cc
from climatecritters.model_critters.damped_spring import DampedSpring
model = DampedSpring(m=1.0, k=4.0, c=0.4)
output = model.integrate(t_span=(0, 30), y0=[1.0, 0.0], method='RK45')
ts = output.to_pyleo(var_names=['x'])
ts.plot()
plt.savefig('docs/reference/figures/DampedSpring_example.png',
dpi=150, bbox_inches='tight')
With resonant driving (external force at ω₀):
import numpy as np
import matplotlib.pyplot as plt
import climatecritters as cc
from climatecritters.model_critters.damped_spring import DampedSpring
m, k = 1.0, 4.0
omega_0 = np.sqrt(k / m)
model = DampedSpring(m=m, k=k, c=0.0)
model.register_forcing('F', cc.Forcing(lambda t: np.cos(omega_0 * t)))
output = model.integrate(t_span=(0, 30), y0=[0.0, 0.0], method='RK45')
fig, ax = plt.subplots()
ax.plot(output.time, output.state_variables['x'])
ax.set_xlabel('time'); ax.set_ylabel('x')
ax.set_title('DampedSpring — resonant driving at ω₀')
plt.savefig('docs/reference/figures/DampedSpring_resonance_example.png',
dpi=150, bbox_inches='tight')
Methods
| Name | Description |
|---|---|
| damping_ratio | Return ζ = c / (2√(km)). ζ<1 underdamped, ζ=1 critical, ζ>1 overdamped. |
| natural_frequency | Return ω₀ = √(k/m) in rad/s (uses current param_values). |
| natural_period | Return T₀ = 2π/ω₀ in seconds (uses current param_values). |
damping_ratio
DampedSpring.damping_ratio()Return ζ = c / (2√(km)). ζ<1 underdamped, ζ=1 critical, ζ>1 overdamped.
natural_frequency
DampedSpring.natural_frequency()Return ω₀ = √(k/m) in rad/s (uses current param_values).
natural_period
DampedSpring.natural_period()Return T₀ = 2π/ω₀ in seconds (uses current param_values).