Algorytm Rungego-Kutty

Algorytm Rungego-Kutty jest magiczną formułą zastosowaną w większości symulacji fizycznych myPhysicsLab. Algorytm Rungego-Kutty pozwala nam rozwiązywać równanie różniczkowe numerycznie (czyli w przybliżeniu); wiadomo, że jest bardzo dokładny i dobrze się sprawdza w przypadku wielu problemów.

Rozważmy problem jednej zmiennej

x' = f (t, x)

z warunkiem początkowym x(0) = x0 . Załóżmy, że xn jest wartością zmiennej po czasie tn . Wzór iteracyjny według metody Runge-Kutta bierze xn i tn i oblicza przybliżenie dla xn+1 w momencie chwilę późniejszym, tn+h . Używa średniej ważonej przybliżonych wartości f (t, x) w kilku momentach z przedziału (tn, tn+h) . Wzór wygląda następująco

xn+1 = xn + h6 (a + 2 b + 2 c + d)

gdzie

a = f (tn, xn)
b = f (tn + h2, xn + h2 a)
c = f (tn + h2, xn + h2 b)
d = f (tn + h, xn + h c)

Aby uruchomić symulację, zaczynamy od x0 i znajdujemy x1 wykorzystując powyższy wzór. Następnie podstawiamy x1, żeby znaleźć x2 i tak dalej.

Algorytm Rungego-Kutty dla wielu zmiennych

W przypadku wielu zmiennych algorytm Runge-Kutta wygląda podobnie do poprzednich równań, z tym że zmienne stają się wektorami.

Algorytm Runge-Kutta jest dość prosty, ale aby go dokładnie opisać, musimy wprowadzić pewną notację. Załóżmy, że mamy m zmiennych x1, x2, ..., xm , z których każda zmienia się w czasie. Na przykład w symulacji pojedynczej sprężyny, x1 to położenie, x2 to prędkość. Załóżmy dalej, że mamy m równań różniczkowych dla tych m zmiennych

x1' = f1(x1, x2, ..., xm)
x2' = f2(x1, x2, ..., xm)
...
xm' = fm(x1, x2, ..., xm)

Zauważ, że po prawej stronie żadnego z tych równań nie ma żadnych pochodnych, a po lewej stronie są tylko pierwsze pochodne. Te równania mogą być zestawione w formie wektorowej jako

x' = f (x)

gdzie x = (x1, x2, ..., xm) i pozwalamy na jakieś luźne pojęcie „wektora funkcji” gdzie f = (f1, f2, ..., fm) . Następnie oznaczamy nasze stany czasowe xn, xn+1 , które są oddzielone przedziałem czasowym długości h . To znaczy, xn jest wartością m zmiennych po czasie tn . A x1,n jest wartością pierwszej zmiennej x1 po czasie tn .

xn = (x1,n, x2,n, ..., xm,n)
xn+1 = (x1,n+1, x2,n+1, ..., xm,n+1)

Załóżmy, że mamy stan symulacji po czasie tn jako xn . Aby obliczyć stan chwilę h później i umieścić wyniki w xn+1 , algorytm Runge-Kutta wykonuje następujące czynności:

an = f(xn)
bn = f(xn + h2 an)
cn = f(xn + h2 bn)
dn = f(xn + h cn)
xn+1 = xn + h6 (an + 2 bn + 2 cn + dn)

Nowy wektor xn+1 daje stan symulacji po upływie małego czasu h . Aby bardziej szczegółowo opisać powyższe, możemy usunąć notację wektorową i napisać algorytm Runge-Kutta w następujący sposób:

xj, n = fj(x1,n, x2,n, . . . , xm,n)
xj, n = fj( (x1, n + h2 x1, n), (x2, n + h2 x2, n), . . . , (xm, n + h2 xm, n) )
xj, n = fj( (x1,n + h2 x1,n), (x2,n + h2 x2,n), . . . , (xm,n + h2 xm,n) )
xj, n = fj( (x1,n + h x1,n), (x2,n + h x2,n), . . . , (xm,n + h xm,n) )
xj, n+1 = xj, n + h6 (xj, n + 2 xj, n + 2 xj, n + xj, n)

Powyższe równania są stosowane do każdej zmiennej j=(1, ..., m) , aby uzyskać pełny zestaw zmiennych w wektorze xn+1 .

Czas jako zmienna

Większość symulacji myPhysicsLab nie ma równań różniczkowych, które zależą wyraźnie od czasu. Oznacza to, że nie zobaczysz zmiennej t po prawej stronie równań różniczkowych. Jedna symulacja, która ma zależność od czasu, to Drgania wymuszone (chaotyczne) wahadła ponieważ siła wymuszająca (która skręca wahadło) zmienia się w czasie zgodnie z cos(k t) .

Kiedy czas pojawia się wyraźnie w równaniach różniczkowych, możemy dodać zmienną czasową t do wektora stanu x . Załóżmy, że przypisujemy tę rolę zmiennej x2 . Ta nowa zmienna ma niezwykle proste równanie różniczkowe

x2' = 1

To mówi, że szybkość zmiany zmiennej x2 jest stała. Ponieważ liczymy pochodne po czasie, możemy również zapisać powyższe równanie jako

$$x_2' = \frac{d}{d t} x_2 = 1$$

To bardzo łatwo całkuje się, dając x2 = t , czyli to, co chcieliśmy: czas jako zmienna. Załóżmy, że w symulacji wahadła wymuszonego ustawiliśmy x2 w ten sposób. Wtedy siła wymuszająca dana jest wzorem cos(k x2) .

Można zapytać: Po co czas jako zmienna? Znamy już wartość t w każdym kroku czasowym! Algorytm Runge-Kutta działa poprzez uśrednienie przewidywanych oszacowań w różnych punktach w przedziale czasu od t do t+h . Dlatego, gdy równania różniczkowe zależą w sposób wyraźny od t , musimy również znać wartość t w tych punktach w przedziale czasowym. Wprowadzenie czasu jako zmiennej sprawia, że kod komputerowy jest przejrzystszy.

Czas bezpośrednio

Jeśli chcesz, możesz uniknąć traktowania czasu jako dodatkowej zmiennej. Poniżej przedstawiono równoważne sformułowanie algorytmu Runge-Kutta, gdzie czas t jest przekazywany jako zmienna do każdej funkcji w f .

an = f(t, xn)
bn = f(t + h2, xn + h2 an)
cn = f(t + h2, xn + h2 bn)
dn = f(t + h, xn + h cn)
xn+1 = xn + h6 (an + 2 bn + 2 cn + dn)

Jest to odpowiednik formuły, w której czas występuje jako jedna ze zmiennych x . Czy używasz tego sformułowania, czy wcześniejszego (bardziej przejrzystego) zależy wyłącznie od ciebie.

Dostępny jest kod źródłowy algorytmu Runge-Kutta.

Opublikowano po raz pierwszy w kwietniu 2001 roku.

Źródło: