Różnice między wybraną wersją a wersją aktualną.
Poprzednia rewizja po obu stronachPoprzednia wersjaNowa wersja | Poprzednia wersja | ||
narzedzia:pendulum_py [2025/05/07 15:33] – administrator | narzedzia:pendulum_py [2025/05/16 18:48] (aktualna) – administrator | ||
---|---|---|---|
Linia 1: | Linia 1: | ||
- | {{ : | + | ===== PY: Symulator Wahadła Podwójnego ===== |
- | <code python> | + | |
+ | {{ : | ||
+ | |||
+ | |||
+ | To nie jest zwykłe wahadło — to **wahadło podwójne** (ang. _double pendulum_), jeden z najprostszych układów fizycznych pokazujących zjawisko **deterministycznego chaosu**. | ||
+ | Dwa ramiona, dwie masy, grawitacja — a efekt to piękny, nieprzewidywalny taniec, w którym drobna zmiana kąta startowego potrafi całkowicie zmienić przyszły ruch. | ||
+ | |||
+ | === Co tu się właściwie dzieje? === | ||
+ | |||
+ | Układ składa się z dwóch punktowych mas zawieszonych na nierozciągliwych prętach. Ruch opisuje się czterema zmiennymi: | ||
+ | * \( \theta_1 \) – kąt pierwszego ramienia względem pionu, | ||
+ | * \( \theta_2 \) – kąt drugiego ramienia względem pionu, | ||
+ | * \( \omega_1 = \dot{\theta}_1 \) – prędkość kątowa pierwszego wahadła, | ||
+ | * \( \omega_2 = \dot{\theta}_2 \) – prędkość kątowa drugiego wahadła. | ||
+ | |||
+ | Równania ruchu pochodzą z zasad dynamiki Newtona albo bezpośrednio z mechaniki Lagrange’a: | ||
+ | |||
+ | %% | ||
+ | \begin{align*} | ||
+ | \delta &= \theta_2 - \theta_1 \\ | ||
+ | \ddot{\theta}_1 &= \frac{m_2 l_1 \omega_1^2 \sin\delta \cos\delta + m_2 g \sin\theta_2 \cos\delta + m_2 l_2 \omega_2^2 \sin\delta - (m_1 + m_2) g \sin\theta_1}{(m_1 + m_2) l_1 - m_2 l_1 \cos^2\delta} \\ | ||
+ | \ddot{\theta}_2 &= \frac{-(m_1 + m_2) l_1 \omega_1^2 \sin\delta + (m_1 + m_2) g \sin\theta_1 \cos\delta - m_2 l_2 \omega_2^2 \sin\delta \cos\delta - (m_1 + m_2) g \sin\theta_2}{\left( \frac{l_2}{l_1} \right)((m_1 + m_2) l_1 - m_2 l_1 \cos^2\delta)} | ||
+ | \end{align*} | ||
+ | %% | ||
+ | |||
+ | Wygląda dziko? Tak właśnie wygląda fizyka nieliniowa :) | ||
+ | |||
+ | Ruch symulowany jest numerycznie (metodą Rungego-Kutty) i animowany z pomocą biblioteki **matplotlib** w Pythonie. Kod pozwala interaktywnie zmieniać: | ||
+ | |||
+ | - masy obu odważników, | ||
+ | |||
+ | - długości ramion, | ||
+ | |||
+ | - kąty początkowe. | ||
+ | |||
+ | Każde kliknięcie to nowy dziwny świat trajektorii. | ||
+ | |||
+ | ===== Matematyczne zaplecze: Runge-Kutta i mechanika Lagrange’a ===== | ||
+ | |||
+ | Zanim komputer może cokolwiek zasymulować, | ||
+ | Dla naszego podwójnego wahadła: | ||
+ | |||
+ | - model opisuje **mechanika Lagrange’a**, | ||
+ | - rozwiązanie daje **metoda Rungego-Kutty 4. rzędu (RK4)**. | ||
+ | |||
+ | ---- | ||
+ | |||
+ | === Mechanika Lagrange’a === | ||
+ | |||
+ | Zamiast klasycznych sił z II zasady Newtona, Lagrange korzysta z zasad energii. Wprowadzamy funkcję **Lagrangian**: | ||
+ | |||
+ | $$ | ||
+ | L = T - V | ||
+ | $$ | ||
+ | |||
+ | Gdzie: | ||
+ | - $T$ — energia kinetyczna, | ||
+ | - $V$ — energia potencjalna. | ||
+ | |||
+ | Dla układu o współrzędnych uogólnionych $q_i$, równania ruchu wyprowadza się z tzw. **równań Lagrange’a**: | ||
+ | |||
+ | $$ | ||
+ | \frac{d}{dt} \left( \frac{\partial L}{\partial \dot{q}_i} \right) - \frac{\partial L}{\partial q_i} = 0 | ||
+ | $$ | ||
+ | |||
+ | W naszym przypadku: $q_1 = \theta_1$, $q_2 = \theta_2$ — kąty ramion. | ||
+ | |||
+ | Energie układu wyrażają się następująco: | ||
+ | |||
+ | - Energia kinetyczna: | ||
+ | |||
+ | $$ | ||
+ | T = \frac{1}{2} m_1 l_1^2 \dot{\theta}_1^2 + \frac{1}{2} m_2 \left[ l_1^2 \dot{\theta}_1^2 + l_2^2 \dot{\theta}_2^2 + 2 l_1 l_2 \dot{\theta}_1 \dot{\theta}_2 \cos(\theta_1 - \theta_2) \right] | ||
+ | $$ | ||
+ | |||
+ | - Energia potencjalna (w polu grawitacyjnym): | ||
+ | |||
+ | $$ | ||
+ | V = - (m_1 + m_2) g l_1 \cos\theta_1 - m_2 g l_2 \cos\theta_2 | ||
+ | $$ | ||
+ | |||
+ | Podstawiamy do $L = T - V$, a następnie wstawiamy do równań Lagrange’a. W efekcie otrzymujemy dwa nieliniowe równania różniczkowe drugiego rzędu, które potem przekształcamy do układu równań pierwszego rzędu. | ||
+ | |||
+ | ---- | ||
+ | |||
+ | === Metoda Rungego-Kutty 4. rzędu (RK4) === | ||
+ | |||
+ | Metoda RK4 pozwala numerycznie rozwiązać układ równań różniczkowych pierwszego rzędu: | ||
+ | |||
+ | $$ | ||
+ | \dot{y} = f(t, y), \quad y(t_0) = y_0 | ||
+ | $$ | ||
+ | |||
+ | Aby znaleźć $y_{n+1}$ w punkcie $t_{n+1} = t_n + h$, obliczamy: | ||
+ | |||
+ | $$ | ||
+ | \begin{aligned} | ||
+ | k_1 &= f(t_n, y_n) \\ | ||
+ | k_2 &= f\left(t_n + \frac{h}{2}, | ||
+ | k_3 &= f\left(t_n + \frac{h}{2}, | ||
+ | k_4 &= f(t_n + h, y_n + h k_3) \\ | ||
+ | y_{n+1} &= y_n + \frac{h}{6}(k_1 + 2k_2 + 2k_3 + k_4) | ||
+ | \end{aligned} | ||
+ | $$ | ||
+ | |||
+ | To uśrednienie czterech oszacowań zmian stanu. Daje to dokładność lokalną rzędu $\mathcal{O}(h^5)$ i globalną rzędu $\mathcal{O}(h^4)$. | ||
+ | |||
+ | W naszym kodzie użyto `solve_ivp()` z biblioteki `scipy`, która domyślnie używa wersji **RK45** — adaptacyjnej metody z kontrolą błędu i dynamicznym doborem kroku. | ||
+ | |||
+ | ---- | ||
+ | |||
+ | === Dlaczego to działa === | ||
+ | |||
+ | Układ, który modelujemy: | ||
+ | - jest **nieliniowy** (kąty i ich pochodne pojawiają się w funkcjach trygonometrycznych), | ||
+ | - wykazuje **chaotyczne zachowanie** (olbrzymia wrażliwość na warunki początkowe), | ||
+ | - **nie ma rozwiązań analitycznych** — tylko symulacja numeryczna pozwala go przeanalizować. | ||
+ | |||
+ | Mechanika Lagrange’a pozwala zbudować poprawny fizycznie model oparty o zasady zachowania, a metoda Rungego-Kutty pozwala ten model **skutecznie i dokładnie zasymulować** na komputerze. | ||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | === Linki dla ciekawskich === | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | |||
+ | ---- | ||
+ | |||
+ | ==== Kod programu ==== | ||
+ | |||
+ | <code python | ||
import numpy as np | import numpy as np | ||
import matplotlib.pyplot as plt | import matplotlib.pyplot as plt |