function yaprox=aproxEuler(f,h,x0,y0,xf)
nmax=round((xf-x0)/h);
x=x0:h:xf;
y=y0*ones(size(x));
for n=1:nmax
y(n+1)=y(n)+h*f(x(n),y(n));
end
yaprox=y(2:end);
plot(x,y,'-*')
end
En primer lugar vamos a cambiar los nombres de las variables para adaptarlos a las que utilizamos en sistemas: $t$ es la variable independiente y $x$ reúne las dos variables incógnitas, $x_1$ y $x_2$. Con esta notación la función es
function xaprox=aproxEuler(f,h,t0,x0,tf)
nmax=round((tf-t0)/h);
t=t0:h:tf;
x=x0*ones(size(t));
for n=1:nmax
x(n+1)=x(n)+h*f(t(n),x(n));
end
xaprox=x(2:end);
plot(t,x,'-*')
end
Vamos ahora a adaptar este código a sistemas de ecuaciones. Se irán sugiriendo las modificaciones necesarias y deberás ir pulsando 'Continuar' cuando hayas realizado cada una. Empezamos con:
function xaprox=aproxEulersist(f,h,t0,x0,tf)
x(1,:)=x0;
x(n+1,:)=x(n,:)+h*f(t(n),x(n,:));
xaprox=x(2:nmax+1,:)
function xaprox=aproxEulersist(f,h,t0,x0,tf)
nmax=round((tf-t0)/h);
t=t0:h:tf;
x(1,:)=x0;
for n=1:nmax
x(n+1,:)=x(n,:)+h*f(t(n),x(n,:));
end
xaprox=x(2:nmax+1,:);
plot(t,x,'-*')
end
>> f=@ (t,x) [x(2) t^3-3*t*x(1)-t^2*x(2)]; %%% definición de la función f >> xaprox=aproxEulersist(f,1/8,0,[0 1],1)Obtendremos en la ventana de comandos
xaprox =
0.1250 1.0000
0.2500 0.9924
0.3741 0.9632
0.4945 0.9003
0.6070 0.7950
0.7064 0.6445
0.7869 0.4532
0.8436 0.2354
y en la ventana de figuras

vt=1/8:1/8:1; yest0=vt-vt.^4/3+vt.^5/20+vt.^7/18-vt.^8/140-vt.^10/162+vt.^11/1400; %% aprox. con Taylor, vector fila 1x8 f=@ (t,x) [x(2) t^3-3*t*x(1)-t^2*x(2)]; xest1=aproxEulersist(f,.125,0,[0,1],1) ; % método de Euler yest1=xest1(:,1); % tomamos la primera columna de xest1, es un vector columna 8x1 comp1=abs(yest0-yest1')De la ejecución de este fichero obtendremos
comp1 =
0.0001 0.0012 0.0052 0.0133 0.0262 0.0436 0.0638 0.0840
function xaprox=aproxEulermejsist(f,h,t0,x0,tf)
nmax=round((tf-t0)/h);
t=t0:h:tf;
x(1,:)=x0;
for n=1:nmax
aux(n,:)=x(n,:)+h*f(t(n),x(n,:));
x(n+1,:)=x(n,:)+h*(f(t(n),x(n,:))+f(t(n+1),aux(n,:)))/2;
end
xaprox=x(2:nmax+1,:);
plot(t,x,'-*')
end
xest2=aproxEulermejsist(f,.125,0,[0,1],1) ; % método de Euler mejorado yest2=xest2(:,1); comp2=abs(yest0-yest2')Cuando lo ejecutemos, obtendremos
comp1 =
0.0001 0.0012 0.0052 0.0133 0.0262 0.0436 0.0638 0.0840
comp2 =
0.0001 0.0003 0.0006 0.0010 0.0013 0.0013 0.0011 0.0006
que nos permite observar cómo efectivamente los resultados mejoran.
f=@ (t,x) [x(2); t^3-3*t*x(1)-t^2*x(2)]; %vector columna con funciones del sistema [t,xest3]=ode45(f,0:1/8:1,[0,1]); % xest3 es una matriz 9x2Escribe las líneas que añadimos a nuestro fichero para hallar esa aproximación y compararla con la de Tylor; pulsa en 'Ver' cuando lo tengas.
f=@ (t,x) [x(2); t^3-3*t*x(1)-t^2*x(2)]; %vector columna con funciones del sistema [t,xest3]=ode45(f,0:1/8:1,[0,1]); % xest3 es una matriz 9x2 yest3=xest3(2:9,1); % tomamos las filas 2 a 9 de la primera columna comp3=abs(yest0-yest3') % comparamos con los valores obtenidos con TaylorLa ejecución del fichero completo nos proporciona
comp1 =
0.0001 0.0012 0.0052 0.0133 0.0262 0.0436 0.0638 0.0840
comp2 =
0.0001 0.0003 0.0006 0.0010 0.0013 0.0013 0.0011 0.0006
comp3 =
1.0e-003 *
0.0000 0.0000 0.0000 0.0001 0.0010 0.0110 0.0786 0.4302