//****************************************************************
//
//  Resolucion de Sistema de Ecuaciones Diferenciales Ordinarias
//
//****************************************************************
//  Problemas de condicion inicial
//****************************************************************
//
// Resolver el sgte. sistema de ecuaciones diferenciales
//
//  x' = y               -- Ec. Diferencial
//  y' = -x + 6*cos(t)
//  x(0) = 2             -- Condicion Inicial
//  y(0) = 3
//  t = [0,10]           -- Tiempo de resolucion
//*******************************************************
// En general z' = f(t,z)   
// Como estamos resolviendo un sistema de ecuaciones
// z se trata de un vector z =[x y]
// en la primera componente se guarda el valor de x
// en la segunda componente se guarda el valor de y
//
// Met. de Euler: 
//      z(k+1) = z(k) + h * f(t,z)
//

//*******************************************************

clear


// Condiciones iniciales
z_inicial = [2 3];
z_euler = z_inicial;

a= 0;    // Tiempo inicial
b= 10;   // Tiempo final

// Probar con diferentes valores de paso
//h = 0.5;
//h = 0.25;
//h = 0.05;
h = 0.01;

n = (b-a)/h;   // Numero de pasos

getf('derivada_sistema.sci');    // Cargando la funcion donde se calcula la derivada

t_sim(1) = a;

// Resolviendo usando el Met. de Euler
for i=1:n
    z_euler(i+1,:) = z_euler(i,:) + h*derivada_sistema(t_sim(i),z_euler(i,:));
    t_sim(i+1) = t_sim(i) + h;
end


// Utilizando ahora la funcion de Scilab

y_sci=ode("rk",z_inicial,a,t_sim,derivada_sistema)  


// Generando la solucion real (generalmente no conocida)(usada en este caso solo con fines de comparacion)
t = t_sim;
x_real = 2*cos(t)+3*sin(t)+3*t.*sin(t);
y_real = -2*sin(t)+3*cos(t)+3*sin(t)+3*t.*cos(t);


// Graficando los resultados
xset('window',1)
plot2d(t_sim,[x_real z_euler(:,1)],[2,3],leg="Real@Euler")
xtitle('Grafico x')

xset('window',2)
plot2d(t_sim,[y_real z_euler(:,2)],[2,3],leg="Real@Euler")
xtitle('Grafico y')

