Metoda Runge-Kutta drugiego rzędu
-
- 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
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}\)
\(\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.
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.
-
- 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
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.}\)
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.
Powód: Poprawa wiadomości.
-
- 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
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.}\)
\(\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
-
- 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
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).}\)
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.
Powód: Poprawa wiadomości. Używaj indeksów dolnych.
-
- 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
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.
Przy \(\displaystyle{ k_{2} }\) brakuje prawego zamknięcia nawiasem.
-
- 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
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.
Powód: Poprawa wiadomości.
-
- 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
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.
......
\(\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.
......
-
- 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
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.
......
\(\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.
......