Damped Harmonic Oscillator¶

da PowerShell -- jupyter nbconvert --to html notebook.ipynb

1. Modello fisico¶

Lo script Python simula numericamente il moto di un oscillatore armonico smorzato descritto dall'equazione differenziale lineare del secondo ordine:

$$\large m \ddot{x} + b \dot{x} + k x = 0 $$

dove:

  • $b$ è il coefficiente di smorzamento viscoso,
  • $k$ è la costante elastica,
  • $x(t)$ è lo spostamento.

2. Riduzione a sistema del primo ordine¶

Introducendo la velocità:

$$\large v = \dot{x} $$

l'equazione diventa il sistema:

$$\large \begin{cases} \dot{x} = v \\ \dot{v} = -\dfrac{b}{m} v - \dfrac{k}{m} x \end{cases} $$

3. Discretizzazione numerica (Metodo di Eulero)¶

Lo script utilizza il metodo di Eulero esplicito con passo temporale $\Delta t$:

$$\large a_n = -\frac{b v_n + k x_n}{m} $$$$\large v_{n+1} = v_n + a_n \Delta t $$$$\large x_{n+1} = x_n + v_n \Delta t $$

Questa procedura approssima la soluzione continua tramite un avanzamento iterativo nel tempo.

4. Condizioni iniziali¶

La simulazione parte da:

$$\large x(0) = x_0, \qquad v(0) = v_0 $$

Nel codice:

$$\large x_0 = 1, \quad v_0 = 0 $$

5. Regime dinamico¶

Il comportamento dipende dal discriminante:

$$\large b^2 - 4mk $$

Nel caso dello script:

$$\large b^2 < 4mk $$

quindi il sistema è $\textbf{sottosmorzato}$ e la soluzione analitica è:

$$\large x(t) = A e^{-\frac{b}{2m}t} \cos(\omega_d t + \phi) $$

con

$$\large \omega_d = \sqrt{\frac{k}{m} - \frac{b^2}{4m^2}} $$

6. Significato della simulazione¶

Il grafico prodotto mostra:

  • oscillazioni armoniche,
  • ampiezza che decade esponenzialmente,
  • dissipazione di energia dovuta allo smorzamento.

La simulazione numerica riproduce quindi qualitativamente la dinamica prevista dalla teoria.

In [7]:
import numpy as np
import matplotlib.pyplot as plt 

def damped_oscillator_equation(m, b, k, x0, v0, t_max, dt):
    """
    Numerical simulation of a damped harmonic oscillator.
        :param m: Mass of the oscillator.
        :param b: Damping coefficient.
        :param k: Spring constant.
        :param xO: Initial position.
        :param vO: Initial velocity.
        :param t_max: End time for simulation.
        :param dt: Time step for numerical integration.
    :return: 
        Arrays of time, position, and velocity.
    """
    # Initialize time and state variable arrays
    t_values = np.arange(0, t_max, dt)
    x_values = np.zeros_like(t_values)
    v_values = np.zeros_like(t_values)

    # Set initial conditions
    x_values[0] = x0
    v_values[0] = v0

    # Time-stepping solution using Euler's method
    i = 0
    for j in range(len(t_values)-1) :
        i += 1
        a = -(b * v_values[i-1] + k * x_values[i-1]) / m
        v_values[i] = v_values[i-1] + a * dt
        x_values[i] = x_values[i-1] + v_values[i-1] * dt

    return t_values, x_values, v_values 
    
def plot_damped_oscillator(t, x, title='Damped Harmonic Oscillator'):
    """
    Plot the position of the damped harmonic oscillator over time.
        :param t: Time array.
        :param x: Position array.
        :param title: Title for the plot.
    """
    plt.figure(figsize=(8, 3))
    plt.plot(t, x, label='Position (x)')
    plt.title(title)
    plt.xlabel('Time (s)')
    plt.ylabel('Displacement (m)')
    plt.grid()
    plt.legend()
    plt.show()
    
# Define parameters
mass = 1.0 # Mass (kg)
damping = 0.5 # Damping coefficient (Ns/m)
stiffness = 1.0 # Spring constant (N/m)
initial_position =1.0 # Initial displacement (m)
initial_velocity = 0.0 # Initial velocity (m/s)
time_end = 10.0 # Duration of simulation (s)
time_step = 0.01 # Time step (s)

# Run the simulation
time, position, velocity = damped_oscillator_equation(mass, damping, stiffness, initial_position, initial_velocity, time_end, time_step) 

# Plot the results
plot_damped_oscillator(time, position)
No description has been provided for this image
In [ ]: