f=@(t,n) 1.4-0.04*n^2/(4+t);
[vt,nest]=ode45(f,0:60,0)
plot(vt,nest) xlabel('tiempo (seg)'); ylabel('sustancia A (moles)')
nestEscrito todo seguido, con comentarios añadidos resulta
f=@(t,n) 1.4-0.04*n^2/(4+t); % definición de la función de la edo [vt,nest]=ode45(f,0:60,0); % aproximación durante el primer minuto, cada segundo plot(vt,nest) % representación de la estimación frente al tiempo xlabel('tiempo (seg)');ylabel('sustancia A (moles)') % etiquetas de los ejes nest % valor de la estimaciónCuando lo ejecutemos, mostrará en la ventana de comandos un vector columna de 61 componentes, que comienza con el valor 0 (pues $n(0)=0$) y continúa con la aproximación de $n(t)$ para cada segundo hasta la aproximación de $n(60)$, que es 40.3422; además se generará la figura
function y=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 endAdemás del nombre, ¿qué hemos de modificar en esta función para adaptarla al método de Euler mejorado? Piénsalo y pulsa en 'Ver'.
function y=aproxEulermej(f,h,x0,y0,xf) nmax=round((xf-x0)/h); x=x0:h:xf; y=y0*ones(size(x)); for n=1:nmax aux=y(n)+h*f(x(n),y(n)); y(n+1)=y(n)+h*(f(x(n),y(n))+f(x(n+1),aux))/2; end endGuardaremos esta función en un fichero llamado 'aproxEulermej.m'. Piensa cómo se ejecuta esta función para que aproxime la solución del problema durante el primer minuto, cada segundo. Pulsa en 'Continuar' cuando lo tengas.
est1=aproxEulermej(f,1,0,0,60)siempre que tengamos ya definida la función 'f'. Podemos añadir esa línea en el fichero utilizado en el apartado anterior, cuando se estimó la solución mediante 'ode45' y completarlo con la representación de la gráfica de la nueva estimación; si calculamos la estimación por Euler mejorado antes de dibujar la estimada con 'ode45' podemos representarlas juntas con un mismo 'plot':
f=@(t,n) 1.4-0.04*n^2/(4+t); % definición de la función de la edo [vt,nest]=ode45(f,0:60,0); % aproximación durante el primer minuto, cada segundo nest1=aproxEulermej(f,1,0,0,60) % estimación con Euler mejorado, h=1 plot(vt,nest,vt,nest1) % representación de las estimaciones frente al tiempo xlabel('tiempo (seg)');ylabel('sustancia A (moles)') % etiquetas de los ejesPodemos comparar alguna de estas aproximaciones: con 'ode45' el valor estimado para $n(60)$ es $40.3422$ mientras que con Euler mejorado, paso $h=1$, es $40.3405$.
f=@(t,n) 1.4-0.04*n^2/(4+t); % definición de la función de la edo nest4=aproxEulermej(f,4,0,0,60) % estimación con Euler mejorado, h=4 nest2=aproxEulermej(f,2,0,0,60) % estimación con Euler mejorado, h=2 nest1=aproxEulermej(f,1,0,0,60) % estimación con Euler mejorado, h=1 nest05=aproxEulermej(f,.5,0,0,60); % estimación con Euler mejorado, h=0.5 valores=[nest4(end) nest2(end) nest1(end) nest05(end)] plot(60,valores,'*') % representación de las estimaciones frente al tiempo xlabel('tiempo (seg)');ylabel('sustancia A (moles)') % etiquetas de los ejes
valores = 40.3126 40.3354 40.3405 40.3418y en la de figuras,
f=@(t,n) 1.4-0.04*n^2/(4+t); h=4;
nest=aproxEulermej(f,h,0,0,60);
nest(end)
diferencia=.1;
while diferencia>10^(-4)
h=h/2;
nestsig=aproxEulermej(f,h,0,0,60);
nestsig(end)
diferencia=abs(nest(end)-nestsig(end))
nest=nestsig;
end hEl contenido del fichero es por tanto,
f=@(t,n) 1.4-0.04*n^2/(4+t); h=4; nest=aproxEulermej(f,h,0,0,60); nest(end) diferencia=.1; while diferencia>10^(-4) h=h/2; nestsig=aproxEulermej(f,h,0,0,60); nestsig(end) diferencia=abs(nest(end)-nestsig(end)) nest=nestsig; end hFaltaría añadirle los comentarios iniciales que expliquen qué es lo que se calcula y los convenientes comentarios de cada línea. Cuando se ejecute se obtendrán por pantalla seis sucesivas aproximaciones de $n(60)$, las correspondientes a $h=4$, $h=2$, $h=1$, $h=.5$, $h=.25$ y $h=0.125$. La diferencia entre las dos últimas es
7.4239e-005Por tanto el paso buscado es $h=0.125$.