Rafał Kudelski Gr. 4
Mamy rozwiązać równanie przy danych warunkach początkowych x
i y(0)=1
= -tg(x) * y
Rozwiązanie analityczne
ln|y| =
ln|y| = ln|cosx|+C1 |e
|y| = e ln |cosx| * eC
y =
e C
* cosx
y = C + cosx
Z warunków początkowych
y(0) = 1
1 = C + cos 0
C = 1
y = cos x
Opis i porównanie metod
Metoda Eulera (metoda siecznych) jest najprostszą metodą przybliżoną dla zagadnienia początkowego
x
z warunkiem początkowym
y(x0)=y0
Ogólny wzór tej metody ma postać yi+1=yi+hf(xi,yi), i=0,1,2,..., gdzie h - krok.
Klasyczna metoda Rungea-Kutty czwartego rzędu opiera się na wzorach:
k1=hf(xi,yi)
k2=hf(xi+h/2,yi+k1/2)
k3=hf(xi+h/2,yi+k2/2)
k4=hf(xi+h,yi+k3)
y(i+1)=y(i)+((k1+2*k2+2*k3+k4)/6)
Łatwo zauważyć, że metoda Eulera jest to metoda Rungea-Kutty ale pierwszego stopnia.
Program w Matlabie
Program oblicza nam równanie różniczkowe
= -tg(x) * y metodą Eulera oraz metoda Rungea-Kutty. Następnie rysuje wykres funkcji rzeczywistej (obliczonej metodą analityczną) oraz wykres funkcji obliczona metoda Eulera i metoda Rungea-Kutty. Dalej program oblicza błędy oby metod i przedstawia na wykresie. Program wywołujemy wraz z parametrem który jest wielkością kroku.
M-plik programu:
function[X,Y]=row2(c)
x=0:c:3
y(1)=1;
for i=1:(length(x)-1)
k1=c*obliczk(x(i),y(i));
k2=c*obliczk(x(i)+0.5*c,y(i)+0.5*k1);
k3=c*obliczk((x(i)+0.5*c),(y(i)+0.5*k2));
k4=c*obliczk((x(i)+c),(y(i)+k3));
y(i+1)=y(i)+((k1+2*k2+2*k3+k4)/6);
end
y
figure(4);
plot(x,y);
title('Funkcja wyliczona metoda Rungea-Kutty');
r=cos(x)
ye(1)=1;
for i=1:(length(x)-1)
ye(i+1)=ye(i)+c*(-tan(x(i))*ye(i));
end
ye
figure(1);
plot(x,ye);
title('Funkcja wyliczona metoda Eulera');
figure(2);
fplot('cos(x)',[0 3])
title('Funkcja rzeczywista');
for i=1:((3/c)+1)
be(i)=(abs(r(i)-ye(i)))/r(i);
end
be
figure(3);
plot(x,be);
title('Blad metody Eulera');
for i=1:((3/c)+1)
b(i)=(abs(r(i)-y(i)))/r(i);
end
b
figure(5);
plot(x,b);
title('Blad metody Rungea-Kutty');
Program obliczk:
function[A]=obliczk (x,y)
A=-(tan(x)*y);
Błąd metody jest liczony zgodnie ze wzorem:
błąd = (|wartość rzeczywista - wartość obliczona|)/wartość rzeczywista
Wyniki działania programu.
Dla h = 1
>> row2(1)
x =
0 1 2 3
y =
Column 1
1
Column 2
0.529040511929454
Column 3
2.9495999335963
Column 4
7.03252270563991
r =
Column 1
1
Column 2
0.54030230586814
Column 3
-0.416146836547142
Column 4
-0.989992496600445
ye =
Column 1
1
Column 2
1
Column 3
-0.557407724654902
Column 4
-1.77536582311576
be =
Column 1
0
Column 2
0.850815717680925
Column 3
-0.33944962619404
Column 4
-0.793312403086112
b =
Column 1
0
Column 2
0.0208435052310028
Column 3
-8.08788262832837
Column 4
-8.10361212816161
dla h=0.1 podaje tylko wykresy jakie zwrócił program ponieważ obliczeń jest bardzo dużo i nie ma sensu ich tu wstawiać oraz pomijam funkcje rzeczywista gdyż jest taka sama.
dla h = 0.001 podobnie jak w poprzednim przypadku podaje tylko 4 wykresy
Z wykresów widać, że dla h = 1 wykresy zarówno w metodzie Eulera jak i w metodzie Rungea -Kutty odbiegają od wykresu funkcji rzeczywistej oraz występują duże błędy.
Wraz ze zmniejszaniem się wartości h wykresy staja się coraz dokładniejsze. Dla h = 0.1 wykres funkcji obliczony metodą Rungea - Kutty jest niemal już idealny. W tym przypadku dokładnie widać ze metoda Rungea - Kutty jest bardziej dokładna niż metoda Eulera ponieważ wykres wykonany w metodzie Eulera odbiega dużo bardziej od rzeczywistego niż wykres wykonany w metodzie Rungea - Kutty. Obserwujemy także zmniejszanie się błędu.
Dla h = 0.001 wykresy funkcji są niemal identyczne jak wykres funkcji rzeczywistej w obydwu metodach. Błędy metody są także znikome choć najmniejsze są w przypadku metody Rungea-Kutty.