• Nie Znaleziono Wyników

Laboratorium Podstaw fizyki teoretycznej. Implementacja metody RK4.

N/A
N/A
Protected

Academic year: 2021

Share "Laboratorium Podstaw fizyki teoretycznej. Implementacja metody RK4."

Copied!
4
0
0

Pełen tekst

(1)

Laboratorium Podstaw fizyki teoretycznej.

Implementacja metody RK4.

27 listopada 2018

Na laboratorium będziemy numerycznie rozwiązywać równania ruchu, których nie byliśmy w stanie rozwiązać analitycznie na ćwiczeniach. Aby poszukiwane rozwiązania cechowały się wysoką jakością (tj. błędy numeryczne mają być niewielkie) do ich znalezienia musimy użyć odpowiedniej metody. Takie własności ma metoda Rungego- Kutty 4 rzędu (RK4). Można ją stosować zarówno do rozwiązania pojedynczego równania różniczkowego jak i do rozwiązania układu równań różniczkowych 1 rzędu. Istotną kwestią w rozwiązywaniu równań ruchu są warunki początkowe, determinują one całe rozwiązanie, musimy zatem zawsze pamiętać, aby je poprawnie zaimplementować w programie.

1 Równanie różniczkowe zwyczajne 1 rzędu

Zastosowanie algorytmu metody RK4 najłatwiej zobrazować na przykładzie pojedynczego równania różniczko- wego

dy

dt = f (t, y), W P : y(t = 0) = y0 (1)

Pierwszym krokiem jest dyskretyzacja zmiennej czasowej. Na osi czasu wprowadzamy siatkę równoodległych węzłów

ti= ∆t· i, i = 0, 1, . . . , N, ∆t = tmax

N (2)

gdzie: tmax to całkowity czas trwania symulacji komputerowej, N jest liczbą kroków czasowych. Jeśli znamy rozwiązanie w chwili ti (yi) to rozwiązanie w chwili następnej

yi+1= yi+∆t

6 (k1+ 2· k2+ 2· k3+ k4) (3) gdzie wartości współczynników kα wyliczamy korzystając z prawej strony RRZ1 tj. f (t, y)licząc kolejno

k1 = f (ti, yi) (4)

k2 = f (ti+∆t

2 , yi+∆t

2 k1) (5)

k3 = f (ti+∆t

2 , yi+∆t

2 k2) (6)

k4 = f (ti+ ∆t, yi+ ∆t k3) (7)

(8) Najprostszy algorytm RK4 mógłby wyglądać następująco

WP : y = y0 t =0 dt =tmax/ N

for i f r o m 1 to N do

k1 = f ( t , y )

k2 = f ( t + dt /2 , y + dt /2* k1 ) k3 = f ( t + dt /2 , y + dt /2* k2 ) k4 = f ( t + dt /2 , y + dt * k3 )

y = y + dt / 6 * ( k1 +2* k2 +2* k3 + k4 ) ( tu : y = yi+1)

1

(2)

t = t + dt

z a p i s do p l i k u : t , y end do

2 Układ równań różniczkowych 1 rzędu

Rozważmy teraz nieco trudniejszy przypadek. W formalizmie Lagrange’a równania ruchu są zazwyczaj drugiego rzędu. Zapiszmy takie równanie w ogólnej postaci

d2y

dt2 + g(t, y)dy

dt + h(t, y) = 0 (9)

gdzie g(t, y) i h(t, y) są pewnymi funkcjami czasu i naszego rozwiązania. Wprowadźmy dwie nowe zmienne

s1 = y (10)

s2 = dy

dt (11)

które pozwolą nam zapisać oryginalne RRZ 2 rzędu d2y

dt2 =−g(t, y)dy

dt − h(t, y) (12)

w postaci układu RRZ 1 rzędu ds1

dt = f1(t, s1, s2) = s2 (13)

ds2

dt = f2(t, s1, s2) =−g(t, s1) s2+ h(t, s1) (14) który możemy zapisać w postaci wektorowej

d⃗s

dt = ⃗f (t, ⃗s ) (15)

Równania algorytmu RK4 możemy bardzo łatwo dopasować do naszego układu RRZ1

k1 = f (t i, ⃗si) (16)

k2 = f (t i+∆t

2 , ⃗si+∆t 2

k1) (17)

k3 = f (t i+∆t

2 , ⃗si+∆t 2

k2) (18)

k4 = f (t i+ ∆t, ⃗si+ ∆t ⃗k3) (19)

yi+1 = yi+∆t 6

(k1+ 2· ⃗k2+ 2· ⃗k3+ ⃗k4 )

(20)

2.1 Implementacja RK4 dla układu RRZ1

2.1.1 Procedura implementująca RK4

Ponieważ metodę RK4 będziemy wykorzystywać na kilku zajęciach, ułatwimy sobie zadanie jeśli procedurę tę zaimplementujemy w jak najbardziej ogólnej postaci. Wówczas nie będziemy musieli jej zmieniać za każdym razem aby dopasować do aktualnego problemu. Implementację algorytmu danego wzorami (16)-(20) wykonamy korzystając z informacji wyniesionych z kursu języka C.

Poniżej pokazana jest procedura rk4 vec, która wykonuje jeden krok ⃗si→ ⃗si+1. Jej argumentami są: aktualna chwila czasowa (t = ti), krok czasowy (dt), ilość zmiennych n w układzie równań, tablica przechowująca aktualny wektor rozwiązań (sss = ⃗si) oraz wskaźnik do funkcji (f (t, sss, kkk)), która wyznacza wartości wektora pochodnych. W procedurze tworzymy tablice kkk1, . . . , kkk4 (odpowiedniki wektorów ⃗k1, . . . , ⃗k4) oraz tablicę pomocniczą www. Wynik czyli rozwiązania wektora ⃗si+1 są zwracane w tablicy sss.

2

(3)

v o i d r k 4 _ v e c ( d o u b l e t , d o u b l e dt , int n , d o u b l e * s , v o i d (* f )( double , d o u b l e * , d o u b l e *) ){

# d e f i n e M 100

s t a t i c d o u b l e k1 [ M ] , k2 [ M ] , k3 [ M ] , k4 [ M ] , w [ M ];

int i ;

for ( i =0; i < n ; i ++) w [ i ]= s [ i ];

f ( t , w , k1 );

for ( i =0; i < n ; i ++) w [ i ]= s [ i ]+ dt /2* k1 [ i ];

f ( t + dt /2 , w , k2 );

for ( i =0; i < n ; i ++) w [ i ]= s [ i ]+ dt /2* k2 [ i ];

f ( t + dt /2 , w , k3 );

for ( i =0; i < n ; i ++) w [ i ]= s [ i ]+ dt * k3 [ i ];

f ( t + dt , w , k4 );

for ( i =0; i < n ; i ++) s [ i ]= s [ i ]+ dt / 6 * ( k1 [ i ] + 2 * k2 [ i ] + 2 * k3 [ i ]+ k4 [ i ]);

r e t u r n ; }

Uwaga 1: Tablice kkkj, j = 1, 2, 3, 4 tworzymy z atrybutem static co oznacza że tworzone są one tylko podczas pierwszego wywołania funkcji. Po zakończeniu działania funkcji rk4 vec nadal istnieją w pamięci komputera, więc podczas kolejnego wywołania są gotowe do użycia (nie marnujemy czasu na kolejną alokację pamięci).

Uwaga 2:Parametr M określa maksymalną ilość równań (zmiennych) w rozwiązywanym układzie.

2.1.2 Procedura implementująca liczenie pochodnych

Procedurę rk4 vec możemy używać pod warunkiem że w programie mamy zdefinowaną funkcję wyliczającą pochodne

vo i d p o c h o d n e ( d o u b l e t , d o u b l e * s , d o u b l e * k ){

d e k l a r a c j e s t a ł y c h ; k [ 0 ] = f1(t, ⃗s);

k [ 1 ] = f2(t, ⃗s);

k [ 2 ] = f3(t, ⃗s);

. . .

k [ n - 1 ] = fn−1(t, ⃗s);

r e t u r n ; }

Uwaga 1: Funkcję pochodne tworzymy oddzielnie dla każdego rozwiązywanego układu bo zmieniają się prawe strony tj. definicje ⃗f (t, ⃗s).

Uwaga 2: W funkcji musimy określić sposób wyznaczania tylu pochodnych ile mamy w układzie RRZ1 czyli n− 1.

2.1.3 Program implementujący RK4

Mając do dyspozycji ogólną procedurę dla RK4 oraz funkcję wyliczającą pochodne możemy je wykorzystać w programie którego celem będzie wyznaczenie rozwiązań w kolejnych chwilach czasu

vo i d m a i n (){

d o u b l e t , dt , tmax , * s ; int i , n , N ;

v o i d (* f )( double , d o u b l e * , d o u b l e *); // w s k a ź n i k do f u n k c j i

3

(4)

// i n i c j a l i z a c j a p a r a m e t r ó w :

n = . . . ; // i l o ś ć z m i e n n y c h w u k ł a d z i e R R Z 1 dt = . . . . ;

t m a x = . . . ;

N =( int ) t m a x / dt ; // i l o ś ć k r o k ó w c z a s o w y c h t =0;

f = p o c h o d n e ; // p r z y p i s u j e m y w s k a ź n i k do f u n k c j i

s =( d o u b l e *) m a l l o c ( n * s i z e o f ( d o u b l e )); // t a b l i c a r o z w i ą z a ń // w a r u n k i p o c z ą t k o w e :

s [ 0 ] = . . . ; s [ 1 ] = . . . ;

. . .

s [ n - 1 ] = . . . ; // s y m u l a c j a w c z a s i e :

for ( i =1; i <= N ; i + + ) {

r k 4 _ v e c ( t , dt , n , s , f );

t = t + dt ;

// z a p i s w y n i k o w do p l i k u }

r e t u r n ; }

4

Cytaty

Powiązane dokumenty

Wyniki numeryczne porównaj z rozwiązaniami analitycznymi (energie własne oraz funkcje falowe).. Opracuj program do numerycznego rozwiązywania jednowymiarowego równania

Wyznacz numerycznie trajektorię i zależności położenia i prędkości od czasu ciała w rzucie ukośnym w jednorodnym polu grawitacyjnym uwzględniając siły oporu oraz

Zawartość przestrzeni roboczej można łatwo zapisać do pliku poleceniem save.. Polecenie save nazwapliku utworzy plik nazwapliku.mat i zapisze w nim wszystkie zmienne z

Zaprojektuj i przeprowadź eksperyment numeryczny pozwalający wyznaczyć najmniejszą liczbę dodatnią reprezentowaną dokładnie w arytmetykach podwójnej i

Zaimplementuj funkcję wyznaczającą miejsce zerowe metodą Newtona, która przyjmuje jako argumenty uchwyty do dwóch funkcji (obliczającej wartość wyrażenia oraz pochodną

Napisz funkcję, która dla podanych współrzędnych punktów oraz współczynników wielomianów dla interpolującej funkcji sklejanej stopnia trzeciego (z poprzedniego

Prosz¸e znaleźć najlepszy w sensie najmniejszych kwadratów wielomian aproksymuj¸ acy dla tych danych i potwierdzić instrukcj¸ a wewn¸etrzn¸ a OCTAVE.. W każdym zadaniu

[r]