Szereg Taylora — Praktycznie
Rozwijanie funkcji w szereg Taylora to chleb powszedni dla fizyków teoretyków. Tymczasem, umiejętność rozwinięcia funkcji w szereg przydaje się też w numeryce, w szczególności w symulacjach komputerowych. W tym krótkim artykule opiszę jak rozwijać funkcje w szereg. Oczywiście zrobię to tak jak lubię — praktycznie. Pokażę też co z tego wynika dla symulacji komputerowych. Wprowadzę też metodę Eulera jako przykład praktycznej aplikacji.
Mój nowy projekt (2021) — Koder na Strychu — programowanie C++, modelowanie, symulacje: https://www.youtube.com/c/KodernaStrychu/
🎶 Koder Na Discordzie: https://discord.gg/amfQubtPkn
👓 Kody na GitHub: https://github.com/maciejmatyka/Niniejszy artykuł jest częścią materiałów przygotowywanych na potrzeby kursu Modelowania Fizycznego w Animacji Komputerowej przygotowywanego dla kierunku Informatyki Stosowanej i Systemów Pomiarowych na Wydziale Fizyki i Astronomii Uniwersytetu Wrocławskiego.
(2020–11) Właśnie nagrałem dwie części wykładu (YouTube) opartego na tym artykule:
część 1: Co to jest Szereg Taylora? — https://youtu.be/WEc9daKnsSQ
część 2: Całkowanie numeryczne. — https://youtu.be/1zmYi2aWiMY
Teoria
Szereg Taylora to wielomian, który przybliża naszą funkcję w bliskim otoczeniu. Tylko tyle i aż tyle, bo za tym prostym stwierdzeniem stoi cały aparat matematyczny związany z pochodnymi, szeregami, nieskończonością itp. itd. Ważne jest, aby zrozumieć, że przybliżenie to dotyczy dowolnego punktu x, a nie tylko jednego konkretnego i wyróżnionego punktu. Czyli wzór, który normalnie widzimy w książkach jest bardzo ogólny i opisuje funkcję jako całość.
Podaję wzór z którym będziemy pracować (Wikipedia):
Praktyka
Przybliżymy teraz funkcję z użyciem szeregu Taylora. Przykładową funkcją niech będzie coś prostego, ale ładnego —na przykład funkcja sinus z wygaszeniem: f(x) = sin(x)*exp(-x)
Funkcja jest narysowana po lewej stronie.
Kolejne pochodne funkcji będą potrzebne do rozwinięcia w szereg. Ograniczymy się do dwóch wyrazów, użyjemy pakietu Mathematica [1,2].
Pierwsza pochodna — f ’(x) = e^(-x) (cos(x) — sin(x))
Druga pochodna — f ’’(x) = -2 e^(-x) cos(x)
Możemy teraz zapisać rozwinięcie w szereg wokoło x=π dla jednego wyrazu:
- ft1(x) = f(pi) + (x-π)*f ’(π)
rozwinięcie w szereg wokoło x=π dla dwóch wyrazów
- ft2(x) = f(pi) + (x-π)*f ’(π) + (x-π)²/2*f ’’(π)
To można kontynuować dalej, jaki wpływ ma to na wyniki przybliżenia — spójrz do sekcji wyniki.
Wyniki
Przedstawiam kolejne przybliżenia funkcji f(x) z użyciem szeregu Taylora. Takie coś łatwo wykonać korzystając z Wolfram Alpha do różniczkowania i z GnuPlot-a do rysowania funkcji. Polecam, aby wykonać to ćwiczenie samodzielnie. To jedyny sposób aby naprawdę zrozumieć o co chodzi.
Przybliżenie funkcji f(x) szeregiem Taylora wokoło punktu x=π dla jednego wyrazu szeregu.
Przybliżenie funkcji f(x) szeregiem Taylora wokoło punktu x=π dla dwóch wyrazów szeregu:
Okazuje się, że “bliskie otoczenie” wcale nie musi być takie bliskie, przybliżenie Taylora naszej funkcji do 5-go wyrazu szeregu daje naprawdę świetną zgodność:
Aby wyznaczyć powyższe przybliżenie należy wyznaczyć kolejne pochodne (my pokazaliśmy tylko do 5-go wyrazu), a następnie wyliczyć kolejne 5 wyrazów szeregu wg podanego wzoru, co pozostawiam czytelnikom jako ćwiczenie. W ogóle polecam zrobić sobie całą tą analizę samodzielnie dla własnej, wybranej funkcji…
Po co to wszystko?
Załóżmy, że znamy wartość funkcji w jakimś specyficznym punkcie. Niech to będzie pozycja piłki odbijającej się od Ziemii. Jeśli znamy jej pozycję i jej pochodną (czyli prędkość) w danej chwili możemy przybliżyć jej kolejną pozycję (lub poprzednią) z użyciem rozwinięcia w szereg, czyli sprowadzić wzór analityczny opisujący tor ruchu do uproszczonego wzoru opisującego jego kolejny ruch. To niesamowite, że w fizyka zagadnienia tak mocno związana jest z matematyką, tzn. istnienie pochodnej położenia w zasadzie obliguje nas do użycia rozwinięcia w szereg. Stąd dzieli nas już tylko krok od najbardziej podstawowej metody całkowania — metody liniowej Eulera.
Niech funkcja położenia piłki oznaczona jest jako p(t), czyli położenie w czasie. Nie musimy znać jej jawnej postaci, bo z fizyki wiemy, że pierwsza pochodna to prędkość (v), a druga pochodna to przyspieszenie (tu będzie ono stałe i będzie to grawitacja g).
Jeśli czas jest dyskretny, czyli różnica między dwoma krokami wynosi t1-t0=dt, możemy rozwinąć położenie wokoło punktu t0 po to, aby wykonać krok symulacji. Zgodnie z naszymi oznaczeniami niech a=t0, x=t0+dt, wtedy rozwinięcie wokoło punktu t0 wynosi [3]:
p(t1)=p(t0+dt)=p(t0) + dt * p’ (t0) + dt² * p’’ (t0)
Podstawiając nasze wzory fizyczne:
p ’ (t0) = v(t0)
p ’’ (t0) = g
Dostajemy wzór na przyspieszenie ruch piłki w polu grawitacyjnym:
p(t0+dt) = p(t0) + v*dt + g*dt²/2
Niesamowite jest to, że ze względu na fizykę zagadnienia, przybliżony szereg Taylora stał się dokładnym rozwiązaniem tego zagadnienia.
Metoda Eulera
Metoda Eulera jest najprostszą metodą pozwalającą na numeryczne całkowanie równań ruchu. Jest to metoda pierwszego rzędu, czyli taka, która przybliża szukane rozwiązanie w sposób liniowy. Spójrz na Rysunek 1 — on właśnie pokazuje jak słabe jest to przybliżenie! Dlaczego zatem się nią zajmujemy? Bo w praktyce często nawet tak słabe przybliżenie jest wystarczające i z pomocą tej prostej metody możemy wykonać swoje pierwsze symulacje.
Zagadnieniem, które chcemy rozwiązać jest rozwiązanie równania ruchu dla piłki w polu grawitacyjnym. Zagadnienie chcemy rozwiązać numerycznie, bo piłka będzie się np. odbijać od podłoża, czego nie opisze nasz prosty wzór analityczny. Dodatnie dodatkowych sił (np. oporu, sprężyn) dla piłki też będzie możliwe tylko numerycznie.
Naszym równaniem ruchu będzie:
d²y/dt² = g
Równanie to najpierw “przygotujemy” matematycznie, czyli rozbijemy na dwa równania 1-go rzędu:
- y’ = dy/dt = v (prędkość)
- v’ = dv/dt = g (przyspieszenie, masa = 1 i przyjęliśmy F=g)
Nasza procedura jest krokowa, znając rozwiązanie w czasie t0 chcemy znaleźć rozwiązanie w czasie t1=t0+dt. Dlatego rozwiniemy teraz prędkość w szereg Taylora z dokładnością do drugiego wyrazu wokoło t1:
- v(t0+dt)=v(t0) + v’ * dt =v(t0) + g * dt
Podobnie rozwinąć możemy położenie y. Tu zastosujemy rozwinięcie do 1-go wyrazu szeregu Taylora:
- y(t0+dt) = y(t0) + y’(t0) * dt = y(t0)+v(t0)*dt
Z tego rozwinięcia możemy wyznaczyć naszą pochodną z dokładnością do 1-go wyraz rozwinięcia w szereg:
- y’ = y(t0+dt)-y(t0) / dt
Kompletny algorytm dla numeryczny dla symulacji z użyciem metody Eulera będzie wyglądał następująco:
- Inicjalizuj pozycję y(0) i prędkość v(0)
- Pętla obliczeniowa:
- y=y+v*dt
- v=v+g*dt
- Jeśli y < 0 wykonaj v= -v (odbicie)
- Narysuj piłkę.
- Wróć do punktu 2.
Zauważ, że algorytm jest bardzo prosty.
Zauważ, że w punkcie 5. wykonaliśmy bardzo uproszczoną procedurę obsługi kolizji, która nie jest dokładna. Na tą chwilę nam ona jednak wystarczy.
Poniżej aplikacja w HTML5, która realizuje powyższy algorytm dla piłki odbijającej się od podłoża (https://jsfiddle.net/64tcxenm/6/)
Zadania do samodzielnego wykonania
- Wykonaj przybliżenie dla 1,2 i 5 wyrazów dla dowolnej (innej niż w tym artykule) funkcji.
- Do powyższego programu dopisz całkowanie ruchu w kierunku poziomym z odbiciami od brzegów.
- Dopisz do programu możliwość symulacji N punktów o losowo dobranych warunkach początkowych, masach i rozmiarach (dla chętnych z kolizjami).
- Dodaj siłę oporu aerodynamicznego zgodnie z formułą Stokes’a dla kuli: https://pl.wikipedia.org/wiki/Op%C3%B3r_aero(hydro)dynamiczny
Wykonaj kilka symulacji dla różnych współczynników oporu (lub różnych lepkości płynu). - (*) Dopisz do programu siłę przyciągającą punkty do środka układu (np. punkt W/2,H/2, gdzie W i H to wymiary układu) z użyciem siły zależnej od kwadratu odwrotności odległości od środka.
Kontakt: maciej.matyka@uwr.edu.pl
Mój nowy projekt (2021)— Koder na Strychu — programowanie C++, modelowanie, symulacje: https://www.youtube.com/c/KodernaStrychu/
🎶 Koder Na Discordzie: https://discord.gg/amfQubtPkn
👓 Kody na GitHub: https://github.com/maciejmatyka/Moja Strona domowa: http://panoramix.ift.uni.wroc.pl/~maq/
Strona w pracy: http://www.ift.uni.wroc.pl/~maq/
Aplikacje dla dzieci ONLINE: http://felp.pl
Mój YouTube: https://www.youtube.com/user/maqflp
Mój FB: https://www.facebook.com/ComputerSimulations/
Mój Twitter: https://twitter.com/maqpl
Maciej Matyka, Wrocław, 06.2017
Odnośniki
[1] https://www.wolframalpha.com/input/?i=derivative+of+f(x)%3Dsin(x)*exp(-x)
[2] https://www.wolframalpha.com/input/?i=derivative+of+f(x)+%3D+e%5E(-x)+(cos(x)+-+sin(x))
[3] Matulewski Jacek, Dziubak Tomasz, Sylwestrzak Marcin, Płoszajczak Radosław, Grafika — Fizyka — Metody numeryczne. Symulacje fizyczne z wizualizacją 3D, PWN 2010