// Ejemplito de metodos numericos para ecuaciones diferenciales ordinarias

function yy=f(t,y)
yy = y - t * t + 1;
endfunction


N  = 10; // Particion 
t0 = 0.0; // Tiempo inicial
t1 = 2.0; // Tiempo final
ci = 0.5; // Condicion inicial al tiempo t0


h = (t1 - t0) / N; // incremento en el tiempo
t = t0; // Asigna el tiempo inicial

// Asigna la condicion inicial 
e  = ci; // Para Euler
pm = ci; // Para Punto medio
em = ci; // Para Euler modificado
mh = ci; // Para Heun

// Solo para graficar
xgrid
X = zeros(11,1);
Y = zeros(11,1);
Ye = zeros(11,1);
X(1) = t;
Y(1) = ci;
Ye(1) = ci;

// Calculo de las soluciones
for i=1:N 
   tiempo = t+h // Solo para la visualizacion
   X(i+1) = tiempo; // tiempo para graficar

   e  = e + h * f(t,e)  // Euler
   pm = pm + h * f(t + (h/2.0), pm + (h/2.0)* f(t,pm)) // Punto medio 
   em = em + (h/2.0)*(f(t,em)+ f(t + h, em + h * f(t,em))) // Euler modificado
   mh = mh + (h/4.0)*(f(t,mh)+ 3.0*f(t+(2./3.0)*h,mh+(2.0/3.0)*h*f(t,mh))) // Heun
   
   Y(i+1) = e; // evolucion para graficar

   t = t0 + i * h; // Calcula en paso en el tiempo
   exacta = (t+1)^2 - 0.5*exp(t) // Calcula la solucion exacta al tiempo t
   Ye(i+1) = exacta; // evolucion exacta para graficar
end

// Grafica la solucion
plot2d(X,Ye,5) // Exacta
plot2d(X,Y,3)  // Calculada
 

