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,'-*') endEn 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,'-*') endVamos 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.2354y 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.0006que 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