Metoda Runge-Kutta drugiego rzędu

Równania różniczkowe i całkowe. Równania różnicowe. Transformata Laplace'a i Fouriera oraz ich zastosowanie w równaniach różniczkowych.
Fines40
Użytkownik
Użytkownik
Posty: 5
Rejestracja: 20 paź 2022, o 17:56
Płeć: Mężczyzna
wiek: 22
Podziękował: 1 raz

Metoda Runge-Kutta drugiego rzędu

Post autor: Fines40 »

Cześć , czy ktoś z was byłby tak miły pomóc mi w rozwiązaniu zadania w którym muszę napisać równanie Rungego-Kutty drugiego rzędu dla równania
\(\displaystyle{ y' = −y \cdot \sin(x) }\)
Muszę bazować na poniżej podanym wzorze:
\(\displaystyle{ y_{n+1}=y_n+12\cdot h\cdot f(x_n;y_n)+12\cdot h\cdot f(x_n+h;y_n+h\cdot f(x_n;y_n)) }\)
I oblicz \(\displaystyle{ y_5}\) przyjmując \(\displaystyle{ y_0=1}\) oraz \(\displaystyle{ h=0,1}\) :)
Ostatnio zmieniony 20 paź 2022, o 18:36 przez Jan Kraszewski, łącznie zmieniany 2 razy.
Powód: Punkt 2.7 instrukcji LaTeX-a. Funkcje matematyczne należy zapisywać: sinus - \sin, logarytm - \log, logarytm naturalny - \ln itd. Symbol mnożenia to \cdot. Poprawa wiadomości. Używaj indeksów dolnych.
janusz47
Użytkownik
Użytkownik
Posty: 7918
Rejestracja: 18 mar 2009, o 16:24
Płeć: Mężczyzna
Podziękował: 30 razy
Pomógł: 1671 razy

Re: Metoda Runge-Kutta drugiego rzędu

Post autor: janusz47 »

Skąd ten wzór, na którym należy bazować ze współczynnikami 12 ?

Jak obliczmamy współczynniki \(\displaystyle{ k_{1}, k_{2} ? }\)
janusz47
Użytkownik
Użytkownik
Posty: 7918
Rejestracja: 18 mar 2009, o 16:24
Płeć: Mężczyzna
Podziękował: 30 razy
Pomógł: 1671 razy

Re: Metoda Runge-Kutta drugiego rzędu

Post autor: janusz47 »

Argumenty funkcji \(\displaystyle{ f }\) oddzielamy przecinkami.
janusz47
Użytkownik
Użytkownik
Posty: 7918
Rejestracja: 18 mar 2009, o 16:24
Płeć: Mężczyzna
Podziękował: 30 razy
Pomógł: 1671 razy

Re: Metoda Runge-Kutta drugiego rzędu

Post autor: janusz47 »

Metoda Runge-Kutta rzędu 2 i 4 w programie Octave dla zagadnienia początkowego: \(\displaystyle{ y' = -y\cdot \sin(t), \ \ y(0)=1.}\)

z \(\displaystyle{ h = 0,1}\) i \(\displaystyle{ n= 10.}\)

Kod: Zaznacz cały

function rk2_4(f,a,b,y0,n,order)
 % Rozwiązanie zagadnienia początkowego y'=f(t,y), y(a)=y0  metodą Runge-Kutta rzędu 2 lub 4.
fprintf('\n')
disp([' Metoda Runge-Kutta  rzędu = ',num2str(order)])
h=(b-a)/n;
y=y0;
if (order==2)
disp('_________________________________________________________________________')
disp(' t          k1           k2           y                            ')
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,y+h*k1);
 y=y+h*(k1+k2)/2;
 t=t+h;
 g=exp(-cos(t));
 g='n';
 if (g~='n')
 err=abs(g-y);
 fprintf('%6.2f %12.6f %12.6f %12.6f %12.6f  %8.2e\n',t, k1, k2, y,g,err)
 else
 fprintf('%6.2f %12.6f %12.6f %12.6f\n',t,k1,k2,y)
 end
 end
end
if (order==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(-cos(t));
 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
function f=f1(t,y)
  f=-y*sin(t);

 > rk2_4('f1',0,1,1,10,2)

 Metoda Runge-Kutta  rzędu = 2
______________________________________________
 t          k1           k2           y
______________________________________________

  0.00           1.000000     1.000000 0.00
  0.10    -0.000000    -0.099833     0.995008
  0.20    -0.099335    -0.195704     0.980256
  0.30    -0.194747    -0.283930     0.956323
  0.40    -0.282613    -0.361404     0.924122
  0.50    -0.359870    -0.425794     0.884838
  0.60    -0.424214    -0.475664     0.839845
  0.70    -0.474212    -0.510493     0.790609
  0.80    -0.509324    -0.530612     0.738612
  0.90    -0.529848    -0.537071     0.685267
  1.00    -0.536788    -0.531463     0.631854 
  
  >> rk2_4('f1',0,1,1,10,4)
  
   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    -0.000000    -0.049979    -0.049854    -0.099336     0.995017     0.369722 6.25e-01
  0.20    -0.099336    -0.147951    -0.147588    -0.194747     0.980264     0.375286 6.05e-01
  0.30    -0.194748    -0.240112    -0.239551    -0.282609     0.956319     0.384683 5.72e-01
  0.40    -0.282612    -0.323074    -0.322381    -0.359854     0.924096     0.398096 5.26e-01
  0.50    -0.359860    -0.394124    -0.393379    -0.424176     0.884779     0.415787 4.69e-01
  0.60    -0.424186    -0.451377    -0.450666    -0.474137     0.839739     0.438088 4.02e-01
  0.70    -0.474152    -0.493851    -0.493255    -0.509198     0.790446     0.465407 3.25e-01
  0.80    -0.509219    -0.521444    -0.521027    -0.529655     0.738383     0.498223 2.40e-01
  0.90    -0.529683    -0.534835    -0.534642    -0.536515     0.684963     0.537079 1.48e-01
  1.00    -0.536550    -0.535338    -0.535387    -0.531325     0.631475     0.582572 4.89e-02
  
Ostatnio zmieniony 22 paź 2022, o 16:49 przez Jan Kraszewski, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
janusz47
Użytkownik
Użytkownik
Posty: 7918
Rejestracja: 18 mar 2009, o 16:24
Płeć: Mężczyzna
Podziękował: 30 razy
Pomógł: 1671 razy

Re: Metoda Runge-Kutta drugiego rzędu

Post autor: janusz47 »

Program w Octave, uwzględniający poprawnie obliczoną wartość dokładną rozwiązania zagadnienia początkowego:

\(\displaystyle{ y'(t) = -t\cdot \sin(t), \ \ y(0)=1 }\) dla \(\displaystyle{ h=0,1 }\) i \(\displaystyle{ n=10.}\)

Kod: Zaznacz cały

function rk2_4(f,a,b,y0,n,order)
 % Rozwiązanie zagadnienia początkowego y'=f(t,y), y(a)=y0  metodą Runge-Kutta rzędu 2 lub 4.
fprintf('\n')
disp([' Metoda Runge-Kutta  rzędu = ',num2str(order)])
h=(b-a)/n;
y=y0;
if (order==2)
disp('_________________________________________________________________________')
disp(' t          k1           k2           y                            ')
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,y+h*k1);
 y=y+h*(k1+k2)/2;
 t=t+h;
 g=e*exp(-cos(t));
 g='n';
 if (g~='n')
 err=abs(g-y);
 fprintf('%6.2f %12.6f %12.6f %12.6f %12.6f  %8.2e\n',t, k1, k2, y,g,err)
 else
 fprintf('%6.2f %12.6f %12.6f %12.6f\n',t,k1,k2,y)
 end
 end
end
if (order==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=e*exp(-cos(t));
 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
function f=f1(t,y)
  f=-y*sin(t);

                                                                                                                                                                                             
>> rk2_4('f1',0,1,1,10,2)

 Metoda Runge-Kutta  rzędu = 2
_________________________________________________________________________
 t          k1           k2           y
__________________________________________________________________________

  0.00           1.000000     1.000000 0.00
  0.10    -0.000000    -0.099833     0.995008
  0.20    -0.099335    -0.195704     0.980256
  0.30    -0.194747    -0.283930     0.956323
  0.40    -0.282613    -0.361404     0.924122
  0.50    -0.359870    -0.425794     0.884838
  0.60    -0.424214    -0.475664     0.839845
  0.70    -0.474212    -0.510493     0.790609
  0.80    -0.509324    -0.530612     0.738612
  0.90    -0.529848    -0.537071     0.685267
  1.00    -0.536788    -0.531463     0.631854
  
  >>  rk2_4('f1',0,1,1,10,4)

 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    -0.000000    -0.049979    -0.049854    -0.099336     0.995017     1.005008 9.99e-03
  0.20    -0.099336    -0.147951    -0.147588    -0.194747     0.980264     1.020133 3.99e-02
  0.30    -0.194748    -0.240112    -0.239551    -0.282609     0.956319     1.045676 8.94e-02
  0.40    -0.282612    -0.323074    -0.322381    -0.359854     0.924096     1.082138 1.58e-01
  0.50    -0.359860    -0.394124    -0.393379    -0.424176     0.884779     1.130226 2.45e-01
  0.60    -0.424186    -0.451377    -0.450666    -0.474137     0.839739     1.190846 3.51e-01
  0.70    -0.474152    -0.493851    -0.493255    -0.509198     0.790446     1.265108 4.75e-01
  0.80    -0.509219    -0.521444    -0.521027    -0.529655     0.738383     1.354312 6.16e-01
  0.90    -0.529683    -0.534835    -0.534642    -0.536515     0.684963     1.459932 7.75e-01
  1.00    -0.536550    -0.535338    -0.535387    -0.531325     0.631475     1.583595 9.52e-01
Fines40
Użytkownik
Użytkownik
Posty: 5
Rejestracja: 20 paź 2022, o 17:56
Płeć: Mężczyzna
wiek: 22
Podziękował: 1 raz

Re: Metoda Runge-Kutta drugiego rzędu

Post autor: Fines40 »

W opisie przedstawiłem pełną treść zadania które otrzymałem.
Zakładam że wzór na którym mam bazować został wymyślony przez autora zadania , który umieścił tam akurat współczynnik \(\displaystyle{ 12.}\)
Jeżeli dobrze myślę \(\displaystyle{ k_1 = f(x_n,y_n)}\) a \(\displaystyle{ k_2 = f(x_n+h,y_n+h\cdot f(x_n,y_n).}\)
Ostatnio zmieniony 23 paź 2022, o 01:34 przez Jan Kraszewski, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości. Używaj indeksów dolnych.
janusz47
Użytkownik
Użytkownik
Posty: 7918
Rejestracja: 18 mar 2009, o 16:24
Płeć: Mężczyzna
Podziękował: 30 razy
Pomógł: 1671 razy

Re: Metoda Runge-Kutta drugiego rzędu

Post autor: janusz47 »

Wartości współczynników \(\displaystyle{ k_{1}, \ \ k_{2} }\) nie można sobie wymyślać . Należy je obliczać w każdym kroku iteracji. Patrz program \(\displaystyle{ rk2 \_4.}\)

Przy \(\displaystyle{ k_{2} }\) brakuje prawego zamknięcia nawiasem.
Fines40
Użytkownik
Użytkownik
Posty: 5
Rejestracja: 20 paź 2022, o 17:56
Płeć: Mężczyzna
wiek: 22
Podziękował: 1 raz

Re: Metoda Runge-Kutta drugiego rzędu

Post autor: Fines40 »

Rozumiem , w takim razie w jaki sposób jestem w stanie obliczyć \(\displaystyle{ y_5}\) tak jak jest to podane w treści zadania ?
Ostatnio zmieniony 25 paź 2022, o 12:25 przez Jan Kraszewski, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
janusz47
Użytkownik
Użytkownik
Posty: 7918
Rejestracja: 18 mar 2009, o 16:24
Płeć: Mężczyzna
Podziękował: 30 razy
Pomógł: 1671 razy

Re: Metoda Runge-Kutta drugiego rzędu

Post autor: janusz47 »

Sposób ręcznego obliczania kolejnych przybliżeń rozwiązań równania różniczkowego można odczytać z kodu programu Octave \(\displaystyle{ RK2\_4 }\)

\(\displaystyle{ y_{n+1}= y_{n} + \frac{h}{2} (k_{1}+k_{2})= \frac{h}{2}[f(x_{n}),y_{n})+ f(x_{n}+h, y_{n}+ hf(x_{n},y_{n})], n=0,1,2,..., N.}\)

\(\displaystyle{ N=5:}\)

0.
\(\displaystyle{ x_{0} = 0, \ \ y_{0}=1,\ \ f(x_{0}, y_{0}) = -1\cdot \sin(0) = 0.}\)

1.
\(\displaystyle{ y_{1} = y_{0} + \frac{h}{2}\left[ f(x_{0},y_{0}) + f (x_{0}+h ,y_{0}+hf(x_{0},y_{0}))\right ] }\)

\(\displaystyle{ y_{1} = 1 + \frac{0.1}{2}\left[ 0 + f(0+ 0.1, \frac{0.1}{2} f( 0,0)\right] = 1 + 0.05 \left [f( 0.1, 0.05\cdot 0 \right] = 1 + 0.05\cdot f(0.1,0)= }\)
\(\displaystyle{ = 1+ 0.05\cdot(-0\cdot \sin(0.1) = 1+0 = 1. }\)

2.
\(\displaystyle{ y_{2} = y_{1}+ \frac{h}{2}\left[ f(x_{1},y_{1})+ f(x_{1}+h, y_{1}+ hf(x_{1},y_{1})\right] = ... }\)

3.
......
4.
......

5.
......
janusz47
Użytkownik
Użytkownik
Posty: 7918
Rejestracja: 18 mar 2009, o 16:24
Płeć: Mężczyzna
Podziękował: 30 razy
Pomógł: 1671 razy

Re: Metoda Runge-Kutta drugiego rzędu

Post autor: janusz47 »

Sposób ręcznego obliczania kolejnych przybliżeń rozwiązań równania różniczkowego można odczytać z kodu programu Octave \(\displaystyle{ RK2\_4 }\)

\(\displaystyle{ y_{n+1}= y_{n} + \frac{h}{2} (k_{1}+k_{2})= \frac{h}{2}[f(x_{n}),y_{n})+ f(x_{n}+h, y_{n}+ hf(x_{n},y_{n})], n=0,1,2,..., N.}\)

\(\displaystyle{ N=5:}\)

0.
\(\displaystyle{ x_{0} = 0, \ \ y_{0}=1,\ \ f(x_{0}, y_{0}) = -1\cdot \sin(0) = 0.}\)

1.
\(\displaystyle{ y_{1} = y_{0} + \frac{h}{2}\left[ f(x_{0},y_{0}) + f (x_{0}+h ,y_{0}+hf(x_{0},y_{0}))\right ] }\)

\(\displaystyle{ y_{1} = 1 + \frac{0.1}{2}\left[ 0 + f(0+ 0.1, \frac{0.1}{2} f( 0,0)\right] = 1 + 0.05 \left [f( 0.1, 0.05\cdot 0 \right] = 1 + 0.05\cdot f(0.1,0)= }\)
\(\displaystyle{ = 1+ 0.05\cdot(-0\cdot \sin(0.1) = 1+0 = 1. }\)

2.
\(\displaystyle{ y_{2} = y_{1}+ \frac{h}{2}\left[ f(x_{1},y_{1})+ f(x_{1}+h, y_{1}+ hf(x_{1},y_{1})\right] = ... }\)

3.
......
4.
......

5.
......
ODPOWIEDZ