Metoda Runge-Kutta Rzędu 4

Równania różniczkowe i całkowe. Równania różnicowe. Transformata Laplace'a i Fouriera oraz ich zastosowanie w równaniach różniczkowych.
janusz47
Użytkownik
Użytkownik
Posty: 7910
Rejestracja: 18 mar 2009, o 16:24
Płeć: Mężczyzna
Podziękował: 30 razy
Pomógł: 1670 razy

Metoda Runge-Kutta Rzędu 4

Post autor: janusz47 »

Metoda Runge-Kutta rzędu 4

Metoda Runge-Kutta rzędu 4 to najczęściej stosowana metoda w obliczeniach numerycznych, oparta na następującym schemacie iteracyjnym:

\(\displaystyle{ y_{i+1} = y_{i} + \frac{h}{6}\left[k_{1}+2k_{2}+2k_{3}+k_{4}\right], \ \ i=0,1,2,...,N-1 }\)

gdzie:

\(\displaystyle{ k_{1}= f(t_{i}, y_{i}), }\)

\(\displaystyle{ k_{2}= f(t_{i}+\frac{h}{2}, y_{i}+\frac{h}{2} k_{1}).}\)

\(\displaystyle{ k_{3} = f\left( t_{i} + \frac{h}{2}, y_{i}+\frac{h}{2}k_{2}\right),}\)

\(\displaystyle{ k_{4}=f(t_{i}+h, y_{i}+ hk_{3} }\)

Analiza błędów zaokrągleń oraz analiza zbieżności metody jest przeprowadzona w podręczniku

JANINA i MICHAŁ JANKOWSCY Przegląd metod i algorytmów numerycznych. Część 1.
Wydawictwa Naukowo -Techniczne Warszawa 1981.

Program w MATLAB

Kod: Zaznacz cały

function rk4(f,a,b,y0,n,rzad) 
% Rozwiązanie zagadnienia początkowego y'=f(t,y), y(a)=y0  metodą Runge-Kuttarzędu 4. 
fprintf('\n') 
disp([' Metoda Runge-Kutta rzędu 4 ']) 
h=(b-a)/n; 
y=y0; 
if (rzad==4) 
disp('________________________________________________________________________________________________') 
disp('   t          k1            k2           k3           k4         y          dokł      błąd  ') 
disp('________________________________________________________________________________________________') 
fprintf('\n')
fprintf('%6.2f         ----        ----         ----          ---- %12.6f %12.6f %4.2f\n',a,y,y,0) 
 for i=1:n 
 t=a+(i-1)*h; 
 k1=feval(f,t,y); 
 k2=feval(f,t+h/2,y+h*k1/2); 
 k3=feval(f,t+h/2,y+h*k2/2); 
 k4=feval(f,t+h,y+h*k3); 
 y=y+h*(k1+2*k2+2*k3+k4)/6; 
 t=t+h;  
 g=exp(-t)+2*t-2; 
 if (g~='n') 
 err=abs(g-y); 
 fprintf('%6.2f %12.6f %12.6f %12.6f %12.6f %12.6f %12.6f %8.2e\n', t, k1, k2, k3, k4, y, g, err) 
 else 
 fprintf('%6.2f %12.6f %12.6f %12.6f %12.6f %12.6f\n',t,k1,k2, k3, k4, y) 
 end 
 end 
end 

Przykład

Kod: Zaznacz cały

function f=f1(t,y)
f=2*t-y; 

 Metoda Runge-Kutta rzędu 4 
________________________________________________________________________________________________
   t          k1            k2           k3           k4         y          dokł      błąd  
________________________________________________________________________________________________

  0.00         ----        ----         ----          ----    -1.000000    -1.000000 0.00
  0.10     1.000000     1.050000     1.047500     1.095250    -0.895162    -0.895163 8.20e-08
  0.20     1.095163     1.140404     1.138142     1.181348    -0.781269    -0.781269 1.48e-07
  0.30     1.181269     1.222206     1.220159     1.259253    -0.659182    -0.659182 2.01e-07
  0.40     1.259182     1.296222     1.294370     1.329745    -0.529680    -0.529680 2.43e-07
  0.50     1.329680     1.363196     1.361520     1.393528    -0.393469    -0.393469 2.75e-07
  0.60     1.393469     1.423796     1.422279     1.451241    -0.251188    -0.251188 2.98e-07
  0.70     1.451188     1.478629     1.477257     1.503462    -0.103414    -0.103415 3.15e-07
  0.80     1.503414     1.528244     1.527002     1.550714     0.049329     0.049329 3.26e-07
  0.90     1.550671     1.573137     1.572014     1.593469     0.206570     0.206570 3.31e-07
  1.00     1.593430     1.613759     1.612742     1.632156     0.367880     0.367879 3.33e-07
ODPOWIEDZ