2026. június 13., szombat

A csillapodó rezgőmozgás modellezése

 A program kiszámítja a fizikai modellt, majd kirajzolja a rezgés grafikonját és egy animációt is készít, amellyel látványosan szimulálható a folyamat.
Fizikai modell: A program a rugóállandó (k), a tömeg (m) és a csillapítás (b) alapján kiszámítja a rezgés lecsengését.
Kijelző (Felső grafikon): Megmutatja a kitérés amplitúdójának csökkenését az idő múlásával.


----------------------

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

# --- Fizikai paraméterek ---
m = 1.0          # Tömeg (kg)
k = 20.0         # Rugóállandó (N/m)
b = 0.5          # Csillapítási tényező (kg/s)

x0 = 2.0         # Kezdő kitérés (m)
v0 = 0.0         # Kezdősebesség (m/s)

omega0 = np.sqrt(k / m)      # Sajátfrekvencia
beta = b / (2 * m)           # Csillapítási tényező

# --- Időintervallum ---
t_max = 15.0
dt = 0.05
t = np.arange(0, t_max, dt)

# --- Analitikus megoldás (Kitérés az idő függvényében) ---
if beta < omega0:
    # Alulcsillapított eset (szép rezgés, ami fokozatosan csökken)
    omega_d = np.sqrt(omega0**2 - beta**2)
    x = x0 * np.exp(-beta * t) * (np.cos(omega_d * t) + (beta / omega_d) * np.sin(omega_d * t))
else:
    # Túlcsillapított vagy kritikus eset (nincs lengés, csak visszatérés)
    x = x0 * np.exp(-beta * t) # Egyszerűsített lecsengés

# --- Statikus grafikon előkészítése ---
fig, (ax_plot, ax_anim) = plt.subplots(2, 1, figsize=(10, 8))
fig.suptitle("Csillapodó rezgőmozgás szimulációja", fontsize=14)

ax_plot.plot(t, x, label='Kitérés $x(t)$', color='blue')
ax_plot.set_title("Kitérés időbeli lefutása")
ax_plot.set_xlabel("Idő (s)")
ax_plot.set_ylabel("Kitérés (m)")
ax_plot.grid(True, linestyle='--')
ax_plot.legend()

# --- Animáció előkészítése ---
ax_anim.set_xlim(-x0 - 0.5, x0 + 0.5)
ax_anim.set_ylim(-1, 1)
ax_anim.set_title("Rezgő test animációja")
ax_anim.set_yticks([])
ax_anim.grid(axis='x', linestyle='--')

# A rugót és a tömeget jelző elemek
line, = ax_anim.plot([], [], color='gray', lw=2)  # Rugó
patch, = ax_anim.plot([], [], 's', color='red', markersize=30) # Tömeg

def init():
    line.set_data([], [])
    patch.set_data([], [])
    return line, patch

def update(frame):
    # A rugó cikkcakkjának pontjai
    spring_x = np.linspace(0, x[frame], 20)
    spring_y = np.linspace(0, 0, 20)
    
    line.set_data(spring_x, spring_y)
    patch.set_data(x[frame], 0)
    return line, patch

ani = FuncAnimation(fig, update, frames=len(t), init_func=init, interval=dt*1000, blit=True, repeat=True)

plt.tight_layout()
plt.show()
--------------
** Process exited - Return Code: 0 **
https://www.online-python.com/pyodide

Nincsenek megjegyzések:

Megjegyzés küldése