Narzędzia użytkownika

Narzędzia witryny


narzedzia:pendulum_py

Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

Poprzednia rewizja po obu stronachPoprzednia wersja
Nowa wersja
Poprzednia wersja
narzedzia:pendulum_py [2025/05/07 15:33] administratornarzedzia:pendulum_py [2025/05/16 18:48] (aktualna) administrator
Linia 1: Linia 1:
-{{ :narzedzia:pednulum.gif?500 |}} +===== PY: Symulator Wahadła Podwójnego ===== 
-<code python>+ 
 +{{ :narzedzia:pednulum.gif?500 |Podwójne wahadło w akcji}} 
 + 
 + 
 +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ć, potrzebujemy dwóch rzeczy: **modelu fizycznego** (czyli równań) i **metody ich rozwiązania**.   
 +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}, y_n + \frac{h}{2}k_1\right) \\ 
 +k_3 &= f\left(t_n + \frac{h}{2}, y_n + \frac{h}{2}k_2\right) \\ 
 +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://en.wikipedia.org/wiki/Lagrangian_mechanics| Mechanika Lagrange’a (EN)]] 
 +  * [[https://pl.wikipedia.org/wiki/Chaos_deterministyczny| Wikipedia: Chaos deterministyczny]] 
 +  * [[https://en.wikipedia.org/wiki/Double_pendulum| Wikipedia: Double Pendulum]] 
 +  * [[https://myphysicslab.com/pendulum/double-pendulum-en.html| Interaktywny model online (MyPhysicsLab)]] 
 +  * [[https://www.myphysicslab.com/| MyPhysicsLab — symulacje fizyczne online]] 
 +  * [[https://demonstrations.wolfram.com/topic.html?topic=Classical+Mechanics| Wolfram Demonstrations: Classical Mechanics]] 
 +  * [[https://people.maths.ox.ac.uk/suli/numerical_analysis/| Lecture notes: Numerical Analysis, Oxford]] 
 + 
 +---- 
 + 
 +==== Kod programu ==== 
 + 
 +<code python double_pendulum.py>
 import numpy as np import numpy as np
 import matplotlib.pyplot as plt import matplotlib.pyplot as plt
narzedzia/pendulum_py.1746624803.txt.gz · ostatnio zmienione: 2025/05/07 15:33 przez administrator