En este documento se comparan los métodos de Euler, Runge-Kutta 4 y la función ODE45 de MATLAB para la solución aproximada de ecuaciones diferenciales ordinarias con distintos pasos de integración.
Solución de Ecuaciones Diferenciales Ordinarias por los Métodos de Euler, Runge-Kutta 4 y la Función de MATLAB ODE45 (Comparativa)
1. Carlos A. Aguilar A. Control de Maquinas Eléctricas Tarea1-30/01/2012
Métodos Numéricos para la Solución de Ecuaciones Diferenciales
Método de Euler
El método de Euler, es un procedimiento numérico de primer orden para resolver ecuaciones
diferenciales ordinarias con un valor inicial dado. Es el más básico de los métodos explícitos para la
integración numérica de ecuaciones diferenciales ordinarias, y es la forma más simple del método
de Runge-Kutta
Busca aproximar la solución del problema de valor inicial, usando los dos primeros términos de la
expansión de Taylor de la función , basándose en el estimado del próximo valor de después de
un tiempo de integración o paso de integración .
Método de Runge-Kutta
Procedimiento numérico que, al igual que el de Euler, sirve para resolver ecuaciones diferenciales
ordinarias con un valor inicial dado.
Sea un problema de valor inicial
La solución de este problema está dada por
donde yn + 1 es la aproximación de y(tn + 1), y
1
2. Carlos A. Aguilar A. Control de Maquinas Eléctricas Tarea1-30/01/2012
A continuación se presenta el código en MATLAB con el cual es posible resolver por los métodos
de Euler, Runge-Kutta y la función ODE45 con pasos de integración de 0.1, 0.01 y 0.001 la siguiente
ecuación: A)
Código para la solución de la ecuación “A” por los métodos de Euler, Runge-Kutta 4 y la función
ODE45.
Nota: Esta función (las siguientes 2 líneas de código) se debe escribir en un m-file aparte y
nombrarlo “vdp2.m”, el cual se debe encontrar en la misma carpeta que el otro m-file con el resto
del programa.
function x = vdp(t,y)
x=[y(2); 2*(1-y(1)^2)*y(2)-y(1)+2*sin(3*t)];
clc
clear all
%Propiedades del analisis discreto
a=0;b=20;h=0.01; %Variar el paso e intervalo de integracion aqui
%Declaracion de vectores
t=a:h:b;x1=a:h:b;x2=a:h:b;
%Condiciones iniciales y constantes dadas
u=2;A=2;w=3;x1(1)=2;x2(1)=0;
%Calculo de la solucion aproximada por el metodo de Euler
for n=2:((b-a)/h)+1
x1(n)=x1(n-1)+h*(x2(n-1));
x2(n)=x2(n-1)+h*(u*(1-x1(n-1)^2)*x2(n-1)-x1(n-1)+A*sin(w*t(n-1)));
end
hold on
plot(t,x1,'r--')
%Calculo de la solucion aproximada por el metodo de Runge-Kutta 4
for n=2:((b-a)/h)+1
k1=h*x2(n-1);
l1=h*[u*(1-x1(n-1)^2)*x2(n-1)-x1(n-1)+A*sin(w*t(n-1))];
k2=h*(x2(n-1)+(1/2)*l1);
l2=h*[u*(1-(x1(n-1)+(1/2)*k1)^2)*(x2(n-1)+(1/2)*l1)-(x1(n-
1)+(1/2)*k1)+A*sin(w*(t(n-1)+(1/2)*h))];
k3=h*[x2(n-1)+(1/2)*l2];
l3=h*[u*(1-(x1(n-1)+(1/2)*k2)^2)*(x2(n-1)+(1/2)*l2)-(x1(n-
1)+(1/2)*k2)+A*sin(w*(t(n-1)+(1/2)*h))];
k4=h*(x2(n-1)+l3);
l4=h*[u*(1-(x1(n-1)+k3)^2)*(x2(n-1)+l3)-(x1(n-1)+k3)+A*sin(w*(t(n-1)+h))];
x1(n)=x1(n-1)+(1/6)*(k1+2*k2+2*k3+k4);
x2(n)=x2(n-1)+(1/6)*(l1+2*l2+2*l3+l4);
end
plot(t,x1,'k:')
%Calculo de la solucion aproximada usando la funcion ODE45 que corresponde
%al me metodo de Runge-Kutta(4,5) de paso adaptativo
options = odeset('InitialStep',h,'MaxStep',h);
[t,y] = ode45(@vdp,[a,b],[x1(1); x2(1)],options);
plot(t,y(:,1))
%Etiquetado y leyendas en la grafica
legend('Euler','RK4','ODE45')
title(['SOLUCION APROXIMADA DE LA ECUACION "A" h=',num2str(h),' seg'])
xlabel('TIEMPO(t)')
ylabel('SOLUCION(x)')
2
3. Carlos A. Aguilar A. Control de Maquinas Eléctricas Tarea1-30/01/2012
Graficas de la solución de “A” por los métodos de Euler, Runge-Kutta 4 y la función ODE45 para
distintos pasos de integración:
3
4. Carlos A. Aguilar A. Control de Maquinas Eléctricas Tarea1-30/01/2012
4
5. Carlos A. Aguilar A. Control de Maquinas Eléctricas Tarea1-30/01/2012
A continuación se presenta el código en MATLAB con el cual es posible resolver por los métodos
de Euler, Runge-Kutta y la función ODE45 con pasos de integración de 0.1, 0.01 y 0.001 la siguiente
ecuación: B)
Código para la solución de la ecuación “B” por los métodos de Euler, Runge-Kutta 4 y la función
ODE45.
Nota: Esta función (las siguientes 2 líneas de código) se debe escribir en un m-file aparte y
nombrarlo “vdp2.m”, el cual se debe encontrar en la misma carpeta que el otro m-file con el resto
del programa.
function x = vdp2(t,y)
x=[y(2); 2*(1-y(1)^2)*y(2)-y(1)];
clc
clear all
%Propiedades del analisis discreto
a=0;b=20;h=0.1; %Variar el paso e intervalo de integracion aqui
%Declaracion de vectores
t=a:h:b;x1=a:h:b;x2=a:h:b;
%Condiciones iniciales y constantes dadas
u=2;A=2;w=3;x1(1)=2;x2(1)=0;
%Calculo de la solucion aproximada por el metodo de Euler
for n=2:((b-a)/h)+1
x1(n)=x1(n-1)+h*(x2(n-1));
x2(n)=x2(n-1)+h*(u*(1-x1(n-1)^2)*x2(n-1)-x1(n-1));
end
hold on
plot(t,x1,'r--')
%Calculo de la solucion aproximada por el metodo de Runge-Kutta 4
for n=2:((b-a)/h)+1
k1=h*x2(n-1);
l1=h*[u*(1-x1(n-1)^2)*x2(n-1)-x1(n-1)];
k2=h*(x2(n-1)+(1/2)*l1);
l2=h*[u*(1-(x1(n-1)+(1/2)*k1)^2)*(x2(n-1)+(1/2)*l1)-(x1(n-1)+(1/2)*k1)];
k3=h*[x2(n-1)+(1/2)*l2];
l3=h*[u*(1-(x1(n-1)+(1/2)*k2)^2)*(x2(n-1)+(1/2)*l2)-(x1(n-1)+(1/2)*k2)];
k4=h*(x2(n-1)+l3);
l4=h*[u*(1-(x1(n-1)+k3)^2)*(x2(n-1)+l3)-(x1(n-1)+k3)];
x1(n)=x1(n-1)+(1/6)*(k1+2*k2+2*k3+k4);
x2(n)=x2(n-1)+(1/6)*(l1+2*l2+2*l3+l4);
end
plot(t,x1,'k:')
%Calculo de la solucion aproximada usando la funcion ODE45 que corresponde
%al me metodo de Runge-Kutta(4,5) de paso adaptativo
options = odeset('InitialStep',h,'MaxStep',h);
[t,y] = ode45(@vdp2,[a,b],[x1(1); x2(1)],options);
plot(t,y(:,1))
%Etiquetado y leyendas en la grafica
legend('Euler','RK4','ODE45')
title(['SOLUCION APROXIMADA DE LA ECUACION "B" h=',num2str(h),' seg'])
xlabel('TIEMPO(t)')
ylabel('SOLUCION(x)')
5
6. Carlos A. Aguilar A. Control de Maquinas Eléctricas Tarea1-30/01/2012
Graficas de la solución de “B” por los métodos de Euler, Runge-Kutta 4 y la función ODE45 para
distintos pasos de integración:
6
7. Carlos A. Aguilar A. Control de Maquinas Eléctricas Tarea1-30/01/2012
7