Różnice między wybraną wersją a wersją aktualną.
Nowa wersja | Poprzednia wersja | ||
narzedzia:apple_sim_py [2025/05/07 11:55] – created administrator | narzedzia:apple_sim_py [2025/05/16 18:48] (aktualna) – administrator | ||
---|---|---|---|
Linia 1: | Linia 1: | ||
- | \====== Symulacja Masy Sprężystej z Użyciem Tkinter i Matplotlib ====== | + | Skrypt do pobrania: |
+ | {{ : | ||
- | Ten artykuł wyjaśnia działanie interaktywnej symulacji fizycznej przedstawiającej spadającą kulę, uwzględniającej siły takie jak grawitacja, tarcie i wiatr. Symulacja ta została zaimplementowana w Pythonie z użyciem bibliotek **Tkinter** i **Matplotlib**. Omówimy jej działanie, wspierając się wzorami fizycznymi oraz blokami kodu. | + | {{ : |
- | \===== Koncepcja Fizyczna | + | ====== PY: Symulacja Masy Sprężystej ====== |
- | Symulowana jest cząstka o masie \$m = 0.15\$ kg poruszająca się w dwuwymiarowej przestrzeni | + | Ten artykuł wyjaśnia, jak działa skrypt symulujący ruch masy sprężystej |
- | * siły ciążenia: | ||
- | $$ | + | ---- |
- | F_g = m \cdot g | + | |
- | $$ | + | |
- | * siły wiatru (stała, zadawana suwakiem): | + | ===== ⚙️ Stałe fizyczne i warunki początkowe ===== |
- | $$ | + | <code python> |
- | F_w = \text{stała} \in \langle -2, 2 \rangle \ \text{[N]} | + | g = 9.81 # Przyspieszenie ziemskie (m/s^2) |
- | $$ | + | m = 0.15 # Masa piłki (kg) |
+ | restitution = 0.7 # Współczynnik sprężystości (odbicia) | ||
+ | friction_coefficient = 0.5 # Współczynnik tarcia | ||
+ | </ | ||
- | * siły tarcia (działającej przy kontakcie | + | Używamy podstawowych stałych z fizyki: |
- | $$ | + | * Siła grawitacji: ( F_g = m g ) |
- | F_t = \mu \cdot m \cdot g | + | * Odbicie piłki od ziemi następuje z redukcją prędkości pionowej przez współczynnik sprężystości: |
- | $$ | + | |
- | Ruch cząstki opisany jest przez drugą zasadę dynamiki Newtona: | ||
- | $$ | + | ---- |
- | \vec{a} = \frac{\vec{F}}{m} | + | |
- | $$ | + | |
- | \===== Inicjalizacja Symulacji | + | ===== 🧮 Obliczenia sił i przyspieszeń |
+ | |||
+ | ==== Kod: ==== | ||
<code python> | <code python> | ||
- | def reset_simulation(): | + | Fw = wind_force |
- | global x, y, vx, vy, trace, sim_time, time_list, speed_list, acc_list | + | ax_acc |
- | x, y = 0, 30 # Start higher in the bigger graph | + | ay_acc |
- | vx, vy = 0, 0 # Reset velocities | + | |
- | trace = [] # Reset trace | + | |
- | sim_time = 0.0 | + | |
- | time_list | + | |
- | | + | |
- | | + | |
</ | </ | ||
- | Tutaj ustalamy początkowe warunki: kulka znajduje się na wysokości 30 m i nie porusza się (zerowe prędkości). Resetowane są także listy do wykresów czasowych. | + | Zgodnie z II zasadą dynamiki Newtona: |
- | \===== Obliczenia Dynamiki Ruchu ===== | + | * Siła wiatru generuje przyspieszenie poziome: $$ a_x = \frac{F_{\text{wiatr}}}{m} $$ |
+ | * Przyspieszenie pionowe jest równe przyspieszeniu ziemskiemu: $$ a_y = -g $$ | ||
- | <code python> | ||
- | ax_acc = Fw / m # Horizontal acceleration due to wind | ||
- | ay_acc = -g # Vertical acceleration (gravity) | ||
- | vx += ax\_acc \* time\_step | + | ---- |
- | vy += ay\_acc \* time\_step | + | |
- | x += vx \* time\_step + 0.5 \* ax\_acc \* time\_step**2 | + | ===== 🧠 Kinematyka ruchu ===== |
- | y += vy \* time\_step + 0.5 \* ay\_acc \* time\_step**2 </ | + | |
- | Przy każdym kroku czasowym obliczane są przyspieszenia ze wzoru: | + | <code python> |
+ | vx += ax_acc * time_step | ||
+ | vy += ay_acc * time_step | ||
+ | x += vx * time_step + 0.5 * ax_acc * time_step**2 | ||
+ | y += vy * time_step + 0.5 * ay_acc * time_step**2 | ||
+ | </ | ||
+ | |||
+ | Używamy podstawowych równań kinematyki: | ||
$$ | $$ | ||
- | a_x = \frac{F_w}{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 | ||
$$ | $$ | ||
- | Po czym aktualizujemy prędkości i pozycje na podstawie równań ruchu: | ||
- | $$ | + | ---- |
- | \vec{v}_{t+\Delta t} = \vec{v}_t + \vec{a} \cdot \Delta t | + | |
- | $$ | + | |
- | + | ||
- | $$ | + | |
- | \vec{r}_{t+\Delta t} = \vec{r}_t + \vec{v} \cdot \Delta t + \frac{1}{2} \vec{a} \cdot \Delta t^2 | + | |
- | $$ | + | |
- | \===== Odbicia | + | ===== 🪨 Odbicie od ziemi i tarcie |
<code python> | <code python> | ||
if y <= y_min: | if y <= y_min: | ||
- | y = y_min | ||
vy = -vy * restitution | vy = -vy * restitution | ||
- | ... | + | |
- | | + | vx -= \dots \text{(siła tarcia)} |
</ | </ | ||
- | Kiedy kulka uderza w ziemię, następuje odbicie ze współczynnikiem sprężystości (domyślnie 0.7): | + | Siła tarcia kinetycznego: |
$$ | $$ | ||
- | v_y \rightarrow -v_y \cdot e | + | F_{\text{tarcia}} = \mu \cdot m \cdot g \\ |
+ | a_{\text{tarcia}} = \frac{F_{\text{tarcia}}}{m} = \mu \cdot g | ||
$$ | $$ | ||
- | Jeśli prędkość pionowa jest niska, dodawane jest przyspieszenie tarcia, redukujące prędkość poziomą: | ||
- | $$ | + | ---- |
- | a_{\text{tarcie}} = \mu \cdot g | + | |
- | $$ | + | |
- | \===== Wektory | + | ===== 📈 Wektory |
- | Symulacja przedstawia | + | Kod rysuje |
+ | |||
+ | * Grawitacji – zawsze w dół | ||
+ | * Wiatru – poziomo | ||
+ | * Prędkości | ||
<code python> | <code python> | ||
- | draw_arrow(x, | + | draw_arrow(x, |
- | ...</ | + | </ |
+ | |||
+ | |||
+ | ---- | ||
- | Dodatkowo, rysowane są na wykresie biegunowym | + | ===== 🧭 Wektory |
<code python> | <code python> | ||
- | draw_polar_arrow(polar_ax, | + | draw_polar_arrow(polar_ax, |
</ | </ | ||
- | Wartości te są konwertowane na postać biegunową: | + | 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. |
- | $$ | ||
- | \theta = \arctan2(v_y, | ||
- | $$ | ||
- | \===== Wykresy | + | ---- |
+ | |||
+ | ===== 📊 Wykresy | ||
<code python> | <code python> | ||
- | line_speed.set_data(time_list, speed_list) | + | current_speed = np.sqrt(vx**2 + vy**2) |
- | line_acc.set_data(time_list, acc_list) | + | net_acc = np.sqrt(ax_acc**2 + ay_acc**2) |
</ | </ | ||
- | Podczas symulacji zapisywana jest prędkość: | + | Wartości te są dodawane do list i rysowane w czasie rzeczywistym. |
- | $$ | ||
- | |ec{v}| = \sqrt{v_x^2 + v_y^2} | ||
- | $$ | ||
- | i wartość przyspieszenia: | + | ---- |
- | $$ | + | ===== 🧵 Podsumowanie ===== |
- | |\vec{a}| | + | |
- | $$ | + | |
- | Są one rysowane | + | Ten skrypt to przykład dynamicznej symulacji ruchu w dwuwymiarowym polu sił, uwzględniającej: |
- | \===== Interfejs Użytkownika ===== | + | * Grawitację |
+ | * Wiatr jako siłę zewnętrzną | ||
+ | * Sprężystość przy zderzeniu z podłożem | ||
+ | * Tarcie dynamiczne przy niskiej prędkości | ||
- | Tkinter obsługuje: | + | Dzięki interfejsowi graficznemu użytkownik może manipulować parametrami i obserwować efekty fizyczne w czasie rzeczywistym. |
- | * suwaki do zmiany siły wiatru i współczynnika sprężystości | ||
- | * przycisk resetu symulacji | ||
- | * pole tekstowe z informacjami w czasie rzeczywistym | ||
- | |||
- | <code python> | ||
- | wind_slider = tk.Scale(...) | ||
- | spring_slider = tk.Scale(...) | ||
- | </ | ||
- | \===== Podsumowanie ===== | ||
- | Symulacja w przystępny sposób ukazuje podstawowe zjawiska fizyczne takie jak siła ciążenia, tarcie, odbicia i ruch z siłą zewnętrzną. Wykorzystuje do tego animację, wykresy i reprezentacje wektorowe. Kod można łatwo rozbudować o dodatkowe efekty fizyczne lub rozszerzyć na inne układy mechaniczne. | ||