Programowanie, część IV

Podobne dokumenty
Programowanie, część IV

Numeryczne rozwiązywanie równań różniczkowych ( )

Ćwiczenie M-2 Pomiar przyśpieszenia ziemskiego za pomocą wahadła rewersyjnego Cel ćwiczenia: II. Przyrządy: III. Literatura: IV. Wstęp. l Rys.

Kinematyka: opis ruchu

Podstawy fizyki sezon 1 VII. Ruch drgający

Nazwisko i imię: Zespół: Data: Ćwiczenie nr 1: Wahadło fizyczne. opis ruchu drgającego a w szczególności drgań wahadła fizycznego

DRGANIA SWOBODNE UKŁADU O DWÓCH STOPNIACH SWOBODY. Rys Model układu

Rozwiązywanie równań nieliniowych

RÓWNANIA NIELINIOWE Maciej Patan

Programowanie komputerowe. Zajęcia 7

Całkowanie numeryczne

Definicje i przykłady

Ć W I C Z E N I E N R M-2

Lab 10. Funkcje w argumentach funkcji metoda Newtona. Synonimy nazw typów danych. Struktury. Tablice struktur.

Fizyka 11. Janusz Andrzejewski

Równania różniczkowe zwyczajne

MECHANIKA 2. Drgania punktu materialnego. Wykład Nr 8. Prowadzący: dr Krzysztof Polko

TEMAT : KLASY DZIEDZICZENIE

Wstęp do równań różniczkowych

Programowanie, część I

Wstęp do metod numerycznych Rozwiazywanie równań algebraicznych. P. F. Góra

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Metody numeryczne rozwiązywania równań różniczkowych

Obliczenia iteracyjne

Metody numeryczne równań różniczkowych zwyczajnych

Wstęp do równań różniczkowych

MECHANIKA II. Dynamika ruchu obrotowego bryły sztywnej

Wykład z modelowania matematycznego. Przykłady modelowania w mechanice i elektrotechnice.

Dokąd on zmierza? Przemieszczenie i prędkość jako wektory

Metody rozwiązywania równań nieliniowych

METODY OBLICZENIOWE. Projekt nr 3.4. Dariusz Ostrowski, Wojciech Muła 2FD/L03

O 2 O 1. Temat: Wyznaczenie przyspieszenia ziemskiego za pomocą wahadła rewersyjnego

Prawa ruchu: dynamika

Fizyka 12. Janusz Andrzejewski

Pochodna i różniczka funkcji oraz jej zastosowanie do obliczania niepewności pomiarowych

Prędkość fazowa i grupowa fali elektromagnetycznej w falowodzie

Metody numeryczne I Równania nieliniowe

Laboratorium II: Modelowanie procesów fizycznych Skrypt do ćwiczeń

Wykład FIZYKA I. Dr hab. inż. Władysław Artur Woźniak. Katedra Optyki i Fotoniki Wydział Podstawowych Problemów Techniki Politechnika Wrocławska

27. RÓWNANIA RÓŻNICZKOWE CZĄSTKOWE

KADD Minimalizacja funkcji

Zagadnienia brzegowe dla równań eliptycznych

VII. Drgania układów nieliniowych

Drgania układu o wielu stopniach swobody

Wykład FIZYKA I. 10. Ruch drgający tłumiony i wymuszony. Dr hab. inż. Władysław Artur Woźniak

Programowanie w C++ Wykład 14. Katarzyna Grzelak. 3 czerwca K.Grzelak (Wykład 14) Programowanie w C++ 1 / 27

Interpolacja, aproksymacja całkowanie. Interpolacja Krzywa przechodzi przez punkty kontrolne

OPTYKA KWANTOWA Wykład dla 5. roku Fizyki

Wyznaczanie przyspieszenia ziemskiego za pomocą wahadła prostego

Ćw. nr 31. Wahadło fizyczne o regulowanej płaszczyźnie drgań - w.2

Elementy rachunku różniczkowego i całkowego

Instrukcje pętli przykłady. Odgadywanie hasła. 1) Program pyta o hasło i podaje adres, gdy hasło poprawne lub komunikat o błędnym haśle.

13. Równania różniczkowe - portrety fazowe

BADANIE DRGAŃ TŁUMIONYCH WAHADŁA FIZYCZNEGO

Metody Lagrange a i Hamiltona w Mechanice

METODY ROZWIĄZYWANIA RÓWNAŃ NIELINIOWYCH

Iteracyjne rozwiązywanie równań

ROZWIĄZYWANIE RÓWNAŃ NIELINIOWYCH

3. KINEMATYKA Kinematyka jest częścią mechaniki, która zajmuje się opisem ruchu ciał bez wnikania w jego przyczyny. Oznacza to, że nie interesuje nas

KLUCZ PUNKTOWANIA ODPOWIEDZI

Pochodna i różniczka funkcji oraz jej zastosowanie do rachunku błędów pomiarowych

Wstęp do metod numerycznych Uwarunkowanie Eliminacja Gaussa. P. F. Góra

Sprawozdanie z zad. nr 4 Wahadło Matematyczne z Fizyki Komputerowej. Szymon Wawrzyniak / Artur Angiel / Gr. 5 / Poniedziałek 12:15

Informatyka I Lab 06, r.a. 2011/2012 prow. Sławomir Czarnecki. Zadania na laboratorium nr. 6

Wykład 6 Drgania. Siła harmoniczna

Programowanie strukturalne i obiektowe. Funkcje

1 Metody rozwiązywania równań nieliniowych. Postawienie problemu

Siła sprężystości - przypomnienie

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Ruch drgajacy. Drgania harmoniczne. Drgania harmoniczne... Drgania harmoniczne... Notatki. Notatki. Notatki. Notatki. dr inż.

Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this

IX. Rachunek różniczkowy funkcji wielu zmiennych. 1. Funkcja dwóch i trzech zmiennych - pojęcia podstawowe. - funkcja dwóch zmiennych,

METODY NUMERYCZNE. Wykład 4. Numeryczne rozwiązywanie równań nieliniowych z jedną niewiadomą. prof. dr hab.inż. Katarzyna Zakrzewska

3 Podstawy teorii drgań układów o skupionych masach

Funkcja kwadratowa. f(x) = ax 2 + bx + c,

PętlaforwOctave. Roman Putanowicz 13 kwietnia 2008

Drgania wymuszone - wahadło Pohla

mechanika analityczna 1 nierelatywistyczna L.D.Landau, E.M.Lifszyc Krótki kurs fizyki teoretycznej

wykład V uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C++ klasy i obiekty wykład V dr Jarosław Mederski Spis Język C++ - klasy

1.1 Wahadło anharmoniczne(m5)

Metody numeryczne. materiały do wykładu dla studentów

Drgania. O. Harmoniczny

Wyznaczanie przyspieszenia ziemskiego za pomocą wahadła rewersyjnego (Katera)

Laboratorium 5 Przybliżone metody rozwiązywania równań nieliniowych

Wykład 8: klasy cz. 4

Programowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14

Zajęcia: VBA TEMAT: VBA PROCEDURY NUMERYCZNE Metoda bisekcji i metoda trapezów

RUCH HARMONICZNY. sin. (r.j.o) sin

Zadania z mechaniki dla nanostudentów. Seria 3. (wykład prof. J. Majewskiego)

Politechnika Gdańska Wydział Elektrotechniki i Automatyki Katedra Inżynierii Systemów Sterowania

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

OBLICZANIE POCHODNYCH FUNKCJI.

Zaawansowane metody numeryczne Komputerowa analiza zagadnień różniczkowych 4. Równania różniczkowe zwyczajne podstawy teoretyczne

Programowanie, część I

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

przy warunkach początkowych: 0 = 0, 0 = 0

Instrukcja do ćwiczenia jednopłaszczyznowe wyważanie wirników

Czym jest całka? Całkowanie numeryczne

========================= Zapisujemy naszą funkcję kwadratową w postaci kanonicznej: 2

Funkcja kwadratowa. f(x) = ax 2 + bx + c = a

Transkrypt:

Programowanie, część IV Rafał J. Wysocki Instytut Fizyki Teoretycznej, Wydział Fizyki UW 12 kwietnia 2011 Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 1 / 42

Równania ruchu Symulacje ruchu obiektów Numeryczne rozwiązywanie równań ruchu W fizyce często potrzebujemy przewidzieć zachowanie się jakiegoś układu. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 2 / 42

Równania ruchu Symulacje ruchu obiektów Numeryczne rozwiązywanie równań ruchu W fizyce często potrzebujemy przewidzieć zachowanie się jakiegoś układu. W tym celu wyznaczamy zmiany jego konfiguracji w czasie przy zadanym stanie początkowym. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 2 / 42

Numeryczne rozwiązywanie równań ruchu Równania ruchu W fizyce często potrzebujemy przewidzieć zachowanie się jakiegoś układu. W tym celu wyznaczamy zmiany jego konfiguracji w czasie przy zadanym stanie początkowym. Służą nam do tego równania różniczkowe, takie jak równanie Newtona: d 2 ( ) d dt 2 q(t) = f dt q(t), q(t), t gdzie q(t) oznacza konfigurację układu w chwili czasu t, a funkcja f reprezentuje siły działające w układzie (z uwzględnieniem mas składników układu). (1) Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 2 / 42

Sprowadzanie do równania I rzędu Numeryczne rozwiązywanie równań ruchu Wprawdzie równanie (1) jest II rzędu, ale można sprowadzić je do postaci równania I rzędu. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 3 / 42

Numeryczne rozwiązywanie równań ruchu Sprowadzanie do równania I rzędu Wprawdzie równanie (1) jest II rzędu, ale można sprowadzić je do postaci równania I rzędu. W tym celu wprowadźmy oznaczenia: v(t) = d dt q(t) u(t) = [q(t); v(t)] g(u(t), t) = [v(t); f(v(t), q(t), t)] Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 3 / 42

Numeryczne rozwiązywanie równań ruchu Sprowadzanie do równania I rzędu Wprawdzie równanie (1) jest II rzędu, ale można sprowadzić je do postaci równania I rzędu. W tym celu wprowadźmy oznaczenia: v(t) = d dt q(t) u(t) = [q(t); v(t)] g(u(t), t) = [v(t); f(v(t), q(t), t)] Wtedy następujące równanie jest równoważne równaniu (1). d u(t) = g(u(t), t) (2) dt Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 3 / 42

Przybliżenie rozwiązania Numeryczne rozwiązywanie równań ruchu Równanie (2) może być ściśle rozwiązane analitycznie tylko w (bardzo) ograniczonej liczbie przypadków. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 4 / 42

Przybliżenie rozwiązania Numeryczne rozwiązywanie równań ruchu Równanie (2) może być ściśle rozwiązane analitycznie tylko w (bardzo) ograniczonej liczbie przypadków. Na szczęście zwykle nie potrzebujemy go ściśle rozwiązywać. Nie musimy nawet znać rozwiązania dla każdej chwili czasu t. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 4 / 42

Przybliżenie rozwiązania Numeryczne rozwiązywanie równań ruchu Równanie (2) może być ściśle rozwiązane analitycznie tylko w (bardzo) ograniczonej liczbie przypadków. Na szczęście zwykle nie potrzebujemy go ściśle rozwiązywać. Nie musimy nawet znać rozwiązania dla każdej chwili czasu t. Zazwyczaj wystarczy wyznaczyć w przybliżeniu konfigurację układu w pewnej liczbie chwil czasu t 0, t 1, t 2,..., t n takich, że t i+1 = t i + t, jeśli tylko odstęp czasu t jest rozsądnie mały. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 4 / 42

Przybliżenie rozwiązania Numeryczne rozwiązywanie równań ruchu Równanie (2) może być ściśle rozwiązane analitycznie tylko w (bardzo) ograniczonej liczbie przypadków. Na szczęście zwykle nie potrzebujemy go ściśle rozwiązywać. Nie musimy nawet znać rozwiązania dla każdej chwili czasu t. Zazwyczaj wystarczy wyznaczyć w przybliżeniu konfigurację układu w pewnej liczbie chwil czasu t 0, t 1, t 2,..., t n takich, że t i+1 = t i + t, jeśli tylko odstęp czasu t jest rozsądnie mały. Wystarczy zatem wyznaczyć ciąg wektorów u i takich, że dla każdego i zachodzi u(t i ) u i < ɛ, gdzie epsilon jest zadanym limitem odchylenia obliczonego wektora od prawdziwej konfiguracji układu w danej chwili czasu. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 4 / 42

Metoda Eulera Symulacje ruchu obiektów Numeryczne rozwiązywanie równań ruchu Zauważmy, że u(t i+1 ) u(t i ) = ti+1 t i g(u(τ), τ)dτ (3) Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 5 / 42

Metoda Eulera Symulacje ruchu obiektów Numeryczne rozwiązywanie równań ruchu Zauważmy, że u(t i+1 ) u(t i ) = ti+1 t i g(u(τ), τ)dτ (3) Jeżeli u(t) jest funkcją o wartościach rzeczywistych, to w pierwszym przybliżeniu można oszacować całkę po prawej stronie równania (3) przez pole powierzchni prostokąta o wysokości g(u(t i ), t i ) i długości podstawy t. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 5 / 42

Metoda Eulera Symulacje ruchu obiektów Numeryczne rozwiązywanie równań ruchu Zauważmy, że u(t i+1 ) u(t i ) = ti+1 t i g(u(τ), τ)dτ (3) Jeżeli u(t) jest funkcją o wartościach rzeczywistych, to w pierwszym przybliżeniu można oszacować całkę po prawej stronie równania (3) przez pole powierzchni prostokąta o wysokości g(u(t i ), t i ) i długości podstawy t. Stąd w ogólności otrzymujemy algorytm zwany metodą Eulera. u i+1 = u i + g(u i, t i ) t Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 5 / 42

Wady metody Eulera Symulacje ruchu obiektów Numeryczne rozwiązywanie równań ruchu W każdym kroku metody Eulera odstępstwo od prawdziwej wartości u(t i ) może być rzędu ( t) 2 : u(t i+1 ) = u(t i ) + t du dt + O (( t) 2) ti = u(t i ) + g(u(t i ), t i ) t + O (( t) 2) Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 6 / 42

Wady metody Eulera Symulacje ruchu obiektów Numeryczne rozwiązywanie równań ruchu W każdym kroku metody Eulera odstępstwo od prawdziwej wartości u(t i ) może być rzędu ( t) 2 : u(t i+1 ) = u(t i ) + t du dt + O (( t) 2) ti = u(t i ) + g(u(t i ), t i ) t + O (( t) 2) Ponadto w ogólności jest ona niestabilna, czyli całkowite odstępstwo u i od u(t i ) może stopniowo narastać wraz z liczbą wykonanych kroków. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 6 / 42

Wady metody Eulera Symulacje ruchu obiektów Numeryczne rozwiązywanie równań ruchu W każdym kroku metody Eulera odstępstwo od prawdziwej wartości u(t i ) może być rzędu ( t) 2 : u(t i+1 ) = u(t i ) + t du dt + O (( t) 2) ti = u(t i ) + g(u(t i ), t i ) t + O (( t) 2) Ponadto w ogólności jest ona niestabilna, czyli całkowite odstępstwo u i od u(t i ) może stopniowo narastać wraz z liczbą wykonanych kroków. W celu otrzymania bardziej praktycznej metody można spróbować użyć lepszego przybliżenia całki po prawej stronie równania (3). Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 6 / 42

Poprawianie metody Eulera Numeryczne rozwiązywanie równań ruchu Wysokość prostokąta, którego pola powierzchni używamy do oszacowania całki w równaniu (3), można wyznaczyć wykorzystując przybliżoną wartość funkcji g(u(t), t) w punkcie t i + t/2. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 7 / 42

Numeryczne rozwiązywanie równań ruchu Poprawianie metody Eulera Wysokość prostokąta, którego pola powierzchni używamy do oszacowania całki w równaniu (3), można wyznaczyć wykorzystując przybliżoną wartość funkcji g(u(t), t) w punkcie t i + t/2. Weźmy: k 1 = g(u i, t i ) k 2 = g(u i + αk 1 t, t i + β t) u i+1 = u i + ω 1 k 1 t + ω 2 k 2 t i wybierzmy stałe α, β, ω 1, ω 2 tak, aby różnica między u i+1 oraz u(t i+1 ) była rzędu ( t) 3 (przy założeniu, że u i = u(t i )). Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 7 / 42

Poprawianie metody Eulera (c. d.) Numeryczne rozwiązywanie równań ruchu Z rozwinięcia u(t) w szereg Taylora w otoczniu t i mamy: u(t i+1 ) = u(t i ) + g(u(t i ), t i ) t + g ( t) 2 t ti 2 + g u g(u(t i ), t i ) ( t)2 + O(( t) 3 ) ti 2 Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 8 / 42

Poprawianie metody Eulera (c. d.) Numeryczne rozwiązywanie równań ruchu Z rozwinięcia u(t) w szereg Taylora w otoczniu t i mamy: u(t i+1 ) = u(t i ) + g(u(t i ), t i ) t + g ( t) 2 t ti 2 + g u g(u(t i ), t i ) ( t)2 + O(( t) 3 ) ti 2 Rozwijając k 2 w szereg Taylora w otoczeniu t i dostajemy: u i+1 = u i + g(u i, t i )(ω 1 + ω 2 ) t + g t βω 2 ( t) 2 ti + g u g(u i, t i )αω 2 ( t) 2 + O(( t) 3 ) ti Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 8 / 42

Numeryczne rozwiązywanie równań ruchu Metoda punktu środkowego (ang. midpoint method) Oczekiwany efekt uzyskamy wybierając ω 1 = 1 ω 2, βω 2 = 1/2 oraz αω 2 = 1/2. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 9 / 42

Numeryczne rozwiązywanie równań ruchu Metoda punktu środkowego (ang. midpoint method) Oczekiwany efekt uzyskamy wybierając ω 1 = 1 ω 2, βω 2 = 1/2 oraz αω 2 = 1/2. W szczególności możemy wziąć ω 1 = 0, ω 2 = 1, α = 1/2 oraz β = 1/2 i wtedy otrzymujemy algorytm: k 1 = g(u i, t i ) ( k 2 = g u i + t 2 k 1, t i + t ) t 2 u i+1 = u i + k 2 t Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 9 / 42

Numeryczne rozwiązywanie równań ruchu Metoda punktu środkowego (ang. midpoint method) Oczekiwany efekt uzyskamy wybierając ω 1 = 1 ω 2, βω 2 = 1/2 oraz αω 2 = 1/2. W szczególności możemy wziąć ω 1 = 0, ω 2 = 1, α = 1/2 oraz β = 1/2 i wtedy otrzymujemy algorytm: k 1 = g(u i, t i ) ( k 2 = g u i + t 2 k 1, t i + t ) t 2 u i+1 = u i + k 2 t Nie musimy jednak poprzestawać na wykorzystywaniu dwóch pośrednich wartości g(u(t), t). Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 9 / 42

Metoda Rungego-Kutty Wyprowadzenie metody Rungego-Kutty Użyjmy czterech pośrednich wartości g(u(t), t): k 1 = g(u i, t i ) k 2 = g(u i + α 1 k 1 t, t i + β 1 t) k 3 = g(u i + α 2 k 2 t, t i + β 2 t) k 4 = g(u i + α 3 k 3 t, t i + β 3 t) u i+1 = 4 u i + t ω j k j (4) j=1 Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 10 / 42

Metoda Rungego-Kutty Wyprowadzenie metody Rungego-Kutty Użyjmy czterech pośrednich wartości g(u(t), t): k 1 = g(u i, t i ) k 2 = g(u i + α 1 k 1 t, t i + β 1 t) k 3 = g(u i + α 2 k 2 t, t i + β 2 t) k 4 = g(u i + α 3 k 3 t, t i + β 3 t) u i+1 = 4 u i + t ω j k j (4) j=1 Postępując analogicznie do poprzedniego przypadku możemy otrzymać zgodność prawej strony równania (4) z rozwinięciem Taylora u(t) w otoczeniu t i z dokładnością do wyrazów rzędu ( t) 4 przy założeniu, że u i = u(t i ). Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 10 / 42

Metoda Rungego-Kutty Metoda Rungego-Kutty (czwartego rzędu) W tym celu trzeba wybrać α 1 = β 1 = α 2 = β 2 = 1/2, α 3 = β 3 = 1, ω 1 = ω 4 = 1/6 oraz ω 2 = ω 3 = 1/3. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 11 / 42

Metoda Rungego-Kutty Metoda Rungego-Kutty (czwartego rzędu) W tym celu trzeba wybrać α 1 = β 1 = α 2 = β 2 = 1/2, α 3 = β 3 = 1, ω 1 = ω 4 = 1/6 oraz ω 2 = ω 3 = 1/3. Wówczas otrzymujemy algorytm: k 1 = g(u i, t i ) ( k 2 = g u i + t 2 k 1, t i + t ) 2 ( k 3 = g u i + t 2 k 2, t i + t ) 2 k 4 = g(u i + k 3 t, t i + t) ( k1 u i+1 = u i + t 6 + k 2 3 + k 3 3 + k ) 4 6 Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 11 / 42

Metoda Rungego-Kutty Metoda Rungego-Kutty czwartego rzędu (c. d.) W metodzie Rungego-Kutty czwartego rzędu różnica między u i oraz u(t i ) w pojedynczym kroku jest rzędu ( t) 5. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 12 / 42

Metoda Rungego-Kutty Metoda Rungego-Kutty czwartego rzędu (c. d.) W metodzie Rungego-Kutty czwartego rzędu różnica między u i oraz u(t i ) w pojedynczym kroku jest rzędu ( t) 5. Ponadto metoda jest stabilna, czyli całkowite odstępstwo u i od prawdziwych wartości u(t i ) jest ograniczone. Inaczej mówiąc istnieje dodatnia liczba ɛ taka, że dla każdego i zachodzi u i u(t i ) < ɛ. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 12 / 42

Metoda Rungego-Kutty Metoda Rungego-Kutty czwartego rzędu (c. d.) W metodzie Rungego-Kutty czwartego rzędu różnica między u i oraz u(t i ) w pojedynczym kroku jest rzędu ( t) 5. Ponadto metoda jest stabilna, czyli całkowite odstępstwo u i od prawdziwych wartości u(t i ) jest ograniczone. Inaczej mówiąc istnieje dodatnia liczba ɛ taka, że dla każdego i zachodzi u i u(t i ) < ɛ. Wartość ɛ zależy jednak od funkcji g(u(t), t) po prawej stronie równania różniczkowego. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 12 / 42

Metoda Rungego-Kutty Założenia programu realizującego algorytm Aby zapisać algorytm Rungego-Kutty w postaci programu zauważmy, że do przeprowadzenia obliczeń dla jednego kroku metody potrzebny jest wektor reprezentujący wartość u i oraz wektory, w których będzie można zapisać k 1, k 2, k 3 i k 4. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 13 / 42

Metoda Rungego-Kutty Założenia programu realizującego algorytm Aby zapisać algorytm Rungego-Kutty w postaci programu zauważmy, że do przeprowadzenia obliczeń dla jednego kroku metody potrzebny jest wektor reprezentujący wartość u i oraz wektory, w których będzie można zapisać k 1, k 2, k 3 i k 4. Wynik obliczeń, czyli u i+1, można zapisać w tym samym miejscu, w którym przechowywana była wartość u i z poprzedniego kroku. Ponadto wektory służące do przechowywania k j mogą być wykorzystane w następnym kroku (rezerwowanie ich przed wykonaniem każdego kroku i zwalnianie po jego wykonaniu nie byłoby efektywne). Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 13 / 42

Metoda Rungego-Kutty Założenia programu realizującego algorytm Aby zapisać algorytm Rungego-Kutty w postaci programu zauważmy, że do przeprowadzenia obliczeń dla jednego kroku metody potrzebny jest wektor reprezentujący wartość u i oraz wektory, w których będzie można zapisać k 1, k 2, k 3 i k 4. Wynik obliczeń, czyli u i+1, można zapisać w tym samym miejscu, w którym przechowywana była wartość u i z poprzedniego kroku. Ponadto wektory służące do przechowywania k j mogą być wykorzystane w następnym kroku (rezerwowanie ich przed wykonaniem każdego kroku i zwalnianie po jego wykonaniu nie byłoby efektywne). Dlatego wygodnie jest tak skonstruować program, aby te wektory były polami pewnego obiektu. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 13 / 42

Metoda Rungego-Kutty Założenia programu realizującego algorytm (c. d.) Ułatwia to także wyznaczanie przybliżenia rozwiązania dla wielu równań jednocześnie (można zdefiniować odpowiedni obiekt dla każdego równania). Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 14 / 42

Metoda Rungego-Kutty Założenia programu realizującego algorytm (c. d.) Ułatwia to także wyznaczanie przybliżenia rozwiązania dla wielu równań jednocześnie (można zdefiniować odpowiedni obiekt dla każdego równania). Obiekt, którego będziemy używać do obliczeń, będzie zawsze przeprowadzał podobne operacje, niezależnie od tego jaka funkcja g(u(t), t) znajduje się po prawej stronie równania (zawsze trzeba będzie wyznaczyć k j na podstawie odpowiednich wzorów i obliczyć ich sumę). Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 14 / 42

Metoda Rungego-Kutty Założenia programu realizującego algorytm (c. d.) Ułatwia to także wyznaczanie przybliżenia rozwiązania dla wielu równań jednocześnie (można zdefiniować odpowiedni obiekt dla każdego równania). Obiekt, którego będziemy używać do obliczeń, będzie zawsze przeprowadzał podobne operacje, niezależnie od tego jaka funkcja g(u(t), t) znajduje się po prawej stronie równania (zawsze trzeba będzie wyznaczyć k j na podstawie odpowiednich wzorów i obliczyć ich sumę). W związku z tym wygodnie jest tak zdefiniować klasę dla tego obiektu, aby funkcja g(u(t), t) była przekazywana do obiektu poprzez konstruktor. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 14 / 42

(Dygresja) Wskaźniki do funkcji Wskaźniki do funkcji deklaracja Wskaźnik do funkcji (ang. function pointer) Jest to zmienna, w której zapisuje się adres funkcji. Dla tego rodzaju wskaźników typ danych wskazywanego obiektu określa: 1 jaki jest typ danych dla wyniku zwracanego przez funkcję, 2 jakie są typy danych argumentów tej funkcji oraz ich liczba. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 15 / 42

(Dygresja) Wskaźniki do funkcji Wskaźniki do funkcji deklaracja Wskaźnik do funkcji (ang. function pointer) Jest to zmienna, w której zapisuje się adres funkcji. Dla tego rodzaju wskaźników typ danych wskazywanego obiektu określa: 1 jaki jest typ danych dla wyniku zwracanego przez funkcję, 2 jakie są typy danych argumentów tej funkcji oraz ich liczba. Wskaźnik do funkcji zwracającej wynik typu double o dwóch argumentach jednym typu double i drugim typu int deklaruje się w następujący sposób: double (*funkcja)(double, int); Wtedy nazwą zmiennej dla tego wskaźnika jest funkcja. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 15 / 42

(Dygresja) Wskaźniki do funkcji Wskaźniki do funkcji nadawanie wartości Mając następujący wskaźnik do funkcji: double (*fun)(double); // Argument i wynik typu double. można przypisać mu funkcję sin() z biblioteki standardowej: fun = sin; // Po prawej stronie jest nazwa funkcji. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 16 / 42

(Dygresja) Wskaźniki do funkcji Wskaźniki do funkcji nadawanie wartości Mając następujący wskaźnik do funkcji: double (*fun)(double); // Argument i wynik typu double. można przypisać mu funkcję sin() z biblioteki standardowej: fun = sin; // Po prawej stronie jest nazwa funkcji. Wtedy instrukcja cout << fun(m_pi) << endl; spowoduje wydrukowanie wartości funkcji sin(m_pi). Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 16 / 42

Klasa dla algorytmu Rungego-Kutty Implementacja metody Rungego-Kutty Korzystając ze wskaźnika do funkcji można zdefiniować uniwersalną klasę dla algorytmu Rungego-Kutty. class RungeKutta { private: double t; // bieżący czas vector<double> u; // bieżąca konfiguracja vector<double> v2, v3, v4; // pomocnicze double dt; // krok int n; // liczba współrzędnych void (*G)(const vector<double>& u, double t, vector<double>& out); // G() reprezentuje prawą stronę równania. Argument u jest // bieżącą konfiguracją układu, a wynik działania funkcji na u // jest zapisywany w wektorze out. public: RungeKutta(const vector<double> u0, double t0, double d, void (*fun)(const vector<double>&, double, vector<double>&)); double gett(void) const { return t; } vector<double> getu(void) const { return u; } void wykonaj_krok(void); }; Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 17 / 42

Konstruktor dla klasy RungeKutta Implementacja metody Rungego-Kutty RungeKutta::RungeKutta( const vector<double> u0, double t0, double d, void (*fun)(const vector<double>&, double, vector<double>&)) { n = u0.size(); u = u0; // Początkowa konfiguracja. v2.reserve(n); // Jawna deklaracja liczby współrzędnych. v3.reserve(n); v4.reserve(n); t = t0; dt = d; G = fun; } Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 18 / 42

Konstruktor dla klasy RungeKutta Implementacja metody Rungego-Kutty RungeKutta::RungeKutta( const vector<double> u0, double t0, double d, void (*fun)(const vector<double>&, double, vector<double>&)) { n = u0.size(); u = u0; // Początkowa konfiguracja. v2.reserve(n); // Jawna deklaracja liczby współrzędnych. v3.reserve(n); v4.reserve(n); t = t0; dt = d; G = fun; } Dla wektorów v2, v3, v4 trzeba jawnie zadeklarować liczbę współrzędnych (w przeciwnym razie w funkcji wykonaj_krok będą występować błędy związane z dostępem do pamięci). Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 18 / 42

Konstruktor dla klasy RungeKutta Implementacja metody Rungego-Kutty RungeKutta::RungeKutta( const vector<double> u0, double t0, double d, void (*fun)(const vector<double>&, double, vector<double>&)) { n = u0.size(); u = u0; // Początkowa konfiguracja. v2.reserve(n); // Jawna deklaracja liczby współrzędnych. v3.reserve(n); v4.reserve(n); t = t0; dt = d; G = fun; } Dla wektorów v2, v3, v4 trzeba jawnie zadeklarować liczbę współrzędnych (w przeciwnym razie w funkcji wykonaj_krok będą występować błędy związane z dostępem do pamięci). Obliczenia realizujące algorytm zawiera metoda wykonaj_krok(). Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 18 / 42

Implementacja metody Rungego-Kutty void RungeKutta::wykonaj_krok(void) { const double jedna_trzecia = 1.0 / 3.0; double dt_2 = 0.5 * dt; int i; } v3 = u; G(u, t, v2); // v2 zawiera wartość k1 for (i = 0; i < n; i++) { v2[i] *= dt_2; v4[i] = u[i] + v2[i]; // u + (h/2) * k1 u[i] += jedna_trzecia * v2[i]; // u += (h/6) * k1 } G(v4, t + dt_2, v2); // v2 zawiera wartość k2 for (i = 0; i < n; i++) { v2[i] *= dt; v4[i] = v3[i] + 0.5 * v2[i]; // u + (h/2) * k2 u[i] += jedna_trzecia * v2[i]; // u += (h/3) * k2 } G(v4, t + dt_2, v2); // v2 zawiera wartość k3 for (i = 0; i < n; i++) { v2[i] *= dt; v4[i] = v3[i] + v2[i]; // u + k3 u[i] += jedna_trzecia * v2[i]; // u += (h/3) * k3 } t += dt; G(v4, t, v2); // v2 zawiera wartość k4 for (i = 0; i < n; i++) u[i] += dt_2 * jedna_trzecia * v2[i]; // u += (h/6) * k4 Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 19 / 42

Przykład: oscylator harmoniczny Implementacja metody Rungego-Kutty Zdefiniowaną klasę RungeKutta można wykorzystać do wyznaczenia (w przybliżeniu) ruchu oscylatora harmonicznego. W tym celu trzeba przygotować funkcję, która zostanie przekazana do konstruktora obiektu. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 20 / 42

Przykład: oscylator harmoniczny Implementacja metody Rungego-Kutty Zdefiniowaną klasę RungeKutta można wykorzystać do wyznaczenia (w przybliżeniu) ruchu oscylatora harmonicznego. W tym celu trzeba przygotować funkcję, która zostanie przekazana do konstruktora obiektu. static void osc(const vector<double>& y, double x, vector<double>& out) { static const double K = 1.0; out[0] = y[1]; out[1] = - K * y[0]; // Pochodna położenia. // Pochodna prędkości. } (void)x; // Zbędny parametr. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 20 / 42

Implementacja metody Rungego-Kutty Przykład: oscylator harmoniczny obliczenia Mając do dyspozycji klasę RungeKutta oraz funkcję osc() zdefiniowane jak wyżej można przeprowadzić obliczenia. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 21 / 42

Implementacja metody Rungego-Kutty Przykład: oscylator harmoniczny obliczenia Mając do dyspozycji klasę RungeKutta oraz funkcję osc() zdefiniowane jak wyżej można przeprowadzić obliczenia. vector<double> y; // Warunek początkowy. y.push_back(1.0); // położenie y.push_back(0.0); // prędkość RungeKutta oscylator(y, 0, 0.01, osc); for (int i = 0; i < KROKI; i++) { double t = oscylator.gett(); y = oscylator.getu(); cout << t << "\t" << y[0] << "\t" << y[1] << endl; } oscylator.wykonaj_krok(); Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 21 / 42

Implementacja metody Rungego-Kutty Przykład: oscylator harmoniczny obliczenia Mając do dyspozycji klasę RungeKutta oraz funkcję osc() zdefiniowane jak wyżej można przeprowadzić obliczenia. vector<double> y; // Warunek początkowy. y.push_back(1.0); // położenie y.push_back(0.0); // prędkość RungeKutta oscylator(y, 0, 0.01, osc); for (int i = 0; i < KROKI; i++) { double t = oscylator.gett(); y = oscylator.getu(); cout << t << "\t" << y[0] << "\t" << y[1] << endl; } oscylator.wykonaj_krok(); Wynik zostanie zapisany na standardowe wyjście w postaci trzech kolumn liczb: czas, położenie i prędkość oscylatora. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 21 / 42

Implementacja metody Rungego-Kutty Abstrakcyjna klasa dla algorytmu Rungego-Kutty Zamist posługiwać się wskaźnikiem do funkcji, można wykorzystać mechanizm dziedziczenia. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 22 / 42

Implementacja metody Rungego-Kutty Abstrakcyjna klasa dla algorytmu Rungego-Kutty Zamist posługiwać się wskaźnikiem do funkcji, można wykorzystać mechanizm dziedziczenia. Zaczynamy od zaprojektowania abstrakcyjnej klasy. class RungeKutta { private: double t; vector<double> u; vector<double> v2, v3, v4; double dt; int n; // bieżący czas // bieżąca konfiguracja // pomocnicze // krok // liczba współrzędnych protected: virtual void G(const vector<double>& in, double t, vector<double>& out) = 0; public: RungeKutta(const vector<double> u0, double t0, double d); double gett(void) const { return t; } vector<double> getu(void) const { return u; } void wykonaj_krok(void); }; Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 22 / 42

Implementacja metody Rungego-Kutty Konstruktor i metoda wykonaj krok() Konstruktor dla klasy RungeKutta ma teraz mniej argumentów. RungeKutta::RungeKutta(const vector<double> u0, double t0, double d) { n = u0.size(); u = u0; // Początkowa konfiguracja. v2.reserve(n); // Jawna deklaracja liczby współrzędnych. v3.reserve(n); v4.reserve(n); t = t0; dt = d; } Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 23 / 42

Implementacja metody Rungego-Kutty Konstruktor i metoda wykonaj krok() Konstruktor dla klasy RungeKutta ma teraz mniej argumentów. RungeKutta::RungeKutta(const vector<double> u0, double t0, double d) { n = u0.size(); u = u0; // Początkowa konfiguracja. v2.reserve(n); // Jawna deklaracja liczby współrzędnych. v3.reserve(n); v4.reserve(n); t = t0; dt = d; } Metoda wykonaj_krok() pozostaje bez zmian w zapisie, choć zamiast funkcji wskazywanej przez wskaźnik wywołuje wirtualną metodę G(). Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 23 / 42

Metoda Rungego-Kutty przykłady Przykład: oscylator harmoniczny klasa pochodna W celu zdefiniowania metody G() odpowiedniej dla naszych obliczeń trzeba stworzyć klasę pochodną od klasy RungeKutta. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 24 / 42

Metoda Rungego-Kutty przykłady Przykład: oscylator harmoniczny klasa pochodna W celu zdefiniowania metody G() odpowiedniej dla naszych obliczeń trzeba stworzyć klasę pochodną od klasy RungeKutta. #include "rk.h" class Oscylator : public RungeKutta { protected: void G(const vector <double> &y, double x, vector<double> &out); public: Oscylator(const vector<double> u0, double t0, double d) : RungeKutta(u0, t0, d) {} }; void Oscylator::G(const vector <double> &y, double x, vector<double> &out) { static const double K = 1.0; out[0] = y[1]; out[1] = - K * y[0]; // pochodna położenia // pochodna prędkości } (void)x; Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 24 / 42

Metoda Rungego-Kutty przykłady Przykład: oscylator harmoniczny obliczenia Obliczenia przeprowadzamy podobnie, jak w poprzednim przypadku, tylko teraz posługujemy się obiektem klasy Oscylator. vector<double> y(1.0, 0.0); // Warunek początkowy y.push_back(1.0); // położenie y.push_back(0.0); // prędkość Oscylator oscylator(y, 0, 0.01); for (int i = 0; i < KROKI; i++) { y = oscylator.getu(); cout << oscylator.gett() << "\t" << y[0] << "\t" << y[1] << endl; } oscylator.wykonaj_krok(); Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 25 / 42

Metoda Rungego-Kutty przykłady Przykład: oscylator harmoniczny z tarciem Dla innego modelu (np. oscylatora z tarciem) tworzymy inną klasę pochodną od klasy RungeKutta. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 26 / 42

Metoda Rungego-Kutty przykłady Przykład: oscylator harmoniczny z tarciem Dla innego modelu (np. oscylatora z tarciem) tworzymy inną klasę pochodną od klasy RungeKutta. #include "rk.h" class OscylatorTarcie : public RungeKutta { protected: void G(const vector <double> &y, double x, vector<double> &out); public: OscylatorTarcie(const vector<double> u0, double t0, double d) : RungeKutta(u0, t0, d) {} }; void OscylatorTarcie::G(const vector <double> &y, double x, vector<double> &out) { static const double K = 1.0; static const double f = 0.3; out[0] = y[1]; // pochodna położenia out[1] = - K * y[0] - f * y[1]; // pochodna prędkości } (void)x; Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 26 / 42

Przykład: huśtawka Symulacje ruchu obiektów Metoda Rungego-Kutty przykłady Spróbujmy obliczyć jaka powinna być prędkość początkowa (sztywnej) huśtawki o długości l, na której umieścimy ciężar o masie m, aby osiągnęła ona wychylenie 90 o. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 27 / 42

Przykład: huśtawka Symulacje ruchu obiektów Metoda Rungego-Kutty przykłady Spróbujmy obliczyć jaka powinna być prędkość początkowa (sztywnej) huśtawki o długości l, na której umieścimy ciężar o masie m, aby osiągnęła ona wychylenie 90 o. Zadanie to można łatwo rozwiązać korzystając z zasady zachowania energii jeżeli nie uwzględnia się tarcia. My jednak uwzględnimy tarcie. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 27 / 42

Przykład: huśtawka Symulacje ruchu obiektów Metoda Rungego-Kutty przykłady Spróbujmy obliczyć jaka powinna być prędkość początkowa (sztywnej) huśtawki o długości l, na której umieścimy ciężar o masie m, aby osiągnęła ona wychylenie 90 o. Zadanie to można łatwo rozwiązać korzystając z zasady zachowania energii jeżeli nie uwzględnia się tarcia. My jednak uwzględnimy tarcie. Ponadto nie będziemy (bo nie możemy) korzystać z założenia, że wychylenie huśtawki jest małe. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 27 / 42

Opis ruchu Symulacje ruchu obiektów Metoda Rungego-Kutty przykłady Położenie ciężaru na huśtawce zawsze znajduje się na okręgu o promieniu l i środku w punkcie zaczepienia huśtawki. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 28 / 42

Opis ruchu Symulacje ruchu obiektów Metoda Rungego-Kutty przykłady Położenie ciężaru na huśtawce zawsze znajduje się na okręgu o promieniu l i środku w punkcie zaczepienia huśtawki. Kąt wychylenia α zdefiniujemy jako kąt między ramionami huśtawki oraz płaszczyzną jej stabilnej równowagi ( pionem ). Wtedy odległość przebywana przez ciężar na huśtawce w czasie t jest równa zmianie kąta α w czasie t pomnożonej przez długość ramienia huśtawki l. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 28 / 42

Opis ruchu Symulacje ruchu obiektów Metoda Rungego-Kutty przykłady Położenie ciężaru na huśtawce zawsze znajduje się na okręgu o promieniu l i środku w punkcie zaczepienia huśtawki. Kąt wychylenia α zdefiniujemy jako kąt między ramionami huśtawki oraz płaszczyzną jej stabilnej równowagi ( pionem ). Wtedy odległość przebywana przez ciężar na huśtawce w czasie t jest równa zmianie kąta α w czasie t pomnożonej przez długość ramienia huśtawki l. Na ciężar na huśtawce działa siła ciężkości, a właściwie jej składowa styczna do toru ruchu ciężaru, dana wzorem: F g (α) = mg sin α gdzie g jest przyspieszeniem ziemskim. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 28 / 42

Równanie ruchu Symulacje ruchu obiektów Metoda Rungego-Kutty przykłady Ponadto na huśtawkę działa tarcie. Będziemy przyjmować, że jest ono proporcjonalne do masy ciężaru na huśtawce i do jego prędkości (liniowej), a współczynnik proporcjonalności oznaczymy przez f. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 29 / 42

Równanie ruchu Symulacje ruchu obiektów Metoda Rungego-Kutty przykłady Ponadto na huśtawkę działa tarcie. Będziemy przyjmować, że jest ono proporcjonalne do masy ciężaru na huśtawce i do jego prędkości (liniowej), a współczynnik proporcjonalności oznaczymy przez f. Prędkość liniowa ciężaru na huśtawce jest równa prędkości kątowej huśtawki pomnożonej przez długość jej ramienia, natomiast prędkość kątowa huśtawki jest pochodną kąta α względem czasu. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 29 / 42

Równanie ruchu Symulacje ruchu obiektów Metoda Rungego-Kutty przykłady Ponadto na huśtawkę działa tarcie. Będziemy przyjmować, że jest ono proporcjonalne do masy ciężaru na huśtawce i do jego prędkości (liniowej), a współczynnik proporcjonalności oznaczymy przez f. Prędkość liniowa ciężaru na huśtawce jest równa prędkości kątowej huśtawki pomnożonej przez długość jej ramienia, natomiast prędkość kątowa huśtawki jest pochodną kąta α względem czasu. Biorąc pod uwagę wszystkie powyższe obserwacje oraz drugą zasadę dynamiki, dostajemy następujące równanie ruchu na kąt α: d 2 α dt 2 = g l sin α f dα dt (5) Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 29 / 42

Przekształcone równanie ruchu Metoda Rungego-Kutty przykłady Równanie (5) można przepisać w postaci układu równań I rzędu: dα dt = ω (6) dω dt = g l sin α f ω Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 30 / 42

Przekształcone równanie ruchu Metoda Rungego-Kutty przykłady Równanie (5) można przepisać w postaci układu równań I rzędu: dα dt = ω (6) dω dt = g l sin α f ω Jeżeli wprowadzimy wektor y(t) = [α(t), ω(t)], to: dy 0 dt = y 1 dy 1 dt = g l sin y 0 f y 1 Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 30 / 42

Metoda Rungego-Kutty przykłady Klasa pochodna w stosunku do RungeKutta Dla równania ruchu (5) można użyć następującej klasy pochodnej od RungeKutta: class Pendulum : public RungeKutta { private: double K; // iloraz g / l double f; // współczynnik tarcia protected: void G(const vector <double> &y, double x, vector<double> &out); public: Pendulum(const vector<double> u0, double t0, double d, double k, double r) : RungeKutta(u0, t0, d), K(k), f(r) {} }; void Pendulum::G(const vector <double> &y, double x, vector<double> &out) { out[0] = y[1]; // pochodna kąta wyhylenia out[1] = - K * sin(y[0]) - f * y[1]; // pochodna prędkości kątowej (void)x; } Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 31 / 42

Metoda Rungego-Kutty przykłady Wyznaczanie krytycznej prędkości początkowej Klasa ta pozwala nam znaleźć ruch wahadła dla ustalonej prędkości początkowej, ale nie wiemy z góry, czy osiągnie ono maksymalne wychylenie. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 32 / 42

Metoda Rungego-Kutty przykłady Wyznaczanie krytycznej prędkości początkowej Klasa ta pozwala nam znaleźć ruch wahadła dla ustalonej prędkości początkowej, ale nie wiemy z góry, czy osiągnie ono maksymalne wychylenie. Możemy poszukać krytycznej prędkości metodą bisekcji, tzn. zgadnąć dwie prędkości początkowe takie, że dla jednej z nich maksymalne położenie jest przekraczane, a dla drugiej nie jest osiągane, a później sprawdzić co dzieje się dla wartości ze środka przedziału. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 32 / 42

Metoda Rungego-Kutty przykłady Wyznaczanie krytycznej prędkości początkowej Klasa ta pozwala nam znaleźć ruch wahadła dla ustalonej prędkości początkowej, ale nie wiemy z góry, czy osiągnie ono maksymalne wychylenie. Możemy poszukać krytycznej prędkości metodą bisekcji, tzn. zgadnąć dwie prędkości początkowe takie, że dla jednej z nich maksymalne położenie jest przekraczane, a dla drugiej nie jest osiągane, a później sprawdzić co dzieje się dla wartości ze środka przedziału. Następnie jedną z odgadniętych wartości zastępujemy ich średnią i powtarzamy. W ten sposób dla każdego kroku będziemy mieli dwukrotnie mniejszy przedział do przeszukania. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 32 / 42

Metoda Rungego-Kutty przykłady Kryterium przekroczenia maksymalnego wychylenia Zauważmy, że jeżeli znak prędkości kątowej zmieni się w trakcie ruchu przy α < π, to maksymalne wychylenie nie zostanie osiągnięte w tym ruchu. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 33 / 42

Metoda Rungego-Kutty przykłady Kryterium przekroczenia maksymalnego wychylenia Zauważmy, że jeżeli znak prędkości kątowej zmieni się w trakcie ruchu przy α < π, to maksymalne wychylenie nie zostanie osiągnięte w tym ruchu. bool przekroczone(double v0) { if (v0 < 0) v0 = -v0; vector<double> y; y.push_back(0.0); y.push_back(v0); Pendulum oscylator(y, 0, 0.01, 1, 0.3); while (y[1] > 0 && y[0] < M_PI) { oscylator.wykonaj_krok(); y = oscylator.getu(); } } return y[0] >= M_PI; Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 33 / 42

Metoda Rungego-Kutty przykłady I etap obliczeń liniowe zwiększanie prędkości początkowej Obliczenia można podzielić na dwa etapy. W pierwszym z nich wybieramy ustaloną wartość prędkości początkowej (kątowej) ω 0 = Ω i sprawdzamy, czy przy tej wartości maksymalne wychylenie jest przekroczone. Jeżeli tak, przechodzimy do II etapu obliczeń. Jeżeli nie, zwiększamy ω 0 o Ω i powtarzamy. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 34 / 42

Metoda Rungego-Kutty przykłady I etap obliczeń liniowe zwiększanie prędkości początkowej Obliczenia można podzielić na dwa etapy. W pierwszym z nich wybieramy ustaloną wartość prędkości początkowej (kątowej) ω 0 = Ω i sprawdzamy, czy przy tej wartości maksymalne wychylenie jest przekroczone. Jeżeli tak, przechodzimy do II etapu obliczeń. Jeżeli nie, zwiększamy ω 0 o Ω i powtarzamy. // I etap - sartujemy od v0 = V i będziemy ją w każdym kroku zwiększać // o V, aż wahadło przekroczy maksymalne wychylenie. double v0 = V; while (!przekroczone(v0)) v0 += V; Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 34 / 42

Metoda Rungego-Kutty przykłady I etap obliczeń liniowe zwiększanie prędkości początkowej Obliczenia można podzielić na dwa etapy. W pierwszym z nich wybieramy ustaloną wartość prędkości początkowej (kątowej) ω 0 = Ω i sprawdzamy, czy przy tej wartości maksymalne wychylenie jest przekroczone. Jeżeli tak, przechodzimy do II etapu obliczeń. Jeżeli nie, zwiększamy ω 0 o Ω i powtarzamy. // I etap - sartujemy od v0 = V i będziemy ją w każdym kroku zwiększać // o V, aż wahadło przekroczy maksymalne wychylenie. double v0 = V; while (!przekroczone(v0)) v0 += V; Po zakończeniu tego etapu wiemy, że poszukiwana wartość znajduję się w przedziale [ω 0 Ω, ω 0 ]. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 34 / 42

II etap obliczeń bisekcja Metoda Rungego-Kutty przykłady Przeszukujemy przedział [ω 0 Ω, ω 0 ] metodą bisekcji. Robimy to tak, że dla dolnej granicy przedziału maksymalne wychylenie nie jest przekraczane podczas ruchu, a dla jego górnej granicy jest. W każdym kroku sprawdzamy, co dzieje się w środku przedziału i przesuwamy do niego jedną lub drugą granicę (tę, dla której zachowanie się układu jest takie, jak dla środka przedziału). Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 35 / 42

II etap obliczeń bisekcja Metoda Rungego-Kutty przykłady Przeszukujemy przedział [ω 0 Ω, ω 0 ] metodą bisekcji. Robimy to tak, że dla dolnej granicy przedziału maksymalne wychylenie nie jest przekraczane podczas ruchu, a dla jego górnej granicy jest. W każdym kroku sprawdzamy, co dzieje się w środku przedziału i przesuwamy do niego jedną lub drugą granicę (tę, dla której zachowanie się układu jest takie, jak dla środka przedziału). // II etap - bisekcja. double a = v0, b = v0 - V; while (a - b > epsilon) { double c = 0.5 * (a + b); } if (przekroczone(c)) a = c; else b = c; Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 35 / 42

II etap obliczeń bisekcja Metoda Rungego-Kutty przykłady Wynikiem obliczeń jest przedział zawierający poszukiwaną wartość. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 36 / 42

II etap obliczeń bisekcja Metoda Rungego-Kutty przykłady Wynikiem obliczeń jest przedział zawierający poszukiwaną wartość. Długość tego przedziału zależy od narzuconej programowi dokładności (stała epsilon w kodzie powyżej). Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 36 / 42

II etap obliczeń bisekcja Metoda Rungego-Kutty przykłady Wynikiem obliczeń jest przedział zawierający poszukiwaną wartość. Długość tego przedziału zależy od narzuconej programowi dokładności (stała epsilon w kodzie powyżej). Podobne obliczenia można zrobić dla przypadku, w którym wartość początkowego wychylenia huśtawki jest niezerowa. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 36 / 42

Wahadło z wymuszaniem Metoda Rungego-Kutty przykłady Do omówionego modelu można bardzo łatwo dodać popychanie w postaci siły proporcjonalnej do pewnej funkcji zależnej od czasu. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 37 / 42

Wahadło z wymuszaniem Metoda Rungego-Kutty przykłady Do omówionego modelu można bardzo łatwo dodać popychanie w postaci siły proporcjonalnej do pewnej funkcji zależnej od czasu. Jeśli funkcją tą jest cos(x), to równanie ruchu ma postać: d 2 α dt 2 = g l sin α f dα dt + B c cos(ω c t + ϕ c ) (7) gdzie B c jest amplitudą, ω c jest częstością drgań, a ϕ c jest przesunięciem fazowym wymuszającego oscylatora. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 37 / 42

Wahadło z wymuszaniem Metoda Rungego-Kutty przykłady Do omówionego modelu można bardzo łatwo dodać popychanie w postaci siły proporcjonalnej do pewnej funkcji zależnej od czasu. Jeśli funkcją tą jest cos(x), to równanie ruchu ma postać: d 2 α dt 2 = g l sin α f dα dt + B c cos(ω c t + ϕ c ) (7) gdzie B c jest amplitudą, ω c jest częstością drgań, a ϕ c jest przesunięciem fazowym wymuszającego oscylatora. W tym modelu można zaobserwować interesujące zachowanie się układu, takie jak rezonans lub chaotyczna ewolucja. Tak, jak poprzednio, można stworzyć dla niego klasę pochodną względem klasy RungeKutta. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 37 / 42

Metoda Rungego-Kutty przykłady Definicja klasy dla wahadła z wymuszaniem Klasa pochodna w stosunku do RungeKutta dla wahadła z wymuszaniem class Pendulum : public RungeKutta { private: double K; // iloraz g / l double f; // współczynnik tarcia double B; // amplituda wymuszającego oscylatora double W; // częstość wymuszającego oscylatora double S; // przesunięcie fazowe wymuszającego oscylatora protected: void G(const vector <double> &y, double x, vector<double> &out); public: Pendulum(const vector<double> u0, double t0, double d, double k, double r, double b, double w, double s) : RungeKutta(u0, t0, d), K(k), f(r), B(b), W(w), S(s) {} }; void Pendulum::G(const vector <double> &y, double x, vector<double> &out) { out[0] = y[1]; out[1] = - K * sin(y[0]) - f * y[1] + B * cos(w * x + S); } Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 38 / 42

Wizualizacja wyników obliczeń Wykres położenia w funkcji czasu dla oscylatora Obliczywszy, na przykład, położenie oscylatora harmonicznego w pewnej liczbie chwil czasu t k takich, że t i t i 1 = t, możemy wykorzystać bibliotekę Qt do utworzenia rysunku zawierającego wykres tej funkcji. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 39 / 42

Wizualizacja wyników obliczeń Wykres położenia w funkcji czasu dla oscylatora Obliczywszy, na przykład, położenie oscylatora harmonicznego w pewnej liczbie chwil czasu t k takich, że t i t i 1 = t, możemy wykorzystać bibliotekę Qt do utworzenia rysunku zawierającego wykres tej funkcji. 1 Tworzymy klasę pochodną od RungeKutta do reprezentowania oscylatorów harmonicznych oraz obiekt tej klasy reprezentujący oscylator o zadanych parametrach (K, położenie początkowe i prędkość początkowa). 2 Używamy tej klasy do wyznaczenia położenia oscylatora w zadanch chwilach czasu. Wyniki można umieścić w dwóch obiektach klasy vector (w jednym czas, a w drugim położenie oscylatora). 3 W ten sposób otrzymujemy zbiór współrzędnych punktów reprezentujących funkcję do narysowania. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 39 / 42

Wizualizacja wyników obliczeń Obliczanie zależności położenia od czasu Otrzymane wektory można przekazać do konstruktora obiektu klasy pochodnej od QWidget, którego metoda paintevent() będzie używać ich przy rysowaniu wykresu. Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 40 / 42

Wizualizacja wyników obliczeń Obliczanie zależności położenia od czasu Otrzymane wektory można przekazać do konstruktora obiektu klasy pochodnej od QWidget, którego metoda paintevent() będzie używać ich przy rysowaniu wykresu. vector<double> y; // Warunek początkowy y.push_back(1.0); // położenie y.push_back(0.0); // prędkość Oscylator oscylator(1.0, y, 0, 0.01); vector<double> t(kroki); vector<double> q(kroki); for (int i = 0; i < KROKI; i++) { y = oscylator.getu(); t[i] = oscylator.gett(); q[i] = y[0]; oscylator.wykonaj_krok(); } class Obrazek : public QWidget { private: vector<double> x; vector<double> y; double x0, y0, x1, y1; unsigned int rozmiar; protected: void paintevent(qpaintevent *event); public: Obrazek(vector<double>& a, vector<double>& b, QWidget *parent = NULL); }; Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 40 / 42

Wizualizacja wyników obliczeń Rysowanie wykresu położenia w funkcji czasu Obrazek::Obrazek(vector<double>& a, vector<double>& b, QWidget *parent) : QWidget(parent) { x = a; y = b; rozmiar = x.size(); if (y.size() < rozmiar) rozmiar = y.size(); } x0 = x[0]; x1 = x[rozmiar - 1]; y0 = y[0]; y1 = y[rozmiar - 1]; for (unsigned int j = 1; j < rozmiar; j++) { if (x[j] < x0) x0 = x[j]; else if (x[j] > x1) x1 = x[j]; } if (y[j] < y0) y0 = y[j]; else if (y[j] > y1) y1 = y[j]; void Obrazek::paintEvent(QPaintEvent *event) { QPainter painter(this); double w = x1 - x0; double h = y1 - y0; } painter.scale(width() / w, -height() / h); painter.translate(-x0, -y1); QPointF p1(x[0], y[0]); QPointF p2; for (unsigned int j = 1; j < rozmiar; j++) { p2.setx(x[j]); p2.sety(y[j]); painter.drawline(p1, p2); p1 = p2; } (void)event; Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 41 / 42

Literatura Literatura B. Stroustrup, Język C++ (Wydawnictwo Naukowo-Techniczne, Warszawa 2002). B. Eckel, Thinking in C++. Edycja polska (Wydawnictwo Helion, Gliwice 2002). Pang Tao, Metody obliczeniowe w fizyce (Wydawnictwo Naukowe PWN, Warszawa 2001). Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część IV 12 kwietnia 2011 42 / 42