Diferencijalne jednačine
Razmatraćemo Košijev problem
pri čemu ćemo određivati približne vrednosti tačnog rešenja u istaknutim tačkama
Na osnovu Njutn-Lajbnicove teoreme znamo da je
odakle je
Ako iskoristimo neku kvadraturnu formulu za aproksimaciju integrala na desnoj strani, tada možemo računati vrednost na osnovu vrednosti . Svakako ćemo uzeti da je U zavisnosti od odabira kvadraturne formule ćemo imati različite metode za dobijanje numeričkog rešenja datog Košijevog problema.
Ojlerova metoda
Približne vrednosti u čvorovima se računaju po formuli:
za Ovde smo koristili jednostavnu formulu pravougaonika za aproksimaciju odgovarajućeg integrala. U nastavku je data jednostavna implementacije ove metode. Druga kolona u izlaznom ispisu je kolona vrednosti dobijenih Ojlerovom metodom, a treća je kolona vrednosti tačnog rešenja u čvorovima.
% function Euler(f,a,b,h,y0,y)
% fplot(y,[a,b],'-r');
% hold on
% x = a:h:b;
% n = length(x);
% ind = 0:n-1;
% yNumerical = zeros(1,n);
% yNumerical(1) = y0;
% for i = 1:n-1
% yNumerical(i+1) = yNumerical(i)+h*f(x(i),yNumerical(i));
% end
% scatter(x,yNumerical,'b');
% legend('Tacno resenje','Numericko resenje','Location','NorthWest');
% hold off
% Res(:,1) = x;
% Res(:,2) = yNumerical;
% Res(:,3) = y(x);
% disp(Res)
% end
format short
f = @(x,y)x+y;
a = 0;
b = 1;
h = 0.1;
y0 = 1;
y = @(x)2*exp(x)-x-1;
Euler(f,a,b,h,y0,y);
Metoda Runge Kuta
Postoji više formula Runge-Kuta različite tačnosti. Ovde ćemo navesti dve, Runge-Kutovu formulu drugog i četvrtog reda.
Drugog reda
Ova metoda se može posmatrati kao vrlo jasna modifikacija Ojlerove metode:
Implementacija:
% function Runge2(f,a,b,h,y0,y)
% x = a:h:b;
% n = length(x);
% ind = 0:n-1;
% yNumerical = zeros(1,n);
% yNumerical(1) = y0;
% for i = 1:n-1
% yNumerical(i+1) = yNumerical(i)+h*f(x(i)+h/2,yNumerical(i)+(h/2)*f(x(i),yNumerical(i)));
% end
% Res(:,1) = x;
% Res(:,2) = yNumerical;
% Res(:,3) = y(x);
% disp(Res)
% end
format short
f = @(x,y)x+y;
a = 0;
b = 1;
h = 0.1;
y0 = 1;
y = @(x)2*exp(x)-x-1;
Runge2(f,a,b,h,y0,y);
Četvrtog reda
Rešenja se u ovom slučaju dobijaju vezom
gde je redom
Za sve prethodne metode je moguće odrediti aproksimaciju greške preko formule
gde su i približne vrednosti kada računamo sa korakom i , redom, a parametar koji zavisi od konkretne metode. U slučaju Ojlerove metode, , a u slučaju metoda Runge-Kuta, , odnosno .
U nastavku je data implementacija metode Runge-Kuta reda 4 za koju je određena i aproksimacija greške. Primetimo da formula za ocenu greške ima smisla samo za svaki drugi čvor. Za ostale čvorove možemo tu aproksimaciju samo da procenimo na neki način, na primer, tako što uzmemo aritmetičku sredinu susednih grešaka. U zapisu će biti ispisane kolone rešnenja prvo sa korakom , a zatim sa korakom . Poslednje kolona će kao i ranije biti kolona sa vrednostima tačnog rešanja u čvorovima.
% function Runge4(f,a,b,h,y0,y)
% x = a:h:b;
% n = length(x);
% yNumerical = zeros(1,n);
% yNum2h = zeros(1,n);
% ApproxErr = zeros(1,n);
% yNumerical(1) = y0;
% yNum2h(1) = y0;
% i = 1;
% while i<=n-1
% K1 = h*f(x(i),yNumerical(i));
% K2 = h*f(x(i)+h/2,yNumerical(i)+K1/2);
% K3 = h*f(x(i)+h/2,yNumerical(i)+K2/2);
% K4 = h*f(x(i)+h,yNumerical(i)+K3);
% yNumerical(i+1) = yNumerical(i)+(1/6)*(K1+2*K2+2*K3+K4);
% if (mod(i,2)==0)
% k1 = (2*h)*f(x(i-1),yNum2h(i-1));
% k2 = (2*h)*f(x(i-1)+h,yNum2h(i-1)+k1/2);
% k3 = (2*h)*f(x(i-1)+h,yNum2h(i-1)+k2/2);
% k4 = (2*h)*f(x(i-1)+2*h,yNum2h(i-1)+k3);
% yNum2h(i+1) = yNum2h(i-1)+(1/6)*(k1+2*k2+2*k3+k4);
% ApproxErr(i+1) = (abs(yNumerical(i+1)-yNum2h(i+1)))/15;
% ApproxErr(i) = (ApproxErr(i-1)+ApproxErr(i+1))/2;
% end
% i = i+1;
% end
% Res(:,1) = x;
% Res(:,2) = yNumerical;
% Res(:,3) = yNum2h;
% Res(:,4) = y(x);
% Res(:,5) = ApproxErr;
% disp(Res)
% end
format long
f = @(x,y)x+y;
a = 0;
b = 1;
h = 0.1;
y0 = 1;
y = @(x)2*exp(x)-x-1;
Runge4(f,a,b,h,y0,y);
MATLAB nudi i ugrađene funkcije za numeričko rešavanje diferencijalnih jednačina. Neke od njih su ode15(), ode23(), ode45()... Ovde ćemo razmotriti primer poziva funkcije ode45() koja dolazi iz familije Runge-Kutovih metoda.
format long
f = @(x,y)x+y;
X = 0:0.1:1;
y0 = 1;
[x,y] = ode45(f,X,y0);
disp([x,y]);