Różnice między wybraną wersją a wersją aktualną.
Poprzednia rewizja po obu stronachPoprzednia wersjaNowa wersja | Poprzednia wersja | ||
narzedzia:apple_sim_py [2025/05/07 12:01] – administrator | narzedzia:apple_sim_py [2025/05/16 18:48] (aktualna) – administrator | ||
---|---|---|---|
Linia 1: | Linia 1: | ||
Skrypt do pobrania: | Skrypt do pobrania: | ||
+ | {{ : | ||
+ | {{ : | ||
+ | ====== PY: Symulacja Masy Sprężystej ====== | ||
- | ====== Symulacja Masy Sprężystej | + | Ten artykuł wyjaśnia, jak działa skrypt symulujący ruch masy sprężystej |
- | Ten artykuł wyjaśnia szczegółowo działanie interaktywnej symulacji masy poruszającej się pod wpływem grawitacji, siły wiatru, odbić i tarcia. Skrypt wykorzystuje bibliotekę **Matplotlib** oraz interfejs **Tkinter** do stworzenia graficznej symulacji i wizualizacji danych fizycznych w czasie rzeczywistym. | ||
- | ===== 1. Ustawienia początkowe i stałe fizyczne ===== | + | ---- |
- | ```python | + | ===== ⚙️ Stałe fizyczne i warunki początkowe ===== |
+ | |||
+ | < | ||
g = 9.81 # Przyspieszenie ziemskie (m/s^2) | g = 9.81 # Przyspieszenie ziemskie (m/s^2) | ||
- | m = 0.15 # Masa kulki (kg) | + | m = 0.15 # Masa piłki |
- | restitution = 0.7 # Współczynnik sprężystości | + | restitution = 0.7 # Współczynnik sprężystości (odbicia) |
- | time_step = 0.05 # Krok czasowy | + | |
friction_coefficient = 0.5 # Współczynnik tarcia | friction_coefficient = 0.5 # Współczynnik tarcia | ||
- | ``` | + | </ |
- | Podstawowe | + | Używamy podstawowych |
- | **Współczynnik sprężystości** odpowiada za sposób odbicia od podłoża: | + | |
+ | | ||
- | $$ | ||
- | v_{\text{po odbiciu}} = -v_{\text{przed odbiciem}} \cdot \text{restitution} | ||
- | $$ | ||
- | ===== 2. Równania ruchu ===== | + | ---- |
+ | |||
+ | ===== 🧮 Obliczenia sił i przyspieszeń | ||
+ | |||
+ | ==== Kod: ==== | ||
+ | |||
+ | <code python> | ||
+ | Fw = wind_force | ||
+ | ax_acc = Fw / m | ||
+ | ay_acc = -g | ||
+ | </ | ||
- | ```python | + | Zgodnie z II zasadą dynamiki Newtona: |
- | ax_acc = Fw / m # Przyspieszenie poziome od wiatru | + | |
- | ay_acc = -g # Przyspieszenie pionowe (grawitacja) | + | |
+ | * Siła wiatru generuje przyspieszenie poziome: $$ a_x = \frac{F_{\text{wiatr}}}{m} $$ | ||
+ | * Przyspieszenie pionowe jest równe przyspieszeniu ziemskiemu: $$ a_y = -g $$ | ||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | ===== 🧠 Kinematyka ruchu ===== | ||
+ | |||
+ | <code python> | ||
vx += ax_acc * time_step | vx += ax_acc * time_step | ||
vy += ay_acc * time_step | vy += ay_acc * time_step | ||
- | |||
x += vx * time_step + 0.5 * ax_acc * time_step**2 | x += vx * time_step + 0.5 * ax_acc * time_step**2 | ||
y += vy * time_step + 0.5 * ay_acc * time_step**2 | y += vy * time_step + 0.5 * ay_acc * time_step**2 | ||
- | ``` | + | </ |
- | Tutaj zastosowano klasyczne równania | + | Używamy podstawowych równań |
$$ | $$ | ||
- | a_x = \frac{F_{\text{wiatr}}}{m}, \quad a_y = -g | + | v = v_0 + a \cdot \Delta t \\ |
+ | s = s_0 + v \cdot \Delta t + \frac{1}{2} a \cdot \Delta t^2 | ||
$$ | $$ | ||
- | $$ | ||
- | v = v_0 + a \cdot \Delta t | ||
- | $$ | ||
- | $$ | + | ---- |
- | x = x_0 + v \cdot \Delta t + \frac{1}{2} a \cdot \Delta t^2 | + | |
- | $$ | + | |
- | ===== 3. Odbicia | + | ===== 🪨 Odbicie od ziemi i tarcie ===== |
- | ```python | + | < |
if y <= y_min: | if y <= y_min: | ||
- | y = y_min | ||
vy = -vy * restitution | vy = -vy * restitution | ||
if abs(vy) < 0.5: | if abs(vy) < 0.5: | ||
- | | + | |
- | ... | + | </ |
- | ``` | + | |
- | Gdy kulka uderza o ziemię, odwracana jest pionowa składowa prędkości i zmniejszana zgodnie z: | + | Siła tarcia kinetycznego: |
$$ | $$ | ||
- | v_y' | + | F_{\text{tarcia}} |
+ | a_{\text{tarcia}} = \frac{F_{\text{tarcia}}}{m} = \mu \cdot g | ||
$$ | $$ | ||
- | Jeśli prędkość pionowa jest mała, działa **tarcie kinetyczne**: | ||
- | $$ | + | ---- |
- | F_{\text{tarcie}} = \mu \cdot m \cdot g | + | |
- | $$ | + | |
- | Co daje przyspieszenie hamujące: | + | ===== 📈 Wektory sił i wykresy ===== |
- | $$ | + | Kod rysuje wektory: |
- | a_{\text{tarcie}} = \mu \cdot g | + | |
- | $$ | + | |
- | ===== 4. Wizualizacja sił wektorowych ===== | + | * Grawitacji – zawsze w dół |
+ | * Wiatru – poziomo | ||
+ | * Prędkości – dynamicznie | ||
- | ```python | + | < |
- | g_vector = draw_arrow(x, | + | draw_arrow(x, |
- | wind_vector = draw_arrow(x, | + | </ |
- | resultant_vector = draw_arrow(x, | + | |
- | ``` | + | |
- | Strzałki reprezentują: | ||
- | * siłę grawitacji – zawsze skierowaną w dół, | ||
- | * siłę wiatru – poziomą, | ||
- | * wektor prędkości – skalowaną wartość prędkości całkowitej. | ||
- | Każdy wektor może być analizowany za pomocą równań składowych lub w zapisie biegunowym: | + | ---- |
- | $$ | + | ===== 🧭 Wektory na wykresie biegunowym ===== |
- | |\vec{v}| | + | |
- | $$ | + | <code python> |
+ | draw_polar_arrow(polar_ax, angle, magnitude, color) | ||
+ | </ | ||
- | ===== 5. Wykresy dodatkowe ===== | + | Ten fragment przelicza wartości sił i prędkości do współrzędnych biegunowych. Dzięki temu użytkownik może obserwować ich kierunki i względne wartości. |
- | Dwa dodatkowe wykresy pokazują zmiany wartości w czasie: | ||
- | * prędkość całkowita: \( v = \sqrt{v_x^2 + v_y^2} \) | ||
- | * przyspieszenie całkowite: \( a = \sqrt{a_x^2 + a_y^2} \) | ||
- | ```python | + | ---- |
- | line_speed.set_data(time_list, | + | |
- | line_acc.set_data(time_list, | + | |
- | ``` | + | |
- | ===== 6. Wykres biegunowy | + | ===== 📊 Wykresy prędkości i przyspieszenia |
- | ```python | + | < |
- | draw_polar_arrow(polar_ax, gravity_angle, | + | current_speed = np.sqrt(vx**2 + vy**2) |
- | draw_polar_arrow(polar_ax, wind_angle, wind_magnitude, | + | net_acc = np.sqrt(ax_acc**2 + ay_acc**2) |
- | draw_polar_arrow(polar_ax, | + | </ |
- | ``` | + | |
- | Wykres biegunowy przedstawia kierunki i wartości wektorów sił oraz prędkości. | + | Wartości te są dodawane do list i rysowane w czasie rzeczywistym. |
- | Zastosowanie układu biegunowego ułatwia analizę zależności kierunkowych między siłami i ruchem. | ||
- | ===== 7. Interfejs GUI ===== | + | ---- |
- | ```python | + | ===== 🧵 Podsumowanie ===== |
- | wind_slider | + | |
- | spring_slider | + | |
- | ``` | + | |
- | GUI umożliwia użytkownikowi interaktywne sterowanie: | + | Ten skrypt to przykład dynamicznej symulacji ruchu w dwuwymiarowym polu sił, uwzględniającej: |
- | * **siłą wiatru** (od -2 do 2 N), | + | |
- | * **współczynnikiem sprężystości** (od 0 do 1), | + | |
- | * restartowaniem symulacji. | + | |
- | ===== 8. Podsumowanie ===== | + | * Grawitację |
+ | * Wiatr jako siłę zewnętrzną | ||
+ | * Sprężystość przy zderzeniu z podłożem | ||
+ | * Tarcie dynamiczne przy niskiej prędkości | ||
- | Symulacja umożliwia dynamiczną analizę ruchu ciała | + | Dzięki interfejsowi graficznemu użytkownik może manipulować parametrami i obserwować efekty fizyczne |
- | * II zasada dynamiki Newtona: \( \vec{F} = m \vec{a} \) | ||
- | * Zasady kinematyki dla ruchu jednostajnie zmiennego | ||
- | * Prawo odbicia i tarcia dynamicznego | ||
- | Kod stanowi przykład połączenia **symulacji fizycznej**, | ||