Metoda Eulera to najprostsza metoda numeryczna rozwiązywania zagadnienia początkowego:
\(\displaystyle{ \frac{dy}{dt} = f(t, y), \ \ y(a)=y(0) }\) w przedziale \(\displaystyle{ [a, b].}\)
Na czym polega ta metoda?
Dzielimy przedział \(\displaystyle{ [a, b] }\) na \(\displaystyle{ N }\) równych podprzedziałów \(\displaystyle{ t_{i}= a + ih, \ \ i=0,1,...,N, }\)
z długością kroku \(\displaystyle{ h = \frac{b-a}{N}. }\)
Startujemy od warunku początkowego \(\displaystyle{ y_{0},}\) i generujemy ciąg wartości: \(\displaystyle{ y_{1}, y_{2},..., y_{N},}\) aproksymujących dokładne rozwiązanie w punktach \(\displaystyle{ t_{1}, t_{2},...,t_{N}.}\)
Zakładamy, że funkcja \(\displaystyle{ y(t) }\) jest co najmniej dwukrotnie rózniczkowalną. Rozwijając w szrereg Taylora wokół punktów \(\displaystyle{ t_{i}, \ \ i=0,1,2, ..., N-1. }\)
mamy
\(\displaystyle{ y(t_{i+1})= y(t_{i}+h)= y(t_{i})+ h\cdot y'(t_{i})+ \frac{h^2}{2}y^{''}(\zeta), \ \ \zeta \in [t_{i}, t_{i}+h].}\)
Odrzucając ostatni składnik - składnik błędu:
\(\displaystyle{ y(t_{i}+h) \approx y(t_{i}) + h\cdot f(t_{i},y_{i}) \ \ (1)}\)
Jeśli oznaczymy \(\displaystyle{ y_{i} \approx y(t_{i}) }\) to równanie \(\displaystyle{ (1) }\) możemy napisać w postaci:
\(\displaystyle{ y_{i+1} = y_{i} +h\cdot f(t_{i},y_{i}), \ \ i= 0,1,2,..., N.}\)
Jest to równanie metody Eulera.
Algorytm metody:
\(\displaystyle{ h \leftarrow \frac{b-a}{N} }\)
\(\displaystyle{ y(a) \leftarrow y_{0} }\)
\(\displaystyle{ dla \ \ i = 0,1,...,N-1, }\)
\(\displaystyle{ y_{i+1} \rightarrow y_{i} +h\cdot f(t_{i},y_{i}). }\)
Z analizą błędu metody i analizą jej zbieżności można zapoznać się na przykład w podręczniku:
JANINA I MICHAŁ JANKOWSCY Przegląd metod i algorytmów numerycznych.Część 1.WNT Warszawa 1981.
Program w MATLAB
Kod: Zaznacz cały
function euler(f,a,b,y0,n)
% Rozwiązanie zagadnienia początkowego y'=f(x,y), y(a)=y0
% Metodą Eulera.
fprintf('\n')
disp('Metoda Eulera')
disp('_________________________________________ ')
disp(' ti f(ti,yi) yi ')
disp('__________________________________________')
fprintf('\n')
h=(b-a)/n;
y=y0;
fprintf('%6.2f %12.6f\n',a,y)
for i=1:n
t=a+(i-1)*h;
m=feval(f,t,y);
y=y+h*m;
t=t+h;
fprintf('%6.2f %12.6f %12.6f\n',t,m,y)
end
Kod: Zaznacz cały
function f=f1(t,y)
f=2*t-y;
euler('f1',0,1,-1,10)
Metoda Eulera
_________________________________________
ti f(ti,yi) yi
__________________________________________
0.00 -1.000000
0.10 1.000000 -0.900000
0.20 1.100000 -0.790000
0.30 1.190000 -0.671000
0.40 1.271000 -0.543900
0.50 1.343900 -0.409510
0.60 1.409510 -0.268559
0.70 1.468559 -0.121703
0.80 1.521703 0.030467
0.90 1.569533 0.187420
1.00 1.612580 0.348678