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